math-finite.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. /* Entry points to finite-math-only compiler runs.
  2. Copyright (C) 2011-2016 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4. The GNU C Library is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU Lesser General Public
  6. License as published by the Free Software Foundation; either
  7. version 2.1 of the License, or (at your option) any later version.
  8. The GNU C Library is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public
  13. License along with the GNU C Library; if not, see
  14. <http://www.gnu.org/licenses/>. */
  15. #ifndef _MATH_H
  16. # error "Never use <bits/math-finite.h> directly; include <math.h> instead."
  17. #endif
  18. /* acos. */
  19. extern double __REDIRECT_NTH (acos, (double), __acos_finite);
  20. #ifdef __USE_ISOC99
  21. extern float __REDIRECT_NTH (acosf, (float), __acosf_finite);
  22. # ifdef __MATH_DECLARE_LDOUBLE
  23. # ifdef __NO_LONG_DOUBLE_MATH
  24. extern long double __REDIRECT_NTH (acosl, (long double), __acos_finite);
  25. # else
  26. extern long double __REDIRECT_NTH (acosl, (long double), __acosl_finite);
  27. # endif
  28. # endif
  29. #endif
  30. #if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
  31. /* acosh. */
  32. extern double __REDIRECT_NTH (acosh, (double), __acosh_finite);
  33. #endif
  34. #ifdef __USE_ISOC99
  35. extern float __REDIRECT_NTH (acoshf, (float), __acoshf_finite);
  36. # ifdef __MATH_DECLARE_LDOUBLE
  37. # ifdef __NO_LONG_DOUBLE_MATH
  38. extern long double __REDIRECT_NTH (acoshl, (long double), __acosh_finite);
  39. # else
  40. extern long double __REDIRECT_NTH (acoshl, (long double), __acoshl_finite);
  41. # endif
  42. # endif
  43. #endif
  44. /* asin. */
  45. extern double __REDIRECT_NTH (asin, (double), __asin_finite);
  46. #ifdef __USE_ISOC99
  47. extern float __REDIRECT_NTH (asinf, (float), __asinf_finite);
  48. # ifdef __MATH_DECLARE_LDOUBLE
  49. # ifdef __NO_LONG_DOUBLE_MATH
  50. extern long double __REDIRECT_NTH (asinl, (long double), __asin_finite);
  51. # else
  52. extern long double __REDIRECT_NTH (asinl, (long double), __asinl_finite);
  53. # endif
  54. # endif
  55. #endif
  56. /* atan2. */
  57. extern double __REDIRECT_NTH (atan2, (double, double), __atan2_finite);
  58. #ifdef __USE_ISOC99
  59. extern float __REDIRECT_NTH (atan2f, (float, float), __atan2f_finite);
  60. # ifdef __MATH_DECLARE_LDOUBLE
  61. # ifdef __NO_LONG_DOUBLE_MATH
  62. extern long double __REDIRECT_NTH (atan2l, (long double, long double),
  63. __atan2_finite);
  64. # else
  65. extern long double __REDIRECT_NTH (atan2l, (long double, long double),
  66. __atan2l_finite);
  67. # endif
  68. # endif
  69. #endif
  70. #if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
  71. /* atanh. */
  72. extern double __REDIRECT_NTH (atanh, (double), __atanh_finite);
  73. #endif
  74. #ifdef __USE_ISOC99
  75. extern float __REDIRECT_NTH (atanhf, (float), __atanhf_finite);
  76. # ifdef __MATH_DECLARE_LDOUBLE
  77. # ifdef __NO_LONG_DOUBLE_MATH
  78. extern long double __REDIRECT_NTH (atanhl, (long double), __atanh_finite);
  79. # else
  80. extern long double __REDIRECT_NTH (atanhl, (long double), __atanhl_finite);
  81. # endif
  82. # endif
  83. #endif
  84. /* cosh. */
  85. extern double __REDIRECT_NTH (cosh, (double), __cosh_finite);
  86. #ifdef __USE_ISOC99
  87. extern float __REDIRECT_NTH (coshf, (float), __coshf_finite);
  88. # ifdef __MATH_DECLARE_LDOUBLE
  89. # ifdef __NO_LONG_DOUBLE_MATH
  90. extern long double __REDIRECT_NTH (coshl, (long double), __cosh_finite);
  91. # else
  92. extern long double __REDIRECT_NTH (coshl, (long double), __coshl_finite);
  93. # endif
  94. # endif
  95. #endif
  96. /* exp. */
  97. extern double __REDIRECT_NTH (exp, (double), __exp_finite);
  98. #ifdef __USE_ISOC99
  99. extern float __REDIRECT_NTH (expf, (float), __expf_finite);
  100. # ifdef __MATH_DECLARE_LDOUBLE
  101. # ifdef __NO_LONG_DOUBLE_MATH
  102. extern long double __REDIRECT_NTH (expl, (long double), __exp_finite);
  103. # else
  104. extern long double __REDIRECT_NTH (expl, (long double), __expl_finite);
  105. # endif
  106. # endif
  107. #endif
  108. #ifdef __USE_GNU
  109. /* exp10. */
  110. extern double __REDIRECT_NTH (exp10, (double), __exp10_finite);
  111. extern float __REDIRECT_NTH (exp10f, (float), __exp10f_finite);
  112. # ifdef __MATH_DECLARE_LDOUBLE
  113. # ifdef __NO_LONG_DOUBLE_MATH
  114. extern long double __REDIRECT_NTH (exp10l, (long double), __exp10_finite);
  115. # else
  116. extern long double __REDIRECT_NTH (exp10l, (long double), __exp10l_finite);
  117. # endif
  118. # endif
  119. /* pow10. */
  120. extern double __REDIRECT_NTH (pow10, (double), __exp10_finite);
  121. extern float __REDIRECT_NTH (pow10f, (float), __exp10f_finite);
  122. # ifdef __MATH_DECLARE_LDOUBLE
  123. # ifdef __NO_LONG_DOUBLE_MATH
  124. extern long double __REDIRECT_NTH (pow10l, (long double), __exp10_finite);
  125. # else
  126. extern long double __REDIRECT_NTH (pow10l, (long double), __exp10l_finite);
  127. # endif
  128. # endif
  129. #endif
  130. #ifdef __USE_ISOC99
  131. /* exp2. */
  132. extern double __REDIRECT_NTH (exp2, (double), __exp2_finite);
  133. extern float __REDIRECT_NTH (exp2f, (float), __exp2f_finite);
  134. # ifdef __MATH_DECLARE_LDOUBLE
  135. # ifdef __NO_LONG_DOUBLE_MATH
  136. extern long double __REDIRECT_NTH (exp2l, (long double), __exp2_finite);
  137. # else
  138. extern long double __REDIRECT_NTH (exp2l, (long double), __exp2l_finite);
  139. # endif
  140. # endif
  141. #endif
  142. /* fmod. */
  143. extern double __REDIRECT_NTH (fmod, (double, double), __fmod_finite);
  144. #ifdef __USE_ISOC99
  145. extern float __REDIRECT_NTH (fmodf, (float, float), __fmodf_finite);
  146. # ifdef __MATH_DECLARE_LDOUBLE
  147. # ifdef __NO_LONG_DOUBLE_MATH
  148. extern long double __REDIRECT_NTH (fmodl, (long double, long double),
  149. __fmod_finite);
  150. # else
  151. extern long double __REDIRECT_NTH (fmodl, (long double, long double),
  152. __fmodl_finite);
  153. # endif
  154. # endif
  155. #endif
  156. #if defined __USE_XOPEN || defined __USE_ISOC99
  157. /* hypot. */
  158. extern double __REDIRECT_NTH (hypot, (double, double), __hypot_finite);
  159. #endif
  160. #ifdef __USE_ISOC99
  161. extern float __REDIRECT_NTH (hypotf, (float, float), __hypotf_finite);
  162. # ifdef __MATH_DECLARE_LDOUBLE
  163. # ifdef __NO_LONG_DOUBLE_MATH
  164. extern long double __REDIRECT_NTH (hypotl, (long double, long double),
  165. __hypot_finite);
  166. # else
  167. extern long double __REDIRECT_NTH (hypotl, (long double, long double),
  168. __hypotl_finite);
  169. # endif
  170. # endif
  171. #endif
  172. #if defined __USE_MISC || defined __USE_XOPEN
  173. /* j0. */
  174. extern double __REDIRECT_NTH (j0, (double), __j0_finite);
  175. #endif
  176. #if defined __USE_MISC && defined __USE_ISOC99
  177. extern float __REDIRECT_NTH (j0f, (float), __j0f_finite);
  178. # ifdef __MATH_DECLARE_LDOUBLE
  179. # ifdef __NO_LONG_DOUBLE_MATH
  180. extern long double __REDIRECT_NTH (j0l, (long double), __j0_finite);
  181. # else
  182. extern long double __REDIRECT_NTH (j0l, (long double), __j0l_finite);
  183. # endif
  184. # endif
  185. #endif
  186. #if defined __USE_MISC || defined __USE_XOPEN
  187. /* y0. */
  188. extern double __REDIRECT_NTH (y0, (double), __y0_finite);
  189. #endif
  190. #if defined __USE_MISC && defined __USE_ISOC99
  191. extern float __REDIRECT_NTH (y0f, (float), __y0f_finite);
  192. # ifdef __MATH_DECLARE_LDOUBLE
  193. # ifdef __NO_LONG_DOUBLE_MATH
  194. extern long double __REDIRECT_NTH (y0l, (long double), __y0_finite);
  195. # else
  196. extern long double __REDIRECT_NTH (y0l, (long double), __y0l_finite);
  197. # endif
  198. # endif
  199. #endif
  200. #if defined __USE_MISC || defined __USE_XOPEN
  201. /* j1. */
  202. extern double __REDIRECT_NTH (j1, (double), __j1_finite);
  203. #endif
  204. #if defined __USE_MISC && defined __USE_ISOC99
  205. extern float __REDIRECT_NTH (j1f, (float), __j1f_finite);
  206. # ifdef __MATH_DECLARE_LDOUBLE
  207. # ifdef __NO_LONG_DOUBLE_MATH
  208. extern long double __REDIRECT_NTH (j1l, (long double), __j1_finite);
  209. # else
  210. extern long double __REDIRECT_NTH (j1l, (long double), __j1l_finite);
  211. # endif
  212. # endif
  213. #endif
  214. #if defined __USE_MISC || defined __USE_XOPEN
  215. /* y1. */
  216. extern double __REDIRECT_NTH (y1, (double), __y1_finite);
  217. #endif
  218. #if defined __USE_MISC && defined __USE_ISOC99
  219. extern float __REDIRECT_NTH (y1f, (float), __y1f_finite);
  220. # ifdef __MATH_DECLARE_LDOUBLE
  221. # ifdef __NO_LONG_DOUBLE_MATH
  222. extern long double __REDIRECT_NTH (y1l, (long double), __y1_finite);
  223. # else
  224. extern long double __REDIRECT_NTH (y1l, (long double), __y1l_finite);
  225. # endif
  226. # endif
  227. #endif
  228. #if defined __USE_MISC || defined __USE_XOPEN
  229. /* jn. */
  230. extern double __REDIRECT_NTH (jn, (int, double), __jn_finite);
  231. #endif
  232. #if defined __USE_MISC && defined __USE_ISOC99
  233. extern float __REDIRECT_NTH (jnf, (int, float), __jnf_finite);
  234. # ifdef __MATH_DECLARE_LDOUBLE
  235. # ifdef __NO_LONG_DOUBLE_MATH
  236. extern long double __REDIRECT_NTH (jnl, (int, long double), __jn_finite);
  237. # else
  238. extern long double __REDIRECT_NTH (jnl, (int, long double), __jnl_finite);
  239. # endif
  240. # endif
  241. #endif
  242. #if defined __USE_MISC || defined __USE_XOPEN
  243. /* yn. */
  244. extern double __REDIRECT_NTH (yn, (int, double), __yn_finite);
  245. #endif
  246. #if defined __USE_MISC && defined __USE_ISOC99
  247. extern float __REDIRECT_NTH (ynf, (int, float), __ynf_finite);
  248. # ifdef __MATH_DECLARE_LDOUBLE
  249. # ifdef __NO_LONG_DOUBLE_MATH
  250. extern long double __REDIRECT_NTH (ynl, (int, long double), __yn_finite);
  251. # else
  252. extern long double __REDIRECT_NTH (ynl, (int, long double), __ynl_finite);
  253. # endif
  254. # endif
  255. #endif
  256. #ifdef __USE_MISC
  257. /* lgamma_r. */
  258. extern double __REDIRECT_NTH (lgamma_r, (double, int *), __lgamma_r_finite);
  259. # ifdef __USE_ISOC99
  260. extern float __REDIRECT_NTH (lgammaf_r, (float, int *), __lgammaf_r_finite);
  261. # ifdef __MATH_DECLARE_LDOUBLE
  262. # ifdef __NO_LONG_DOUBLE_MATH
  263. extern long double __REDIRECT_NTH (lgammal_r, (long double, int *),
  264. __lgamma_r_finite);
  265. # else
  266. extern long double __REDIRECT_NTH (lgammal_r, (long double, int *),
  267. __lgammal_r_finite);
  268. # endif
  269. # endif
  270. # endif
  271. #endif
  272. extern double __lgamma_r_finite (double, int *);
  273. extern float __lgammaf_r_finite (float, int *);
  274. #ifdef __NO_LONG_DOUBLE_MATH
  275. extern long double __REDIRECT_NTH (__lgammal_r_finite, (long double, int *),
  276. __lgamma_r_finite);
  277. #else
  278. extern long double __lgammal_r_finite (long double, int *);
  279. #endif
  280. #if ((defined __USE_XOPEN || defined __USE_ISOC99) \
  281. && defined __extern_always_inline)
  282. /* lgamma. */
  283. __extern_always_inline double __NTH (lgamma (double __d))
  284. {
  285. # if defined __USE_MISC || defined __USE_XOPEN
  286. return __lgamma_r_finite (__d, &signgam);
  287. # else
  288. int __local_signgam = 0;
  289. return __lgamma_r_finite (__d, &__local_signgam);
  290. # endif
  291. }
  292. #endif
  293. #if defined __USE_ISOC99 && defined __extern_always_inline
  294. __extern_always_inline float __NTH (lgammaf (float __d))
  295. {
  296. # if defined __USE_MISC || defined __USE_XOPEN
  297. return __lgammaf_r_finite (__d, &signgam);
  298. # else
  299. int __local_signgam = 0;
  300. return __lgammaf_r_finite (__d, &__local_signgam);
  301. # endif
  302. }
  303. # ifdef __MATH_DECLARE_LDOUBLE
  304. __extern_always_inline long double __NTH (lgammal (long double __d))
  305. {
  306. # if defined __USE_MISC || defined __USE_XOPEN
  307. return __lgammal_r_finite (__d, &signgam);
  308. # else
  309. int __local_signgam = 0;
  310. return __lgammal_r_finite (__d, &__local_signgam);
  311. # endif
  312. }
  313. # endif
  314. #endif
  315. #if ((defined __USE_MISC || (defined __USE_XOPEN && !defined __USE_XOPEN2K)) \
  316. && defined __extern_always_inline)
  317. /* gamma. */
  318. __extern_always_inline double __NTH (gamma (double __d))
  319. {
  320. return __lgamma_r_finite (__d, &signgam);
  321. }
  322. # ifdef __USE_ISOC99
  323. __extern_always_inline float __NTH (gammaf (float __d))
  324. {
  325. return __lgammaf_r_finite (__d, &signgam);
  326. }
  327. # ifdef __MATH_DECLARE_LDOUBLE
  328. __extern_always_inline long double __NTH (gammal (long double __d))
  329. {
  330. return __lgammal_r_finite (__d, &signgam);
  331. }
  332. # endif
  333. # endif
  334. #endif
  335. /* log. */
  336. extern double __REDIRECT_NTH (log, (double), __log_finite);
  337. #ifdef __USE_ISOC99
  338. extern float __REDIRECT_NTH (logf, (float), __logf_finite);
  339. # ifdef __MATH_DECLARE_LDOUBLE
  340. # ifdef __NO_LONG_DOUBLE_MATH
  341. extern long double __REDIRECT_NTH (logl, (long double), __log_finite);
  342. # else
  343. extern long double __REDIRECT_NTH (logl, (long double), __logl_finite);
  344. # endif
  345. # endif
  346. #endif
  347. /* log10. */
  348. extern double __REDIRECT_NTH (log10, (double), __log10_finite);
  349. #ifdef __USE_ISOC99
  350. extern float __REDIRECT_NTH (log10f, (float), __log10f_finite);
  351. # ifdef __MATH_DECLARE_LDOUBLE
  352. # ifdef __NO_LONG_DOUBLE_MATH
  353. extern long double __REDIRECT_NTH (log10l, (long double), __log10_finite);
  354. # else
  355. extern long double __REDIRECT_NTH (log10l, (long double), __log10l_finite);
  356. # endif
  357. # endif
  358. #endif
  359. #ifdef __USE_ISOC99
  360. /* log2. */
  361. extern double __REDIRECT_NTH (log2, (double), __log2_finite);
  362. extern float __REDIRECT_NTH (log2f, (float), __log2f_finite);
  363. # ifdef __MATH_DECLARE_LDOUBLE
  364. # ifdef __NO_LONG_DOUBLE_MATH
  365. extern long double __REDIRECT_NTH (log2l, (long double), __log2_finite);
  366. # else
  367. extern long double __REDIRECT_NTH (log2l, (long double), __log2l_finite);
  368. # endif
  369. # endif
  370. #endif
  371. /* pow. */
  372. extern double __REDIRECT_NTH (pow, (double, double), __pow_finite);
  373. #ifdef __USE_ISOC99
  374. extern float __REDIRECT_NTH (powf, (float, float), __powf_finite);
  375. # ifdef __MATH_DECLARE_LDOUBLE
  376. # ifdef __NO_LONG_DOUBLE_MATH
  377. extern long double __REDIRECT_NTH (powl, (long double, long double),
  378. __pow_finite);
  379. # else
  380. extern long double __REDIRECT_NTH (powl, (long double, long double),
  381. __powl_finite);
  382. # endif
  383. # endif
  384. #endif
  385. #if defined __USE_XOPEN_EXTENDED || defined __USE_ISOC99
  386. /* remainder. */
  387. extern double __REDIRECT_NTH (remainder, (double, double), __remainder_finite);
  388. #endif
  389. #ifdef __USE_ISOC99
  390. extern float __REDIRECT_NTH (remainderf, (float, float), __remainderf_finite);
  391. # ifdef __MATH_DECLARE_LDOUBLE
  392. # ifdef __NO_LONG_DOUBLE_MATH
  393. extern long double __REDIRECT_NTH (remainderl, (long double, long double),
  394. __remainder_finite);
  395. # else
  396. extern long double __REDIRECT_NTH (remainderl, (long double, long double),
  397. __remainderl_finite);
  398. # endif
  399. # endif
  400. #endif
  401. #if (defined __USE_MISC \
  402. || (defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K8))
  403. /* scalb. */
  404. extern double __REDIRECT_NTH (scalb, (double, double), __scalb_finite);
  405. #endif
  406. #if defined __USE_MISC && defined __USE_ISOC99
  407. extern float __REDIRECT_NTH (scalbf, (float, float), __scalbf_finite);
  408. # ifdef __MATH_DECLARE_LDOUBLE
  409. # ifdef __NO_LONG_DOUBLE_MATH
  410. extern long double __REDIRECT_NTH (scalbl, (long double, long double),
  411. __scalb_finite);
  412. # else
  413. extern long double __REDIRECT_NTH (scalbl, (long double, long double),
  414. __scalbl_finite);
  415. # endif
  416. # endif
  417. #endif
  418. /* sinh. */
  419. extern double __REDIRECT_NTH (sinh, (double), __sinh_finite);
  420. #ifdef __USE_ISOC99
  421. extern float __REDIRECT_NTH (sinhf, (float), __sinhf_finite);
  422. # ifdef __MATH_DECLARE_LDOUBLE
  423. # ifdef __NO_LONG_DOUBLE_MATH
  424. extern long double __REDIRECT_NTH (sinhl, (long double), __sinh_finite);
  425. # else
  426. extern long double __REDIRECT_NTH (sinhl, (long double), __sinhl_finite);
  427. # endif
  428. # endif
  429. #endif
  430. /* sqrt. */
  431. extern double __REDIRECT_NTH (sqrt, (double), __sqrt_finite);
  432. #ifdef __USE_ISOC99
  433. extern float __REDIRECT_NTH (sqrtf, (float), __sqrtf_finite);
  434. # ifdef __MATH_DECLARE_LDOUBLE
  435. # ifdef __NO_LONG_DOUBLE_MATH
  436. extern long double __REDIRECT_NTH (sqrtl, (long double), __sqrt_finite);
  437. # else
  438. extern long double __REDIRECT_NTH (sqrtl, (long double), __sqrtl_finite);
  439. # endif
  440. # endif
  441. #endif
  442. #if defined __USE_ISOC99 && defined __extern_always_inline
  443. /* tgamma. */
  444. extern double __gamma_r_finite (double, int *);
  445. __extern_always_inline double __NTH (tgamma (double __d))
  446. {
  447. int __local_signgam = 0;
  448. double __res = __gamma_r_finite (__d, &__local_signgam);
  449. return __local_signgam < 0 ? -__res : __res;
  450. }
  451. extern float __gammaf_r_finite (float, int *);
  452. __extern_always_inline float __NTH (tgammaf (float __d))
  453. {
  454. int __local_signgam = 0;
  455. float __res = __gammaf_r_finite (__d, &__local_signgam);
  456. return __local_signgam < 0 ? -__res : __res;
  457. }
  458. # ifdef __MATH_DECLARE_LDOUBLE
  459. extern long double __gammal_r_finite (long double, int *);
  460. __extern_always_inline long double __NTH (tgammal (long double __d))
  461. {
  462. int __local_signgam = 0;
  463. # ifdef __NO_LONG_DOUBLE_MATH
  464. long double __res = __gamma_r_finite (__d, &__local_signgam);
  465. # else
  466. long double __res = __gammal_r_finite (__d, &__local_signgam);
  467. # endif
  468. return __local_signgam < 0 ? -__res : __res;
  469. }
  470. # endif
  471. #endif