bug-nextafter.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. #include <fenv.h>
  2. #include <math.h>
  3. #include <float.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <math-tests.h>
  7. #if !defined(FE_OVERFLOW) && !defined(FE_UNDERFLOW)
  8. /* If there's no support for the exceptions this test is checking,
  9. then just return success and allow the test to be compiled. */
  10. # define fetestexcept(e) 1
  11. #endif
  12. float zero = 0.0;
  13. float inf = INFINITY;
  14. int
  15. main (void)
  16. {
  17. int result = 0;
  18. float i = INFINITY;
  19. float m = FLT_MAX;
  20. feclearexcept (FE_ALL_EXCEPT);
  21. if (nextafterf (m, i) != i)
  22. {
  23. puts ("nextafterf+ failed");
  24. ++result;
  25. }
  26. if (EXCEPTION_TESTS (float) && fetestexcept (FE_OVERFLOW) == 0)
  27. {
  28. puts ("nextafterf+ did not overflow");
  29. ++result;
  30. }
  31. feclearexcept (FE_ALL_EXCEPT);
  32. if (nextafterf (-m, -i) != -i)
  33. {
  34. puts ("nextafterf- failed");
  35. ++result;
  36. }
  37. if (EXCEPTION_TESTS (float) && fetestexcept (FE_OVERFLOW) == 0)
  38. {
  39. puts ("nextafterf- did not overflow");
  40. ++result;
  41. }
  42. i = 0;
  43. m = FLT_MIN;
  44. feclearexcept (FE_ALL_EXCEPT);
  45. i = nextafterf (m, i);
  46. if (i < 0 || i >= FLT_MIN)
  47. {
  48. puts ("nextafterf+ failed");
  49. ++result;
  50. }
  51. if (EXCEPTION_TESTS (float) && fetestexcept (FE_UNDERFLOW) == 0)
  52. {
  53. puts ("nextafterf+ did not underflow");
  54. ++result;
  55. }
  56. i = 0;
  57. feclearexcept (FE_ALL_EXCEPT);
  58. i = nextafterf (-m, -i);
  59. if (i > 0 || i <= -FLT_MIN)
  60. {
  61. puts ("nextafterf- failed");
  62. ++result;
  63. }
  64. if (EXCEPTION_TESTS (float) && fetestexcept (FE_UNDERFLOW) == 0)
  65. {
  66. puts ("nextafterf- did not underflow");
  67. ++result;
  68. }
  69. i = -INFINITY;
  70. feclearexcept (FE_ALL_EXCEPT);
  71. m = nextafterf (zero, inf);
  72. if (m < 0.0 || m >= FLT_MIN)
  73. {
  74. puts ("nextafterf+ failed");
  75. ++result;
  76. }
  77. if (EXCEPTION_TESTS (float) && fetestexcept (FE_UNDERFLOW) == 0)
  78. {
  79. puts ("nextafterf+ did not underflow");
  80. ++result;
  81. }
  82. feclearexcept (FE_ALL_EXCEPT);
  83. if (nextafterf (m, i) != 0.0)
  84. {
  85. puts ("nextafterf+ failed");
  86. ++result;
  87. }
  88. if (EXCEPTION_TESTS (float) && fetestexcept (FE_UNDERFLOW) == 0)
  89. {
  90. puts ("nextafterf+ did not underflow");
  91. ++result;
  92. }
  93. feclearexcept (FE_ALL_EXCEPT);
  94. m = nextafterf (copysignf (zero, -1.0), -inf);
  95. if (m > 0.0 || m <= -FLT_MIN)
  96. {
  97. puts ("nextafterf- failed");
  98. ++result;
  99. }
  100. if (EXCEPTION_TESTS (float) && fetestexcept (FE_UNDERFLOW) == 0)
  101. {
  102. puts ("nextafterf- did not underflow");
  103. ++result;
  104. }
  105. feclearexcept (FE_ALL_EXCEPT);
  106. if (nextafterf (m, -i) != 0.0)
  107. {
  108. puts ("nextafterf- failed");
  109. ++result;
  110. }
  111. if (EXCEPTION_TESTS (float) && fetestexcept (FE_UNDERFLOW) == 0)
  112. {
  113. puts ("nextafterf- did not underflow");
  114. ++result;
  115. }
  116. double di = INFINITY;
  117. double dm = DBL_MAX;
  118. feclearexcept (FE_ALL_EXCEPT);
  119. if (nextafter (dm, di) != di)
  120. {
  121. puts ("nextafter+ failed");
  122. ++result;
  123. }
  124. if (EXCEPTION_TESTS (double) && fetestexcept (FE_OVERFLOW) == 0)
  125. {
  126. puts ("nextafter+ did not overflow");
  127. ++result;
  128. }
  129. feclearexcept (FE_ALL_EXCEPT);
  130. if (nextafter (-dm, -di) != -di)
  131. {
  132. puts ("nextafter failed");
  133. ++result;
  134. }
  135. if (EXCEPTION_TESTS (double) && fetestexcept (FE_OVERFLOW) == 0)
  136. {
  137. puts ("nextafter- did not overflow");
  138. ++result;
  139. }
  140. di = 0;
  141. dm = DBL_MIN;
  142. feclearexcept (FE_ALL_EXCEPT);
  143. di = nextafter (dm, di);
  144. if (di < 0 || di >= DBL_MIN)
  145. {
  146. puts ("nextafter+ failed");
  147. ++result;
  148. }
  149. if (EXCEPTION_TESTS (double) && fetestexcept (FE_UNDERFLOW) == 0)
  150. {
  151. puts ("nextafter+ did not underflow");
  152. ++result;
  153. }
  154. di = 0;
  155. feclearexcept (FE_ALL_EXCEPT);
  156. di = nextafter (-dm, -di);
  157. if (di > 0 || di <= -DBL_MIN)
  158. {
  159. puts ("nextafter- failed");
  160. ++result;
  161. }
  162. if (EXCEPTION_TESTS (double) && fetestexcept (FE_UNDERFLOW) == 0)
  163. {
  164. puts ("nextafter- did not underflow");
  165. ++result;
  166. }
  167. di = -INFINITY;
  168. feclearexcept (FE_ALL_EXCEPT);
  169. dm = nextafter (zero, inf);
  170. if (dm < 0.0 || dm >= DBL_MIN)
  171. {
  172. puts ("nextafter+ failed");
  173. ++result;
  174. }
  175. if (EXCEPTION_TESTS (double) && fetestexcept (FE_UNDERFLOW) == 0)
  176. {
  177. puts ("nextafter+ did not underflow");
  178. ++result;
  179. }
  180. feclearexcept (FE_ALL_EXCEPT);
  181. if (nextafter (dm, di) != 0.0)
  182. {
  183. puts ("nextafter+ failed");
  184. ++result;
  185. }
  186. if (EXCEPTION_TESTS (double) && fetestexcept (FE_UNDERFLOW) == 0)
  187. {
  188. puts ("nextafter+ did not underflow");
  189. ++result;
  190. }
  191. feclearexcept (FE_ALL_EXCEPT);
  192. dm = nextafter (copysign (zero, -1.0), -inf);
  193. if (dm > 0.0 || dm <= -DBL_MIN)
  194. {
  195. puts ("nextafter- failed");
  196. ++result;
  197. }
  198. if (EXCEPTION_TESTS (double) && fetestexcept (FE_UNDERFLOW) == 0)
  199. {
  200. puts ("nextafter- did not underflow");
  201. ++result;
  202. }
  203. feclearexcept (FE_ALL_EXCEPT);
  204. if (nextafter (dm, -di) != 0.0)
  205. {
  206. puts ("nextafter- failed");
  207. ++result;
  208. }
  209. if (EXCEPTION_TESTS (double) && fetestexcept (FE_UNDERFLOW) == 0)
  210. {
  211. puts ("nextafter- did not underflow");
  212. ++result;
  213. }
  214. long double li = INFINITY;
  215. long double lm = LDBL_MAX;
  216. feclearexcept (FE_ALL_EXCEPT);
  217. if (nextafterl (lm, li) != li)
  218. {
  219. puts ("nextafterl+ failed");
  220. ++result;
  221. }
  222. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_OVERFLOW) == 0)
  223. {
  224. puts ("nextafterl+ did not overflow");
  225. ++result;
  226. }
  227. feclearexcept (FE_ALL_EXCEPT);
  228. if (nextafterl (-lm, -li) != -li)
  229. {
  230. puts ("nextafterl failed");
  231. ++result;
  232. }
  233. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_OVERFLOW) == 0)
  234. {
  235. puts ("nextafterl- did not overflow");
  236. ++result;
  237. }
  238. li = 0;
  239. lm = LDBL_MIN;
  240. feclearexcept (FE_ALL_EXCEPT);
  241. li = nextafterl (lm, li);
  242. if (li < 0 || li >= LDBL_MIN)
  243. {
  244. puts ("nextafterl+ failed");
  245. ++result;
  246. }
  247. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_UNDERFLOW) == 0)
  248. {
  249. puts ("nextafterl+ did not underflow");
  250. ++result;
  251. }
  252. li = 0;
  253. feclearexcept (FE_ALL_EXCEPT);
  254. li = nextafterl (-lm, -li);
  255. if (li > 0 || li <= -LDBL_MIN)
  256. {
  257. puts ("nextafterl- failed");
  258. ++result;
  259. }
  260. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_UNDERFLOW) == 0)
  261. {
  262. puts ("nextafterl- did not underflow");
  263. ++result;
  264. }
  265. li = -INFINITY;
  266. feclearexcept (FE_ALL_EXCEPT);
  267. lm = nextafterl (zero, inf);
  268. if (lm < 0.0 || lm >= LDBL_MIN)
  269. {
  270. puts ("nextafterl+ failed");
  271. ++result;
  272. }
  273. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_UNDERFLOW) == 0)
  274. {
  275. puts ("nextafterl+ did not underflow");
  276. ++result;
  277. }
  278. feclearexcept (FE_ALL_EXCEPT);
  279. if (nextafterl (lm, li) != 0.0)
  280. {
  281. puts ("nextafterl+ failed");
  282. ++result;
  283. }
  284. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_UNDERFLOW) == 0)
  285. {
  286. puts ("nextafterl+ did not underflow");
  287. ++result;
  288. }
  289. feclearexcept (FE_ALL_EXCEPT);
  290. lm = nextafterl (copysign (zero, -1.0), -inf);
  291. if (lm > 0.0 || lm <= -LDBL_MIN)
  292. {
  293. puts ("nextafterl- failed");
  294. ++result;
  295. }
  296. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_UNDERFLOW) == 0)
  297. {
  298. puts ("nextafterl- did not underflow");
  299. ++result;
  300. }
  301. feclearexcept (FE_ALL_EXCEPT);
  302. if (nextafterl (lm, -li) != 0.0)
  303. {
  304. puts ("nextafterl- failed");
  305. ++result;
  306. }
  307. if (EXCEPTION_TESTS (long double) && fetestexcept (FE_UNDERFLOW) == 0)
  308. {
  309. puts ("nextafterl- did not underflow");
  310. ++result;
  311. }
  312. return result;
  313. }