test_cpp_bin_float.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. // Copyright John Maddock 2013.
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #ifdef _MSC_VER
  7. #define _SCL_SECURE_NO_WARNINGS
  8. #endif
  9. #include <boost/multiprecision/cpp_bin_float.hpp>
  10. #ifdef TEST_MPFR
  11. #include <boost/multiprecision/mpfr.hpp>
  12. #endif
  13. #include <boost/random/mersenne_twister.hpp>
  14. #include <boost/random/uniform_int.hpp>
  15. #include "libs/multiprecision/test/test.hpp"
  16. #include <iostream>
  17. #include <iomanip>
  18. template <class T>
  19. T generate_random()
  20. {
  21. typedef int e_type;
  22. static boost::random::mt19937 gen;
  23. T val = gen();
  24. T prev_val = -1;
  25. while (val != prev_val)
  26. {
  27. val *= (gen.max)();
  28. prev_val = val;
  29. val += gen();
  30. }
  31. e_type e;
  32. val = frexp(val, &e);
  33. static boost::random::uniform_int_distribution<e_type> ui(-20, 20);
  34. return ldexp(val, ui(gen));
  35. }
  36. using namespace boost::multiprecision;
  37. #ifdef TEST_MPFR
  38. typedef number<mpfr_float_backend<35> > good_type;
  39. #else
  40. typedef double good_type;
  41. #endif
  42. typedef number<cpp_bin_float<std::numeric_limits<good_type>::digits, digit_base_2>, et_off> test_type;
  43. void test_special_cases()
  44. {
  45. test_type max_val = (std::numeric_limits<test_type>::max)();
  46. test_type min_val = (std::numeric_limits<test_type>::min)();
  47. test_type eps = std::numeric_limits<test_type>::epsilon();
  48. test_type inf_val = (std::numeric_limits<test_type>::infinity)();
  49. test_type nan_val = (std::numeric_limits<test_type>::quiet_NaN)();
  50. test_type half = 0.5;
  51. test_type one_point_5 = 1.5;
  52. BOOST_CHECK((boost::math::isnormal)(max_val));
  53. BOOST_CHECK((boost::math::isnormal)(-max_val));
  54. BOOST_CHECK((boost::math::isnormal)(min_val));
  55. BOOST_CHECK((boost::math::isnormal)(-min_val));
  56. BOOST_CHECK((boost::math::isinf)(inf_val));
  57. BOOST_CHECK((boost::math::isinf)(-inf_val));
  58. BOOST_CHECK((boost::math::isnan)(nan_val));
  59. BOOST_CHECK((boost::math::isnan)(-nan_val));
  60. if (std::numeric_limits<test_type>::has_denorm)
  61. min_val = std::numeric_limits<test_type>::denorm_min();
  62. // Adding epsilon will increment 1.0:
  63. BOOST_CHECK(test_type(1) + eps != test_type(1));
  64. BOOST_CHECK(test_type(1) + eps / 2 == test_type(1));
  65. // But it's not the smallest value that will do that:
  66. test_type small = 1 + eps;
  67. small = ldexp(small, -std::numeric_limits<test_type>::digits);
  68. BOOST_CHECK(test_type(1) + small != test_type(1));
  69. // And if we increment 1.0 first, then an even smaller
  70. // addition will round up:
  71. test_type one_next = test_type(1) + eps;
  72. BOOST_CHECK(one_next + eps / 2 != one_next);
  73. // Overflow:
  74. BOOST_CHECK_EQUAL(max_val + max_val * eps, inf_val);
  75. BOOST_CHECK_EQUAL(-max_val - max_val * eps, -inf_val);
  76. BOOST_CHECK_EQUAL(max_val * 2, inf_val);
  77. BOOST_CHECK_EQUAL(max_val * -2, -inf_val);
  78. BOOST_CHECK_EQUAL(max_val / half, inf_val);
  79. BOOST_CHECK_EQUAL(max_val / -half, -inf_val);
  80. BOOST_CHECK_EQUAL(max_val / min_val, inf_val);
  81. BOOST_CHECK_EQUAL(max_val / -min_val, -inf_val);
  82. // Underflow:
  83. BOOST_CHECK_EQUAL(min_val * 2 - one_point_5 * min_val, 0);
  84. BOOST_CHECK_EQUAL(-min_val * 2 + one_point_5 * min_val, 0);
  85. BOOST_CHECK_EQUAL(min_val / 2, 0);
  86. BOOST_CHECK_EQUAL(min_val / max_val, 0);
  87. BOOST_CHECK_EQUAL(min_val * half, 0);
  88. BOOST_CHECK_EQUAL(min_val - min_val, 0);
  89. BOOST_CHECK_EQUAL(max_val - max_val, 0);
  90. BOOST_CHECK_EQUAL(-min_val + min_val, 0);
  91. BOOST_CHECK_EQUAL(-max_val + max_val, 0);
  92. // Things which should not over/underflow:
  93. BOOST_CHECK_EQUAL((min_val * 2) / 2, min_val);
  94. BOOST_CHECK_EQUAL((max_val / 2) * 2, max_val);
  95. BOOST_CHECK_GE((min_val * 2.0000001) / 1.9999999999999999, min_val);
  96. BOOST_CHECK_LE((max_val / 2.0000001) * 1.9999999999999999, max_val);
  97. BOOST_CHECK_EQUAL(min_val * 2 - min_val, min_val);
  98. BOOST_CHECK_EQUAL(max_val / 2 + max_val / 2, max_val);
  99. // Things involving zero:
  100. BOOST_CHECK_EQUAL(max_val + 0, max_val);
  101. BOOST_CHECK_EQUAL(max_val - 0, max_val);
  102. BOOST_CHECK_EQUAL(0 + max_val, max_val);
  103. BOOST_CHECK_EQUAL(0 - max_val, -max_val);
  104. BOOST_CHECK_EQUAL(max_val * 0, 0);
  105. BOOST_CHECK_EQUAL(0 * max_val, 0);
  106. BOOST_CHECK_EQUAL(max_val / 0, inf_val);
  107. BOOST_CHECK_EQUAL(0 / max_val, 0);
  108. BOOST_CHECK_EQUAL(-max_val / 0, -inf_val);
  109. BOOST_CHECK_EQUAL(0 / -max_val, 0);
  110. // Things involving infinity:
  111. BOOST_CHECK_EQUAL(inf_val + 2, inf_val);
  112. BOOST_CHECK_EQUAL(inf_val - 2, inf_val);
  113. BOOST_CHECK_EQUAL(inf_val + -2, inf_val);
  114. BOOST_CHECK_EQUAL(inf_val - -2, inf_val);
  115. BOOST_CHECK_EQUAL(-inf_val + 2, -inf_val);
  116. BOOST_CHECK_EQUAL(-inf_val - 2, -inf_val);
  117. BOOST_CHECK_EQUAL(-inf_val + -2, -inf_val);
  118. BOOST_CHECK_EQUAL(-inf_val - -2, -inf_val);
  119. BOOST_CHECK_EQUAL(2 + inf_val, inf_val);
  120. BOOST_CHECK_EQUAL(2 - inf_val, -inf_val);
  121. BOOST_CHECK_EQUAL(-2 + inf_val, inf_val);
  122. BOOST_CHECK_EQUAL(-2 - inf_val, -inf_val);
  123. BOOST_CHECK_EQUAL(2 + (-inf_val), -inf_val);
  124. BOOST_CHECK_EQUAL(2 - (-inf_val), inf_val);
  125. BOOST_CHECK_EQUAL(-2 + (-inf_val), -inf_val);
  126. BOOST_CHECK_EQUAL(-2 - (-inf_val), inf_val);
  127. BOOST_CHECK_EQUAL(sqrt(inf_val), inf_val);
  128. BOOST_CHECK(boost::math::isnan(sqrt(-inf_val)));
  129. BOOST_CHECK_EQUAL(inf_val + test_type(2), inf_val);
  130. BOOST_CHECK_EQUAL(inf_val - test_type(2), inf_val);
  131. BOOST_CHECK_EQUAL(inf_val + test_type(-2), inf_val);
  132. BOOST_CHECK_EQUAL(inf_val - test_type(-2), inf_val);
  133. BOOST_CHECK_EQUAL(-inf_val + test_type(2), -inf_val);
  134. BOOST_CHECK_EQUAL(-inf_val - test_type(2), -inf_val);
  135. BOOST_CHECK_EQUAL(-inf_val + test_type(-2), -inf_val);
  136. BOOST_CHECK_EQUAL(-inf_val - test_type(-2), -inf_val);
  137. BOOST_CHECK_EQUAL(test_type(2) + inf_val, inf_val);
  138. BOOST_CHECK_EQUAL(test_type(2) - inf_val, -inf_val);
  139. BOOST_CHECK_EQUAL(test_type(-2) + inf_val, inf_val);
  140. BOOST_CHECK_EQUAL(test_type(-2) - inf_val, -inf_val);
  141. BOOST_CHECK_EQUAL(test_type(2) + (-inf_val), -inf_val);
  142. BOOST_CHECK_EQUAL(test_type(2) - (-inf_val), inf_val);
  143. BOOST_CHECK_EQUAL(test_type(-2) + (-inf_val), -inf_val);
  144. BOOST_CHECK_EQUAL(test_type(-2) - (-inf_val), inf_val);
  145. BOOST_CHECK((boost::math::isnan)(inf_val - inf_val));
  146. BOOST_CHECK_EQUAL(inf_val * 2, inf_val);
  147. BOOST_CHECK_EQUAL(-inf_val * 2, -inf_val);
  148. BOOST_CHECK_EQUAL(inf_val * -2, -inf_val);
  149. BOOST_CHECK_EQUAL(-inf_val * -2, inf_val);
  150. BOOST_CHECK_EQUAL(inf_val * test_type(-2), -inf_val);
  151. BOOST_CHECK_EQUAL(-inf_val * test_type(-2), inf_val);
  152. BOOST_CHECK((boost::math::isnan)(inf_val * 0));
  153. BOOST_CHECK((boost::math::isnan)(-inf_val * 0));
  154. BOOST_CHECK_EQUAL(inf_val / 2, inf_val);
  155. BOOST_CHECK_EQUAL(-inf_val / 2, -inf_val);
  156. BOOST_CHECK_EQUAL(inf_val / -2, -inf_val);
  157. BOOST_CHECK_EQUAL(-inf_val / -2, inf_val);
  158. BOOST_CHECK_EQUAL(inf_val / test_type(-2), -inf_val);
  159. BOOST_CHECK_EQUAL(-inf_val / test_type(-2), inf_val);
  160. BOOST_CHECK_EQUAL(inf_val / 0, inf_val);
  161. BOOST_CHECK_EQUAL(-inf_val / 0, -inf_val);
  162. BOOST_CHECK((boost::math::isnan)(inf_val / inf_val));
  163. BOOST_CHECK((boost::math::isnan)(-inf_val / inf_val));
  164. // Things involving nan:
  165. BOOST_CHECK((boost::math::isnan)(nan_val + 2));
  166. BOOST_CHECK((boost::math::isnan)(nan_val - 2));
  167. BOOST_CHECK((boost::math::isnan)(nan_val + 0));
  168. BOOST_CHECK((boost::math::isnan)(nan_val - 0));
  169. BOOST_CHECK((boost::math::isnan)(nan_val + inf_val));
  170. BOOST_CHECK((boost::math::isnan)(nan_val - inf_val));
  171. BOOST_CHECK((boost::math::isnan)(nan_val + nan_val));
  172. BOOST_CHECK((boost::math::isnan)(nan_val - nan_val));
  173. BOOST_CHECK((boost::math::isnan)(2 + nan_val));
  174. BOOST_CHECK((boost::math::isnan)(2 - nan_val));
  175. BOOST_CHECK((boost::math::isnan)(0 - nan_val));
  176. BOOST_CHECK((boost::math::isnan)(0 - nan_val));
  177. BOOST_CHECK((boost::math::isnan)(inf_val + nan_val));
  178. BOOST_CHECK((boost::math::isnan)(inf_val - nan_val));
  179. BOOST_CHECK((boost::math::isnan)(nan_val * 2));
  180. BOOST_CHECK((boost::math::isnan)(nan_val / 2));
  181. BOOST_CHECK((boost::math::isnan)(nan_val * 0));
  182. BOOST_CHECK((boost::math::isnan)(nan_val / 0));
  183. BOOST_CHECK((boost::math::isnan)(nan_val * inf_val));
  184. BOOST_CHECK((boost::math::isnan)(nan_val / inf_val));
  185. BOOST_CHECK((boost::math::isnan)(nan_val * nan_val));
  186. BOOST_CHECK((boost::math::isnan)(nan_val / nan_val));
  187. BOOST_CHECK((boost::math::isnan)(2 * nan_val));
  188. BOOST_CHECK((boost::math::isnan)(2 / nan_val));
  189. BOOST_CHECK((boost::math::isnan)(0 / nan_val));
  190. BOOST_CHECK((boost::math::isnan)(0 / nan_val));
  191. BOOST_CHECK((boost::math::isnan)(inf_val * nan_val));
  192. BOOST_CHECK((boost::math::isnan)(inf_val / nan_val));
  193. // Corner cases:
  194. BOOST_CHECK_EQUAL((max_val * half) / half, max_val);
  195. BOOST_CHECK_EQUAL((max_val / 2) * 2, max_val);
  196. BOOST_CHECK_EQUAL((min_val / half) * half, min_val);
  197. BOOST_CHECK_EQUAL((min_val * 2) / 2, min_val);
  198. BOOST_CHECK_EQUAL(max_val + min_val, max_val);
  199. BOOST_CHECK_EQUAL(min_val + max_val, max_val);
  200. BOOST_CHECK_EQUAL(max_val - min_val, max_val);
  201. BOOST_CHECK_EQUAL(min_val - max_val, -max_val);
  202. // Signed zeros:
  203. BOOST_CHECK(boost::math::signbit(min_val * -min_val));
  204. BOOST_CHECK(boost::math::signbit(min_val * min_val) == 0);
  205. BOOST_CHECK(boost::math::signbit(-min_val * -min_val) == 0);
  206. BOOST_CHECK(boost::math::signbit(-min_val * min_val));
  207. BOOST_CHECK(boost::math::signbit(min_val / max_val) == 0);
  208. BOOST_CHECK(boost::math::signbit(min_val / -max_val));
  209. BOOST_CHECK(boost::math::signbit(-min_val / -max_val) == 0);
  210. BOOST_CHECK(boost::math::signbit(-min_val / max_val));
  211. BOOST_CHECK(boost::math::signbit(min_val / 2) == 0);
  212. BOOST_CHECK(boost::math::signbit(min_val / -2));
  213. BOOST_CHECK(boost::math::signbit(-min_val / -2) == 0);
  214. BOOST_CHECK(boost::math::signbit(-min_val / 2));
  215. test_type neg_zero = min_val * -min_val;
  216. test_type zero = 0;
  217. // Arithmetic involving signed zero:
  218. BOOST_CHECK_EQUAL(-neg_zero, 0);
  219. BOOST_CHECK(!boost::math::signbit(-neg_zero));
  220. BOOST_CHECK_EQUAL(neg_zero + 2, 2);
  221. BOOST_CHECK_EQUAL(neg_zero + test_type(2), 2);
  222. BOOST_CHECK_EQUAL(2 + neg_zero, 2);
  223. BOOST_CHECK_EQUAL(test_type(2) + neg_zero, 2);
  224. BOOST_CHECK_EQUAL(neg_zero + -2, -2);
  225. BOOST_CHECK_EQUAL(neg_zero + test_type(-2), -2);
  226. BOOST_CHECK_EQUAL(-2 + neg_zero, -2);
  227. BOOST_CHECK_EQUAL(test_type(-2) + neg_zero, -2);
  228. BOOST_CHECK_EQUAL(neg_zero - 2, -2);
  229. BOOST_CHECK_EQUAL(neg_zero - test_type(2), -2);
  230. BOOST_CHECK_EQUAL(2 - neg_zero, 2);
  231. BOOST_CHECK_EQUAL(test_type(2) - neg_zero, 2);
  232. BOOST_CHECK_EQUAL(neg_zero - -2, 2);
  233. BOOST_CHECK_EQUAL(neg_zero - test_type(-2), 2);
  234. BOOST_CHECK_EQUAL(-2 - neg_zero, -2);
  235. BOOST_CHECK_EQUAL(test_type(-2) - neg_zero, -2);
  236. BOOST_CHECK(!boost::math::signbit(test_type(2) + test_type(-2)));
  237. BOOST_CHECK(!boost::math::signbit(test_type(2) - test_type(2)));
  238. BOOST_CHECK(!boost::math::signbit(test_type(-2) - test_type(-2)));
  239. BOOST_CHECK(!boost::math::signbit(test_type(-2) + test_type(2)));
  240. BOOST_CHECK(!boost::math::signbit(zero + zero));
  241. BOOST_CHECK(!boost::math::signbit(zero - zero));
  242. BOOST_CHECK(!boost::math::signbit(neg_zero + zero));
  243. BOOST_CHECK(!boost::math::signbit(zero + neg_zero));
  244. BOOST_CHECK(boost::math::signbit(neg_zero + neg_zero));
  245. BOOST_CHECK(boost::math::signbit(neg_zero - zero));
  246. BOOST_CHECK(!boost::math::signbit(zero - neg_zero));
  247. BOOST_CHECK(!boost::math::signbit(neg_zero - neg_zero));
  248. small = 0.25;
  249. BOOST_CHECK(!boost::math::signbit(floor(small)));
  250. BOOST_CHECK(!boost::math::signbit(round(small)));
  251. BOOST_CHECK(!boost::math::signbit(trunc(small)));
  252. small = -small;
  253. BOOST_CHECK(boost::math::signbit(ceil(small)));
  254. BOOST_CHECK(boost::math::signbit(round(small)));
  255. BOOST_CHECK(boost::math::signbit(trunc(small)));
  256. BOOST_CHECK_EQUAL(neg_zero * 2, 0);
  257. BOOST_CHECK_EQUAL(neg_zero * test_type(2), 0);
  258. BOOST_CHECK_EQUAL(2 * neg_zero, 0);
  259. BOOST_CHECK_EQUAL(test_type(2) * neg_zero, 0);
  260. BOOST_CHECK_EQUAL(neg_zero * -2, 0);
  261. BOOST_CHECK_EQUAL(neg_zero * test_type(-2), 0);
  262. BOOST_CHECK_EQUAL(-2 * neg_zero, 0);
  263. BOOST_CHECK_EQUAL(test_type(-2) * neg_zero, 0);
  264. BOOST_CHECK(boost::math::signbit(neg_zero * 2));
  265. BOOST_CHECK(boost::math::signbit(neg_zero * test_type(2)));
  266. BOOST_CHECK(boost::math::signbit(2 * neg_zero));
  267. BOOST_CHECK(boost::math::signbit(test_type(2) * neg_zero));
  268. BOOST_CHECK(!boost::math::signbit(neg_zero * -2));
  269. BOOST_CHECK(!boost::math::signbit(neg_zero * test_type(-2)));
  270. BOOST_CHECK(!boost::math::signbit(-2 * neg_zero));
  271. BOOST_CHECK(!boost::math::signbit(test_type(-2) * neg_zero));
  272. BOOST_CHECK_EQUAL(neg_zero / 2, 0);
  273. BOOST_CHECK_EQUAL(neg_zero / test_type(2), 0);
  274. BOOST_CHECK_EQUAL(2 / neg_zero, -inf_val);
  275. BOOST_CHECK_EQUAL(test_type(2) / neg_zero, -inf_val);
  276. BOOST_CHECK_EQUAL(neg_zero / -2, 0);
  277. BOOST_CHECK_EQUAL(neg_zero / test_type(-2), 0);
  278. BOOST_CHECK_EQUAL(-2 / neg_zero, inf_val);
  279. BOOST_CHECK_EQUAL(test_type(-2) / neg_zero, inf_val);
  280. BOOST_CHECK(boost::math::signbit(neg_zero / 2));
  281. BOOST_CHECK(boost::math::signbit(neg_zero / test_type(2)));
  282. BOOST_CHECK(boost::math::signbit(2 / neg_zero));
  283. BOOST_CHECK(boost::math::signbit(test_type(2) / neg_zero));
  284. BOOST_CHECK(!boost::math::signbit(neg_zero / -2));
  285. BOOST_CHECK(!boost::math::signbit(neg_zero / test_type(-2)));
  286. BOOST_CHECK(!boost::math::signbit(-2 / neg_zero));
  287. BOOST_CHECK(!boost::math::signbit(test_type(-2) / neg_zero));
  288. BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<double>()));
  289. BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<float>()));
  290. BOOST_CHECK(boost::math::signbit(neg_zero.convert_to<long double>()));
  291. BOOST_CHECK(!boost::math::signbit(zero.convert_to<double>()));
  292. BOOST_CHECK(!boost::math::signbit(zero.convert_to<float>()));
  293. BOOST_CHECK(!boost::math::signbit(zero.convert_to<long double>()));
  294. // Conversions to other types of special values:
  295. if (std::numeric_limits<float>::has_infinity)
  296. {
  297. BOOST_CHECK_EQUAL(inf_val.convert_to<float>(), std::numeric_limits<float>::infinity());
  298. BOOST_CHECK_EQUAL((-inf_val).convert_to<float>(), -std::numeric_limits<float>::infinity());
  299. }
  300. if (std::numeric_limits<float>::has_quiet_NaN)
  301. {
  302. BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<float>()));
  303. }
  304. if (std::numeric_limits<double>::has_infinity)
  305. {
  306. BOOST_CHECK_EQUAL(inf_val.convert_to<double>(), std::numeric_limits<double>::infinity());
  307. BOOST_CHECK_EQUAL((-inf_val).convert_to<double>(), -std::numeric_limits<double>::infinity());
  308. }
  309. if (std::numeric_limits<double>::has_quiet_NaN)
  310. {
  311. BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<double>()));
  312. }
  313. if (std::numeric_limits<long double>::has_infinity)
  314. {
  315. BOOST_CHECK_EQUAL(inf_val.convert_to<long double>(), std::numeric_limits<long double>::infinity());
  316. BOOST_CHECK_EQUAL((-inf_val).convert_to<long double>(), -std::numeric_limits<long double>::infinity());
  317. }
  318. if (std::numeric_limits<long double>::has_quiet_NaN)
  319. {
  320. BOOST_CHECK((boost::math::isnan)(nan_val.convert_to<long double>()));
  321. }
  322. //
  323. // Bug https://svn.boost.org/trac/boost/attachment/ticket/12580
  324. //
  325. using std::ldexp;
  326. test_type a(1);
  327. test_type b = ldexp(test_type(0.99), -std::numeric_limits<test_type>::digits);
  328. good_type ga(1);
  329. good_type gb = ldexp(good_type(0.99), -std::numeric_limits<good_type>::digits);
  330. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  331. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  332. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  333. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  334. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  335. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  336. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  337. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  338. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  339. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  340. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  341. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  342. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  343. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  344. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  345. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  346. b = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits);
  347. gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits);
  348. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  349. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  350. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  351. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  352. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  353. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  354. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  355. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  356. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  357. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  358. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  359. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  360. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  361. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  362. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  363. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  364. b = ldexp(test_type(1), -std::numeric_limits<test_type>::digits);
  365. gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits);
  366. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  367. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  368. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  369. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  370. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  371. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  372. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  373. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  374. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  375. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  376. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  377. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  378. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  379. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  380. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  381. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  382. b = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits);
  383. gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits);
  384. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  385. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  386. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  387. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  388. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  389. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  390. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  391. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  392. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  393. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  394. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  395. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  396. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  397. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  398. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  399. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  400. a = a + ldexp(a, -20);
  401. ga = ga + ldexp(ga, -20);
  402. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  403. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  404. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  405. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  406. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  407. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  408. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  409. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  410. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  411. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  412. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  413. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  414. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  415. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  416. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  417. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  418. b = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits);
  419. gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits);
  420. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  421. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  422. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  423. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  424. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  425. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  426. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  427. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  428. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  429. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  430. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  431. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  432. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  433. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  434. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  435. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  436. b = ldexp(test_type(1), -std::numeric_limits<test_type>::digits);
  437. gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits);
  438. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  439. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  440. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  441. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  442. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  443. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  444. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  445. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  446. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  447. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  448. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  449. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  450. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  451. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  452. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  453. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  454. b = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits);
  455. gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits);
  456. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  457. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  458. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  459. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  460. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  461. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  462. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  463. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  464. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  465. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  466. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  467. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  468. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  469. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  470. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  471. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  472. a = 1;
  473. a = boost::math::float_prior(a);
  474. ga = 1;
  475. ga = boost::math::float_prior(ga);
  476. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  477. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  478. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  479. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  480. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  481. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  482. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  483. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  484. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  485. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  486. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  487. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  488. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  489. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  490. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  491. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  492. b = ldexp(test_type(0.5), -std::numeric_limits<test_type>::digits);
  493. gb = ldexp(good_type(0.5), -std::numeric_limits<good_type>::digits);
  494. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  495. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  496. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  497. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  498. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  499. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  500. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  501. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  502. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  503. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  504. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  505. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  506. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  507. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  508. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  509. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  510. b = ldexp(test_type(1), -std::numeric_limits<test_type>::digits);
  511. gb = ldexp(good_type(1), -std::numeric_limits<good_type>::digits);
  512. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  513. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  514. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  515. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  516. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  517. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  518. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  519. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  520. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  521. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  522. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  523. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  524. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  525. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  526. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  527. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  528. b = ldexp(test_type(0.50000000001), -std::numeric_limits<test_type>::digits);
  529. gb = ldexp(good_type(0.50000000001), -std::numeric_limits<good_type>::digits);
  530. BOOST_CHECK_EQUAL(good_type(test_type(a - b)), good_type(ga - gb));
  531. BOOST_CHECK_EQUAL(good_type(test_type(b - a)), good_type(gb - ga));
  532. BOOST_CHECK_EQUAL(good_type(test_type(a + b)), good_type(ga + gb));
  533. BOOST_CHECK_EQUAL(good_type(test_type(b + a)), good_type(gb + ga));
  534. BOOST_CHECK_EQUAL(good_type(test_type(a - -b)), good_type(ga - -gb));
  535. BOOST_CHECK_EQUAL(good_type(test_type(b - -a)), good_type(gb - -ga));
  536. BOOST_CHECK_EQUAL(good_type(test_type(a + -b)), good_type(ga + -gb));
  537. BOOST_CHECK_EQUAL(good_type(test_type(b + -a)), good_type(gb + -ga));
  538. BOOST_CHECK_EQUAL(good_type(test_type(-a - b)), good_type(-ga - gb));
  539. BOOST_CHECK_EQUAL(good_type(test_type(-b - a)), good_type(-gb - ga));
  540. BOOST_CHECK_EQUAL(good_type(test_type(-a + b)), good_type(-ga + gb));
  541. BOOST_CHECK_EQUAL(good_type(test_type(-b + a)), good_type(-gb + ga));
  542. BOOST_CHECK_EQUAL(good_type(test_type(-a - -b)), good_type(-ga - -gb));
  543. BOOST_CHECK_EQUAL(good_type(test_type(-b - -a)), good_type(-gb - -ga));
  544. BOOST_CHECK_EQUAL(good_type(test_type(-a + -b)), good_type(-ga + -gb));
  545. BOOST_CHECK_EQUAL(good_type(test_type(-b + -a)), good_type(-gb + -ga));
  546. }
  547. int main()
  548. {
  549. test_special_cases();
  550. unsigned error_count = 0;
  551. for (unsigned i = 0; i < 100000; ++i)
  552. {
  553. good_type a = generate_random<good_type>();
  554. good_type b = generate_random<good_type>();
  555. test_type ta(a);
  556. test_type tb(b);
  557. BOOST_CHECK_EQUAL(test_type(a * b), ta * tb);
  558. BOOST_CHECK_EQUAL(test_type(-a * b), -ta * tb);
  559. BOOST_CHECK_EQUAL(test_type(a * -b), ta * -tb);
  560. BOOST_CHECK_EQUAL(test_type(-a * -b), -ta * -tb);
  561. BOOST_CHECK_EQUAL(test_type(a + b), ta + tb);
  562. BOOST_CHECK_EQUAL(test_type(-a + b), -ta + tb);
  563. BOOST_CHECK_EQUAL(test_type(a + -b), ta + -tb);
  564. BOOST_CHECK_EQUAL(test_type(-a + -b), -ta + -tb);
  565. BOOST_CHECK_EQUAL(test_type(a - b), ta - tb);
  566. BOOST_CHECK_EQUAL(test_type(-a - b), -ta - tb);
  567. BOOST_CHECK_EQUAL(test_type(a - -b), ta - -tb);
  568. BOOST_CHECK_EQUAL(test_type(-a - -b), -ta - -tb);
  569. BOOST_CHECK_EQUAL(test_type(a / b), ta / tb);
  570. BOOST_CHECK_EQUAL(test_type(-a / b), -ta / tb);
  571. BOOST_CHECK_EQUAL(test_type(a / -b), ta / -tb);
  572. BOOST_CHECK_EQUAL(test_type(-a / -b), -ta / -tb);
  573. BOOST_CHECK_EQUAL(test_type(sqrt(a)), sqrt(ta));
  574. BOOST_CHECK_EQUAL(test_type(floor(a)), floor(ta));
  575. BOOST_CHECK_EQUAL(test_type(floor(-a)), floor(-ta));
  576. BOOST_CHECK_EQUAL(test_type(ceil(a)), ceil(ta));
  577. BOOST_CHECK_EQUAL(test_type(ceil(-a)), ceil(-ta));
  578. #ifdef TEST_MPFR
  579. //
  580. // Conversions:
  581. //
  582. BOOST_CHECK_EQUAL(a.convert_to<double>(), ta.convert_to<double>());
  583. BOOST_CHECK_EQUAL(a.convert_to<float>(), ta.convert_to<float>());
  584. BOOST_CHECK_EQUAL(b.convert_to<double>(), tb.convert_to<double>());
  585. BOOST_CHECK_EQUAL(b.convert_to<float>(), tb.convert_to<float>());
  586. #else
  587. BOOST_CHECK_EQUAL(a, ta.convert_to<double>());
  588. BOOST_CHECK_EQUAL(static_cast<float>(a), ta.convert_to<float>());
  589. BOOST_CHECK_EQUAL(b, tb.convert_to<double>());
  590. BOOST_CHECK_EQUAL(static_cast<float>(b), tb.convert_to<float>());
  591. #endif
  592. static boost::random::mt19937 i_gen;
  593. int si = i_gen();
  594. BOOST_CHECK_EQUAL(test_type(a * si), ta * si);
  595. BOOST_CHECK_EQUAL(test_type(-a * si), -ta * si);
  596. BOOST_CHECK_EQUAL(test_type(-a * -si), -ta * -si);
  597. BOOST_CHECK_EQUAL(test_type(a * -si), ta * -si);
  598. unsigned ui = std::abs(si);
  599. BOOST_CHECK_EQUAL(test_type(a * ui), ta * ui);
  600. BOOST_CHECK_EQUAL(test_type(-a * ui), -ta * ui);
  601. // Divide:
  602. BOOST_CHECK_EQUAL(test_type(a / si), ta / si);
  603. BOOST_CHECK_EQUAL(test_type(-a / si), -ta / si);
  604. BOOST_CHECK_EQUAL(test_type(-a / -si), -ta / -si);
  605. BOOST_CHECK_EQUAL(test_type(a / -si), ta / -si);
  606. BOOST_CHECK_EQUAL(test_type(a / ui), ta / ui);
  607. BOOST_CHECK_EQUAL(test_type(-a / ui), -ta / ui);
  608. // Error reporting:
  609. if (boost::detail::test_errors() != error_count)
  610. {
  611. error_count = boost::detail::test_errors();
  612. std::cout << std::setprecision(std::numeric_limits<test_type>::max_digits10) << std::scientific;
  613. std::cout << "a (mpfr) = " << a << std::endl;
  614. std::cout << "a (test) = " << ta << std::endl;
  615. std::cout << "b (mpfr) = " << b << std::endl;
  616. std::cout << "b (test) = " << tb << std::endl;
  617. std::cout << "si = " << si << std::endl;
  618. std::cout << "ui = " << ui << std::endl;
  619. }
  620. }
  621. return boost::report_errors();
  622. }