cmath.pass.cpp 101 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // <cmath>
  10. #include <cmath>
  11. #include <limits>
  12. #include <type_traits>
  13. #include <cassert>
  14. #include "test_macros.h"
  15. #include "hexfloat.h"
  16. #include "truncate_fp.h"
  17. // convertible to int/float/double/etc
  18. template <class T, int N=0>
  19. struct Value {
  20. operator T () { return T(N); }
  21. };
  22. // See PR21083
  23. // Ambiguous is a user-defined type that defines its own overloads of cmath
  24. // functions. When the std overloads are candidates too (by using or adl),
  25. // they should not interfere.
  26. struct Ambiguous : std::true_type { // ADL
  27. operator float () { return 0.f; }
  28. operator double () { return 0.; }
  29. };
  30. Ambiguous abs(Ambiguous){ return Ambiguous(); }
  31. Ambiguous acos(Ambiguous){ return Ambiguous(); }
  32. Ambiguous asin(Ambiguous){ return Ambiguous(); }
  33. Ambiguous atan(Ambiguous){ return Ambiguous(); }
  34. Ambiguous atan2(Ambiguous, Ambiguous){ return Ambiguous(); }
  35. Ambiguous ceil(Ambiguous){ return Ambiguous(); }
  36. Ambiguous cos(Ambiguous){ return Ambiguous(); }
  37. Ambiguous cosh(Ambiguous){ return Ambiguous(); }
  38. Ambiguous exp(Ambiguous){ return Ambiguous(); }
  39. Ambiguous fabs(Ambiguous){ return Ambiguous(); }
  40. Ambiguous floor(Ambiguous){ return Ambiguous(); }
  41. Ambiguous fmod(Ambiguous, Ambiguous){ return Ambiguous(); }
  42. Ambiguous frexp(Ambiguous, int*){ return Ambiguous(); }
  43. Ambiguous ldexp(Ambiguous, int){ return Ambiguous(); }
  44. Ambiguous log(Ambiguous){ return Ambiguous(); }
  45. Ambiguous log10(Ambiguous){ return Ambiguous(); }
  46. Ambiguous modf(Ambiguous, Ambiguous*){ return Ambiguous(); }
  47. Ambiguous pow(Ambiguous, Ambiguous){ return Ambiguous(); }
  48. Ambiguous sin(Ambiguous){ return Ambiguous(); }
  49. Ambiguous sinh(Ambiguous){ return Ambiguous(); }
  50. Ambiguous sqrt(Ambiguous){ return Ambiguous(); }
  51. Ambiguous tan(Ambiguous){ return Ambiguous(); }
  52. Ambiguous tanh(Ambiguous){ return Ambiguous(); }
  53. Ambiguous signbit(Ambiguous){ return Ambiguous(); }
  54. Ambiguous fpclassify(Ambiguous){ return Ambiguous(); }
  55. Ambiguous isfinite(Ambiguous){ return Ambiguous(); }
  56. Ambiguous isnormal(Ambiguous){ return Ambiguous(); }
  57. Ambiguous isgreater(Ambiguous, Ambiguous){ return Ambiguous(); }
  58. Ambiguous isgreaterequal(Ambiguous, Ambiguous){ return Ambiguous(); }
  59. Ambiguous isless(Ambiguous, Ambiguous){ return Ambiguous(); }
  60. Ambiguous islessequal(Ambiguous, Ambiguous){ return Ambiguous(); }
  61. Ambiguous islessgreater(Ambiguous, Ambiguous){ return Ambiguous(); }
  62. Ambiguous isunordered(Ambiguous, Ambiguous){ return Ambiguous(); }
  63. Ambiguous acosh(Ambiguous){ return Ambiguous(); }
  64. Ambiguous asinh(Ambiguous){ return Ambiguous(); }
  65. Ambiguous atanh(Ambiguous){ return Ambiguous(); }
  66. Ambiguous cbrt(Ambiguous){ return Ambiguous(); }
  67. Ambiguous copysign(Ambiguous, Ambiguous){ return Ambiguous(); }
  68. Ambiguous erf(Ambiguous){ return Ambiguous(); }
  69. Ambiguous erfc(Ambiguous){ return Ambiguous(); }
  70. Ambiguous exp2(Ambiguous){ return Ambiguous(); }
  71. Ambiguous expm1(Ambiguous){ return Ambiguous(); }
  72. Ambiguous fdim(Ambiguous, Ambiguous){ return Ambiguous(); }
  73. Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }
  74. Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); }
  75. Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); }
  76. Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); }
  77. Ambiguous hypot(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }
  78. Ambiguous ilogb(Ambiguous){ return Ambiguous(); }
  79. Ambiguous lgamma(Ambiguous){ return Ambiguous(); }
  80. Ambiguous llrint(Ambiguous){ return Ambiguous(); }
  81. Ambiguous llround(Ambiguous){ return Ambiguous(); }
  82. Ambiguous log1p(Ambiguous){ return Ambiguous(); }
  83. Ambiguous log2(Ambiguous){ return Ambiguous(); }
  84. Ambiguous logb(Ambiguous){ return Ambiguous(); }
  85. Ambiguous lrint(Ambiguous){ return Ambiguous(); }
  86. Ambiguous lround(Ambiguous){ return Ambiguous(); }
  87. Ambiguous nearbyint(Ambiguous){ return Ambiguous(); }
  88. Ambiguous nextafter(Ambiguous, Ambiguous){ return Ambiguous(); }
  89. Ambiguous nexttoward(Ambiguous, Ambiguous){ return Ambiguous(); }
  90. Ambiguous remainder(Ambiguous, Ambiguous){ return Ambiguous(); }
  91. Ambiguous remquo(Ambiguous, Ambiguous, int*){ return Ambiguous(); }
  92. Ambiguous rint(Ambiguous){ return Ambiguous(); }
  93. Ambiguous round(Ambiguous){ return Ambiguous(); }
  94. Ambiguous scalbln(Ambiguous, Ambiguous){ return Ambiguous(); }
  95. Ambiguous scalbn(Ambiguous, Ambiguous){ return Ambiguous(); }
  96. Ambiguous tgamma(Ambiguous){ return Ambiguous(); }
  97. Ambiguous trunc(Ambiguous){ return Ambiguous(); }
  98. void test_abs()
  99. {
  100. static_assert((std::is_same<decltype(std::abs((float)0)), float>::value), "");
  101. static_assert((std::is_same<decltype(std::abs((double)0)), double>::value), "");
  102. static_assert((std::is_same<decltype(std::abs((long double)0)), long double>::value), "");
  103. static_assert((std::is_same<decltype(abs(Ambiguous())), Ambiguous>::value), "");
  104. assert(std::abs(-1.) == 1);
  105. }
  106. void test_acos()
  107. {
  108. static_assert((std::is_same<decltype(std::acos((float)0)), float>::value), "");
  109. static_assert((std::is_same<decltype(std::acos((bool)0)), double>::value), "");
  110. static_assert((std::is_same<decltype(std::acos((unsigned short)0)), double>::value), "");
  111. static_assert((std::is_same<decltype(std::acos((int)0)), double>::value), "");
  112. static_assert((std::is_same<decltype(std::acos((unsigned int)0)), double>::value), "");
  113. static_assert((std::is_same<decltype(std::acos((long)0)), double>::value), "");
  114. static_assert((std::is_same<decltype(std::acos((unsigned long)0)), double>::value), "");
  115. static_assert((std::is_same<decltype(std::acos((long long)0)), double>::value), "");
  116. static_assert((std::is_same<decltype(std::acos((unsigned long long)0)), double>::value), "");
  117. static_assert((std::is_same<decltype(std::acos((double)0)), double>::value), "");
  118. static_assert((std::is_same<decltype(std::acos((long double)0)), long double>::value), "");
  119. static_assert((std::is_same<decltype(std::acosf(0)), float>::value), "");
  120. static_assert((std::is_same<decltype(std::acosl(0)), long double>::value), "");
  121. static_assert((std::is_same<decltype(acos(Ambiguous())), Ambiguous>::value), "");
  122. assert(std::acos(1) == 0);
  123. }
  124. void test_asin()
  125. {
  126. static_assert((std::is_same<decltype(std::asin((float)0)), float>::value), "");
  127. static_assert((std::is_same<decltype(std::asin((bool)0)), double>::value), "");
  128. static_assert((std::is_same<decltype(std::asin((unsigned short)0)), double>::value), "");
  129. static_assert((std::is_same<decltype(std::asin((int)0)), double>::value), "");
  130. static_assert((std::is_same<decltype(std::asin((unsigned int)0)), double>::value), "");
  131. static_assert((std::is_same<decltype(std::asin((long)0)), double>::value), "");
  132. static_assert((std::is_same<decltype(std::asin((unsigned long)0)), double>::value), "");
  133. static_assert((std::is_same<decltype(std::asin((long long)0)), double>::value), "");
  134. static_assert((std::is_same<decltype(std::asin((unsigned long long)0)), double>::value), "");
  135. static_assert((std::is_same<decltype(std::asin((double)0)), double>::value), "");
  136. static_assert((std::is_same<decltype(std::asin((long double)0)), long double>::value), "");
  137. static_assert((std::is_same<decltype(std::asinf(0)), float>::value), "");
  138. static_assert((std::is_same<decltype(std::asinl(0)), long double>::value), "");
  139. static_assert((std::is_same<decltype(asin(Ambiguous())), Ambiguous>::value), "");
  140. assert(std::asin(0) == 0);
  141. }
  142. void test_atan()
  143. {
  144. static_assert((std::is_same<decltype(std::atan((float)0)), float>::value), "");
  145. static_assert((std::is_same<decltype(std::atan((bool)0)), double>::value), "");
  146. static_assert((std::is_same<decltype(std::atan((unsigned short)0)), double>::value), "");
  147. static_assert((std::is_same<decltype(std::atan((int)0)), double>::value), "");
  148. static_assert((std::is_same<decltype(std::atan((unsigned int)0)), double>::value), "");
  149. static_assert((std::is_same<decltype(std::atan((long)0)), double>::value), "");
  150. static_assert((std::is_same<decltype(std::atan((unsigned long)0)), double>::value), "");
  151. static_assert((std::is_same<decltype(std::atan((long long)0)), double>::value), "");
  152. static_assert((std::is_same<decltype(std::atan((unsigned long long)0)), double>::value), "");
  153. static_assert((std::is_same<decltype(std::atan((double)0)), double>::value), "");
  154. static_assert((std::is_same<decltype(std::atan((long double)0)), long double>::value), "");
  155. static_assert((std::is_same<decltype(std::atanf(0)), float>::value), "");
  156. static_assert((std::is_same<decltype(std::atanl(0)), long double>::value), "");
  157. static_assert((std::is_same<decltype(atan(Ambiguous())), Ambiguous>::value), "");
  158. assert(std::atan(0) == 0);
  159. }
  160. void test_atan2()
  161. {
  162. static_assert((std::is_same<decltype(std::atan2((float)0, (float)0)), float>::value), "");
  163. static_assert((std::is_same<decltype(std::atan2((bool)0, (float)0)), double>::value), "");
  164. static_assert((std::is_same<decltype(std::atan2((unsigned short)0, (double)0)), double>::value), "");
  165. static_assert((std::is_same<decltype(std::atan2((int)0, (long double)0)), long double>::value), "");
  166. static_assert((std::is_same<decltype(std::atan2((float)0, (unsigned int)0)), double>::value), "");
  167. static_assert((std::is_same<decltype(std::atan2((double)0, (long)0)), double>::value), "");
  168. static_assert((std::is_same<decltype(std::atan2((long double)0, (unsigned long)0)), long double>::value), "");
  169. static_assert((std::is_same<decltype(std::atan2((int)0, (long long)0)), double>::value), "");
  170. static_assert((std::is_same<decltype(std::atan2((int)0, (unsigned long long)0)), double>::value), "");
  171. static_assert((std::is_same<decltype(std::atan2((double)0, (double)0)), double>::value), "");
  172. static_assert((std::is_same<decltype(std::atan2((long double)0, (long double)0)), long double>::value), "");
  173. static_assert((std::is_same<decltype(std::atan2((float)0, (double)0)), double>::value), "");
  174. static_assert((std::is_same<decltype(std::atan2((float)0, (long double)0)), long double>::value), "");
  175. static_assert((std::is_same<decltype(std::atan2((double)0, (long double)0)), long double>::value), "");
  176. static_assert((std::is_same<decltype(std::atan2f(0,0)), float>::value), "");
  177. static_assert((std::is_same<decltype(std::atan2l(0,0)), long double>::value), "");
  178. static_assert((std::is_same<decltype(std::atan2((int)0, (int)0)), double>::value), "");
  179. static_assert((std::is_same<decltype(atan2(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  180. assert(std::atan2(0,1) == 0);
  181. }
  182. void test_ceil()
  183. {
  184. static_assert((std::is_same<decltype(std::ceil((float)0)), float>::value), "");
  185. static_assert((std::is_same<decltype(std::ceil((bool)0)), double>::value), "");
  186. static_assert((std::is_same<decltype(std::ceil((unsigned short)0)), double>::value), "");
  187. static_assert((std::is_same<decltype(std::ceil((int)0)), double>::value), "");
  188. static_assert((std::is_same<decltype(std::ceil((unsigned int)0)), double>::value), "");
  189. static_assert((std::is_same<decltype(std::ceil((long)0)), double>::value), "");
  190. static_assert((std::is_same<decltype(std::ceil((unsigned long)0)), double>::value), "");
  191. static_assert((std::is_same<decltype(std::ceil((long long)0)), double>::value), "");
  192. static_assert((std::is_same<decltype(std::ceil((unsigned long long)0)), double>::value), "");
  193. static_assert((std::is_same<decltype(std::ceil((double)0)), double>::value), "");
  194. static_assert((std::is_same<decltype(std::ceil((long double)0)), long double>::value), "");
  195. static_assert((std::is_same<decltype(std::ceilf(0)), float>::value), "");
  196. static_assert((std::is_same<decltype(std::ceill(0)), long double>::value), "");
  197. static_assert((std::is_same<decltype(ceil(Ambiguous())), Ambiguous>::value), "");
  198. assert(std::ceil(0) == 0);
  199. }
  200. void test_cos()
  201. {
  202. static_assert((std::is_same<decltype(std::cos((float)0)), float>::value), "");
  203. static_assert((std::is_same<decltype(std::cos((bool)0)), double>::value), "");
  204. static_assert((std::is_same<decltype(std::cos((unsigned short)0)), double>::value), "");
  205. static_assert((std::is_same<decltype(std::cos((int)0)), double>::value), "");
  206. static_assert((std::is_same<decltype(std::cos((unsigned int)0)), double>::value), "");
  207. static_assert((std::is_same<decltype(std::cos((long)0)), double>::value), "");
  208. static_assert((std::is_same<decltype(std::cos((unsigned long)0)), double>::value), "");
  209. static_assert((std::is_same<decltype(std::cos((long long)0)), double>::value), "");
  210. static_assert((std::is_same<decltype(std::cos((unsigned long long)0)), double>::value), "");
  211. static_assert((std::is_same<decltype(std::cos((double)0)), double>::value), "");
  212. static_assert((std::is_same<decltype(std::cos((long double)0)), long double>::value), "");
  213. static_assert((std::is_same<decltype(std::cosf(0)), float>::value), "");
  214. static_assert((std::is_same<decltype(std::cosl(0)), long double>::value), "");
  215. static_assert((std::is_same<decltype(cos(Ambiguous())), Ambiguous>::value), "");
  216. assert(std::cos(0) == 1);
  217. }
  218. void test_cosh()
  219. {
  220. static_assert((std::is_same<decltype(std::cosh((float)0)), float>::value), "");
  221. static_assert((std::is_same<decltype(std::cosh((bool)0)), double>::value), "");
  222. static_assert((std::is_same<decltype(std::cosh((unsigned short)0)), double>::value), "");
  223. static_assert((std::is_same<decltype(std::cosh((int)0)), double>::value), "");
  224. static_assert((std::is_same<decltype(std::cosh((unsigned int)0)), double>::value), "");
  225. static_assert((std::is_same<decltype(std::cosh((long)0)), double>::value), "");
  226. static_assert((std::is_same<decltype(std::cosh((unsigned long)0)), double>::value), "");
  227. static_assert((std::is_same<decltype(std::cosh((long long)0)), double>::value), "");
  228. static_assert((std::is_same<decltype(std::cosh((unsigned long long)0)), double>::value), "");
  229. static_assert((std::is_same<decltype(std::cosh((double)0)), double>::value), "");
  230. static_assert((std::is_same<decltype(std::cosh((long double)0)), long double>::value), "");
  231. static_assert((std::is_same<decltype(std::coshf(0)), float>::value), "");
  232. static_assert((std::is_same<decltype(std::coshl(0)), long double>::value), "");
  233. static_assert((std::is_same<decltype(cosh(Ambiguous())), Ambiguous>::value), "");
  234. assert(std::cosh(0) == 1);
  235. }
  236. void test_exp()
  237. {
  238. static_assert((std::is_same<decltype(std::exp((float)0)), float>::value), "");
  239. static_assert((std::is_same<decltype(std::exp((bool)0)), double>::value), "");
  240. static_assert((std::is_same<decltype(std::exp((unsigned short)0)), double>::value), "");
  241. static_assert((std::is_same<decltype(std::exp((int)0)), double>::value), "");
  242. static_assert((std::is_same<decltype(std::exp((unsigned int)0)), double>::value), "");
  243. static_assert((std::is_same<decltype(std::exp((long)0)), double>::value), "");
  244. static_assert((std::is_same<decltype(std::exp((unsigned long)0)), double>::value), "");
  245. static_assert((std::is_same<decltype(std::exp((long long)0)), double>::value), "");
  246. static_assert((std::is_same<decltype(std::exp((unsigned long long)0)), double>::value), "");
  247. static_assert((std::is_same<decltype(std::exp((double)0)), double>::value), "");
  248. static_assert((std::is_same<decltype(std::exp((long double)0)), long double>::value), "");
  249. static_assert((std::is_same<decltype(std::expf(0)), float>::value), "");
  250. static_assert((std::is_same<decltype(std::expl(0)), long double>::value), "");
  251. static_assert((std::is_same<decltype(exp(Ambiguous())), Ambiguous>::value), "");
  252. assert(std::exp(0) == 1);
  253. }
  254. void test_fabs()
  255. {
  256. static_assert((std::is_same<decltype(std::fabs((float)0)), float>::value), "");
  257. static_assert((std::is_same<decltype(std::fabs((bool)0)), double>::value), "");
  258. static_assert((std::is_same<decltype(std::fabs((unsigned short)0)), double>::value), "");
  259. static_assert((std::is_same<decltype(std::fabs((int)0)), double>::value), "");
  260. static_assert((std::is_same<decltype(std::fabs((unsigned int)0)), double>::value), "");
  261. static_assert((std::is_same<decltype(std::fabs((long)0)), double>::value), "");
  262. static_assert((std::is_same<decltype(std::fabs((unsigned long)0)), double>::value), "");
  263. static_assert((std::is_same<decltype(std::fabs((long long)0)), double>::value), "");
  264. static_assert((std::is_same<decltype(std::fabs((unsigned long long)0)), double>::value), "");
  265. static_assert((std::is_same<decltype(std::fabs((double)0)), double>::value), "");
  266. static_assert((std::is_same<decltype(std::fabs((long double)0)), long double>::value), "");
  267. static_assert((std::is_same<decltype(std::fabsf(0.0f)), float>::value), "");
  268. static_assert((std::is_same<decltype(std::fabsl(0.0L)), long double>::value), "");
  269. static_assert((std::is_same<decltype(fabs(Ambiguous())), Ambiguous>::value), "");
  270. assert(std::fabs(-1) == 1);
  271. }
  272. void test_floor()
  273. {
  274. static_assert((std::is_same<decltype(std::floor((float)0)), float>::value), "");
  275. static_assert((std::is_same<decltype(std::floor((bool)0)), double>::value), "");
  276. static_assert((std::is_same<decltype(std::floor((unsigned short)0)), double>::value), "");
  277. static_assert((std::is_same<decltype(std::floor((int)0)), double>::value), "");
  278. static_assert((std::is_same<decltype(std::floor((unsigned int)0)), double>::value), "");
  279. static_assert((std::is_same<decltype(std::floor((long)0)), double>::value), "");
  280. static_assert((std::is_same<decltype(std::floor((unsigned long)0)), double>::value), "");
  281. static_assert((std::is_same<decltype(std::floor((long long)0)), double>::value), "");
  282. static_assert((std::is_same<decltype(std::floor((unsigned long long)0)), double>::value), "");
  283. static_assert((std::is_same<decltype(std::floor((double)0)), double>::value), "");
  284. static_assert((std::is_same<decltype(std::floor((long double)0)), long double>::value), "");
  285. static_assert((std::is_same<decltype(std::floorf(0)), float>::value), "");
  286. static_assert((std::is_same<decltype(std::floorl(0)), long double>::value), "");
  287. static_assert((std::is_same<decltype(floor(Ambiguous())), Ambiguous>::value), "");
  288. assert(std::floor(1) == 1);
  289. }
  290. void test_fmod()
  291. {
  292. static_assert((std::is_same<decltype(std::fmod((float)0, (float)0)), float>::value), "");
  293. static_assert((std::is_same<decltype(std::fmod((bool)0, (float)0)), double>::value), "");
  294. static_assert((std::is_same<decltype(std::fmod((unsigned short)0, (double)0)), double>::value), "");
  295. static_assert((std::is_same<decltype(std::fmod((int)0, (long double)0)), long double>::value), "");
  296. static_assert((std::is_same<decltype(std::fmod((float)0, (unsigned int)0)), double>::value), "");
  297. static_assert((std::is_same<decltype(std::fmod((double)0, (long)0)), double>::value), "");
  298. static_assert((std::is_same<decltype(std::fmod((long double)0, (unsigned long)0)), long double>::value), "");
  299. static_assert((std::is_same<decltype(std::fmod((int)0, (long long)0)), double>::value), "");
  300. static_assert((std::is_same<decltype(std::fmod((int)0, (unsigned long long)0)), double>::value), "");
  301. static_assert((std::is_same<decltype(std::fmod((double)0, (double)0)), double>::value), "");
  302. static_assert((std::is_same<decltype(std::fmod((long double)0, (long double)0)), long double>::value), "");
  303. static_assert((std::is_same<decltype(std::fmod((float)0, (double)0)), double>::value), "");
  304. static_assert((std::is_same<decltype(std::fmod((float)0, (long double)0)), long double>::value), "");
  305. static_assert((std::is_same<decltype(std::fmod((double)0, (long double)0)), long double>::value), "");
  306. static_assert((std::is_same<decltype(std::fmodf(0,0)), float>::value), "");
  307. static_assert((std::is_same<decltype(std::fmodl(0,0)), long double>::value), "");
  308. static_assert((std::is_same<decltype(std::fmod((int)0, (int)0)), double>::value), "");
  309. static_assert((std::is_same<decltype(fmod(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  310. assert(std::fmod(1.5,1) == .5);
  311. }
  312. void test_frexp()
  313. {
  314. int ip;
  315. static_assert((std::is_same<decltype(std::frexp((float)0, &ip)), float>::value), "");
  316. static_assert((std::is_same<decltype(std::frexp((bool)0, &ip)), double>::value), "");
  317. static_assert((std::is_same<decltype(std::frexp((unsigned short)0, &ip)), double>::value), "");
  318. static_assert((std::is_same<decltype(std::frexp((int)0, &ip)), double>::value), "");
  319. static_assert((std::is_same<decltype(std::frexp((unsigned int)0, &ip)), double>::value), "");
  320. static_assert((std::is_same<decltype(std::frexp((long)0, &ip)), double>::value), "");
  321. static_assert((std::is_same<decltype(std::frexp((unsigned long)0, &ip)), double>::value), "");
  322. static_assert((std::is_same<decltype(std::frexp((long long)0, &ip)), double>::value), "");
  323. static_assert((std::is_same<decltype(std::frexp((unsigned long long)0, &ip)), double>::value), "");
  324. static_assert((std::is_same<decltype(std::frexp((double)0, &ip)), double>::value), "");
  325. static_assert((std::is_same<decltype(std::frexp((long double)0, &ip)), long double>::value), "");
  326. static_assert((std::is_same<decltype(std::frexpf(0, &ip)), float>::value), "");
  327. static_assert((std::is_same<decltype(std::frexpl(0, &ip)), long double>::value), "");
  328. static_assert((std::is_same<decltype(frexp(Ambiguous(), &ip)), Ambiguous>::value), "");
  329. assert(std::frexp(0, &ip) == 0);
  330. }
  331. void test_ldexp()
  332. {
  333. int ip = 1;
  334. static_assert((std::is_same<decltype(std::ldexp((float)0, ip)), float>::value), "");
  335. static_assert((std::is_same<decltype(std::ldexp((bool)0, ip)), double>::value), "");
  336. static_assert((std::is_same<decltype(std::ldexp((unsigned short)0, ip)), double>::value), "");
  337. static_assert((std::is_same<decltype(std::ldexp((int)0, ip)), double>::value), "");
  338. static_assert((std::is_same<decltype(std::ldexp((unsigned int)0, ip)), double>::value), "");
  339. static_assert((std::is_same<decltype(std::ldexp((long)0, ip)), double>::value), "");
  340. static_assert((std::is_same<decltype(std::ldexp((unsigned long)0, ip)), double>::value), "");
  341. static_assert((std::is_same<decltype(std::ldexp((long long)0, ip)), double>::value), "");
  342. static_assert((std::is_same<decltype(std::ldexp((unsigned long long)0, ip)), double>::value), "");
  343. static_assert((std::is_same<decltype(std::ldexp((double)0, ip)), double>::value), "");
  344. static_assert((std::is_same<decltype(std::ldexp((long double)0, ip)), long double>::value), "");
  345. static_assert((std::is_same<decltype(std::ldexpf(0, ip)), float>::value), "");
  346. static_assert((std::is_same<decltype(std::ldexpl(0, ip)), long double>::value), "");
  347. static_assert((std::is_same<decltype(ldexp(Ambiguous(), ip)), Ambiguous>::value), "");
  348. assert(std::ldexp(1, ip) == 2);
  349. }
  350. void test_log()
  351. {
  352. static_assert((std::is_same<decltype(std::log((float)0)), float>::value), "");
  353. static_assert((std::is_same<decltype(std::log((bool)0)), double>::value), "");
  354. static_assert((std::is_same<decltype(std::log((unsigned short)0)), double>::value), "");
  355. static_assert((std::is_same<decltype(std::log((int)0)), double>::value), "");
  356. static_assert((std::is_same<decltype(std::log((unsigned int)0)), double>::value), "");
  357. static_assert((std::is_same<decltype(std::log((long)0)), double>::value), "");
  358. static_assert((std::is_same<decltype(std::log((unsigned long)0)), double>::value), "");
  359. static_assert((std::is_same<decltype(std::log((long long)0)), double>::value), "");
  360. static_assert((std::is_same<decltype(std::log((unsigned long long)0)), double>::value), "");
  361. static_assert((std::is_same<decltype(std::log((double)0)), double>::value), "");
  362. static_assert((std::is_same<decltype(std::log((long double)0)), long double>::value), "");
  363. static_assert((std::is_same<decltype(std::logf(0)), float>::value), "");
  364. static_assert((std::is_same<decltype(std::logl(0)), long double>::value), "");
  365. static_assert((std::is_same<decltype(log(Ambiguous())), Ambiguous>::value), "");
  366. assert(std::log(1) == 0);
  367. }
  368. void test_log10()
  369. {
  370. static_assert((std::is_same<decltype(std::log10((float)0)), float>::value), "");
  371. static_assert((std::is_same<decltype(std::log10((bool)0)), double>::value), "");
  372. static_assert((std::is_same<decltype(std::log10((unsigned short)0)), double>::value), "");
  373. static_assert((std::is_same<decltype(std::log10((int)0)), double>::value), "");
  374. static_assert((std::is_same<decltype(std::log10((unsigned int)0)), double>::value), "");
  375. static_assert((std::is_same<decltype(std::log10((long)0)), double>::value), "");
  376. static_assert((std::is_same<decltype(std::log10((unsigned long)0)), double>::value), "");
  377. static_assert((std::is_same<decltype(std::log10((long long)0)), double>::value), "");
  378. static_assert((std::is_same<decltype(std::log10((unsigned long long)0)), double>::value), "");
  379. static_assert((std::is_same<decltype(std::log10((double)0)), double>::value), "");
  380. static_assert((std::is_same<decltype(std::log10((long double)0)), long double>::value), "");
  381. static_assert((std::is_same<decltype(std::log10f(0)), float>::value), "");
  382. static_assert((std::is_same<decltype(std::log10l(0)), long double>::value), "");
  383. static_assert((std::is_same<decltype(log10(Ambiguous())), Ambiguous>::value), "");
  384. assert(std::log10(1) == 0);
  385. }
  386. void test_modf()
  387. {
  388. static_assert((std::is_same<decltype(std::modf((float)0, (float*)0)), float>::value), "");
  389. static_assert((std::is_same<decltype(std::modf((double)0, (double*)0)), double>::value), "");
  390. static_assert((std::is_same<decltype(std::modf((long double)0, (long double*)0)), long double>::value), "");
  391. static_assert((std::is_same<decltype(std::modff(0, (float*)0)), float>::value), "");
  392. static_assert((std::is_same<decltype(std::modfl(0, (long double*)0)), long double>::value), "");
  393. static_assert((std::is_same<decltype(modf(Ambiguous(), (Ambiguous*)0)), Ambiguous>::value), "");
  394. double i;
  395. assert(std::modf(1., &i) == 0);
  396. }
  397. void test_pow()
  398. {
  399. static_assert((std::is_same<decltype(std::pow((float)0, (float)0)), float>::value), "");
  400. static_assert((std::is_same<decltype(std::pow((bool)0, (float)0)), double>::value), "");
  401. static_assert((std::is_same<decltype(std::pow((unsigned short)0, (double)0)), double>::value), "");
  402. static_assert((std::is_same<decltype(std::pow((int)0, (long double)0)), long double>::value), "");
  403. static_assert((std::is_same<decltype(std::pow((float)0, (unsigned int)0)), double>::value), "");
  404. static_assert((std::is_same<decltype(std::pow((double)0, (long)0)), double>::value), "");
  405. static_assert((std::is_same<decltype(std::pow((long double)0, (unsigned long)0)), long double>::value), "");
  406. static_assert((std::is_same<decltype(std::pow((int)0, (long long)0)), double>::value), "");
  407. static_assert((std::is_same<decltype(std::pow((int)0, (unsigned long long)0)), double>::value), "");
  408. static_assert((std::is_same<decltype(std::pow((double)0, (double)0)), double>::value), "");
  409. static_assert((std::is_same<decltype(std::pow((long double)0, (long double)0)), long double>::value), "");
  410. static_assert((std::is_same<decltype(std::pow((float)0, (double)0)), double>::value), "");
  411. static_assert((std::is_same<decltype(std::pow((float)0, (long double)0)), long double>::value), "");
  412. static_assert((std::is_same<decltype(std::pow((double)0, (long double)0)), long double>::value), "");
  413. static_assert((std::is_same<decltype(std::powf(0,0)), float>::value), "");
  414. static_assert((std::is_same<decltype(std::powl(0,0)), long double>::value), "");
  415. static_assert((std::is_same<decltype(std::pow((int)0, (int)0)), double>::value), "");
  416. // static_assert((std::is_same<decltype(std::pow(Value<int>(), (int)0)), double>::value), "");
  417. // static_assert((std::is_same<decltype(std::pow(Value<long double>(), (float)0)), long double>::value), "");
  418. // static_assert((std::is_same<decltype(std::pow((float) 0, Value<float>())), float>::value), "");
  419. static_assert((std::is_same<decltype(pow(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  420. assert(std::pow(1,1) == 1);
  421. // assert(std::pow(Value<int,1>(), Value<float,1>()) == 1);
  422. // assert(std::pow(1.0f, Value<double,1>()) == 1);
  423. // assert(std::pow(1.0, Value<int,1>()) == 1);
  424. // assert(std::pow(Value<long double,1>(), 1LL) == 1);
  425. }
  426. void test_sin()
  427. {
  428. static_assert((std::is_same<decltype(std::sin((float)0)), float>::value), "");
  429. static_assert((std::is_same<decltype(std::sin((bool)0)), double>::value), "");
  430. static_assert((std::is_same<decltype(std::sin((unsigned short)0)), double>::value), "");
  431. static_assert((std::is_same<decltype(std::sin((int)0)), double>::value), "");
  432. static_assert((std::is_same<decltype(std::sin((unsigned int)0)), double>::value), "");
  433. static_assert((std::is_same<decltype(std::sin((long)0)), double>::value), "");
  434. static_assert((std::is_same<decltype(std::sin((unsigned long)0)), double>::value), "");
  435. static_assert((std::is_same<decltype(std::sin((long long)0)), double>::value), "");
  436. static_assert((std::is_same<decltype(std::sin((unsigned long long)0)), double>::value), "");
  437. static_assert((std::is_same<decltype(std::sin((double)0)), double>::value), "");
  438. static_assert((std::is_same<decltype(std::sin((long double)0)), long double>::value), "");
  439. static_assert((std::is_same<decltype(std::sinf(0)), float>::value), "");
  440. static_assert((std::is_same<decltype(std::sinl(0)), long double>::value), "");
  441. static_assert((std::is_same<decltype(sin(Ambiguous())), Ambiguous>::value), "");
  442. assert(std::sin(0) == 0);
  443. }
  444. void test_sinh()
  445. {
  446. static_assert((std::is_same<decltype(std::sinh((float)0)), float>::value), "");
  447. static_assert((std::is_same<decltype(std::sinh((bool)0)), double>::value), "");
  448. static_assert((std::is_same<decltype(std::sinh((unsigned short)0)), double>::value), "");
  449. static_assert((std::is_same<decltype(std::sinh((int)0)), double>::value), "");
  450. static_assert((std::is_same<decltype(std::sinh((unsigned int)0)), double>::value), "");
  451. static_assert((std::is_same<decltype(std::sinh((long)0)), double>::value), "");
  452. static_assert((std::is_same<decltype(std::sinh((unsigned long)0)), double>::value), "");
  453. static_assert((std::is_same<decltype(std::sinh((long long)0)), double>::value), "");
  454. static_assert((std::is_same<decltype(std::sinh((unsigned long long)0)), double>::value), "");
  455. static_assert((std::is_same<decltype(std::sinh((double)0)), double>::value), "");
  456. static_assert((std::is_same<decltype(std::sinh((long double)0)), long double>::value), "");
  457. static_assert((std::is_same<decltype(std::sinhf(0)), float>::value), "");
  458. static_assert((std::is_same<decltype(std::sinhl(0)), long double>::value), "");
  459. static_assert((std::is_same<decltype(sinh(Ambiguous())), Ambiguous>::value), "");
  460. assert(std::sinh(0) == 0);
  461. }
  462. void test_sqrt()
  463. {
  464. static_assert((std::is_same<decltype(std::sqrt((float)0)), float>::value), "");
  465. static_assert((std::is_same<decltype(std::sqrt((bool)0)), double>::value), "");
  466. static_assert((std::is_same<decltype(std::sqrt((unsigned short)0)), double>::value), "");
  467. static_assert((std::is_same<decltype(std::sqrt((int)0)), double>::value), "");
  468. static_assert((std::is_same<decltype(std::sqrt((unsigned int)0)), double>::value), "");
  469. static_assert((std::is_same<decltype(std::sqrt((long)0)), double>::value), "");
  470. static_assert((std::is_same<decltype(std::sqrt((unsigned long)0)), double>::value), "");
  471. static_assert((std::is_same<decltype(std::sqrt((long long)0)), double>::value), "");
  472. static_assert((std::is_same<decltype(std::sqrt((unsigned long long)0)), double>::value), "");
  473. static_assert((std::is_same<decltype(std::sqrt((double)0)), double>::value), "");
  474. static_assert((std::is_same<decltype(std::sqrt((long double)0)), long double>::value), "");
  475. static_assert((std::is_same<decltype(std::sqrtf(0)), float>::value), "");
  476. static_assert((std::is_same<decltype(std::sqrtl(0)), long double>::value), "");
  477. static_assert((std::is_same<decltype(sqrt(Ambiguous())), Ambiguous>::value), "");
  478. assert(std::sqrt(4) == 2);
  479. }
  480. void test_tan()
  481. {
  482. static_assert((std::is_same<decltype(std::tan((float)0)), float>::value), "");
  483. static_assert((std::is_same<decltype(std::tan((bool)0)), double>::value), "");
  484. static_assert((std::is_same<decltype(std::tan((unsigned short)0)), double>::value), "");
  485. static_assert((std::is_same<decltype(std::tan((int)0)), double>::value), "");
  486. static_assert((std::is_same<decltype(std::tan((unsigned int)0)), double>::value), "");
  487. static_assert((std::is_same<decltype(std::tan((long)0)), double>::value), "");
  488. static_assert((std::is_same<decltype(std::tan((unsigned long)0)), double>::value), "");
  489. static_assert((std::is_same<decltype(std::tan((long long)0)), double>::value), "");
  490. static_assert((std::is_same<decltype(std::tan((unsigned long long)0)), double>::value), "");
  491. static_assert((std::is_same<decltype(std::tan((double)0)), double>::value), "");
  492. static_assert((std::is_same<decltype(std::tan((long double)0)), long double>::value), "");
  493. static_assert((std::is_same<decltype(std::tanf(0)), float>::value), "");
  494. static_assert((std::is_same<decltype(std::tanl(0)), long double>::value), "");
  495. static_assert((std::is_same<decltype(tan(Ambiguous())), Ambiguous>::value), "");
  496. assert(std::tan(0) == 0);
  497. }
  498. void test_tanh()
  499. {
  500. static_assert((std::is_same<decltype(std::tanh((float)0)), float>::value), "");
  501. static_assert((std::is_same<decltype(std::tanh((bool)0)), double>::value), "");
  502. static_assert((std::is_same<decltype(std::tanh((unsigned short)0)), double>::value), "");
  503. static_assert((std::is_same<decltype(std::tanh((int)0)), double>::value), "");
  504. static_assert((std::is_same<decltype(std::tanh((unsigned int)0)), double>::value), "");
  505. static_assert((std::is_same<decltype(std::tanh((long)0)), double>::value), "");
  506. static_assert((std::is_same<decltype(std::tanh((unsigned long)0)), double>::value), "");
  507. static_assert((std::is_same<decltype(std::tanh((long long)0)), double>::value), "");
  508. static_assert((std::is_same<decltype(std::tanh((unsigned long long)0)), double>::value), "");
  509. static_assert((std::is_same<decltype(std::tanh((double)0)), double>::value), "");
  510. static_assert((std::is_same<decltype(std::tanh((long double)0)), long double>::value), "");
  511. static_assert((std::is_same<decltype(std::tanhf(0)), float>::value), "");
  512. static_assert((std::is_same<decltype(std::tanhl(0)), long double>::value), "");
  513. static_assert((std::is_same<decltype(tanh(Ambiguous())), Ambiguous>::value), "");
  514. assert(std::tanh(0) == 0);
  515. }
  516. void test_signbit()
  517. {
  518. #ifdef signbit
  519. #error signbit defined
  520. #endif
  521. static_assert((std::is_same<decltype(std::signbit((float)0)), bool>::value), "");
  522. static_assert((std::is_same<decltype(std::signbit((double)0)), bool>::value), "");
  523. static_assert((std::is_same<decltype(std::signbit(0)), bool>::value), "");
  524. static_assert((std::is_same<decltype(std::signbit((long double)0)), bool>::value), "");
  525. static_assert((std::is_same<decltype(signbit(Ambiguous())), Ambiguous>::value), "");
  526. assert(std::signbit(-1.0) == true);
  527. assert(std::signbit(0u) == false);
  528. assert(std::signbit(std::numeric_limits<unsigned>::max()) == false);
  529. assert(std::signbit(0) == false);
  530. assert(std::signbit(1) == false);
  531. assert(std::signbit(-1) == true);
  532. assert(std::signbit(std::numeric_limits<int>::max()) == false);
  533. assert(std::signbit(std::numeric_limits<int>::min()) == true);
  534. }
  535. void test_fpclassify()
  536. {
  537. #ifdef fpclassify
  538. #error fpclassify defined
  539. #endif
  540. static_assert((std::is_same<decltype(std::fpclassify((float)0)), int>::value), "");
  541. static_assert((std::is_same<decltype(std::fpclassify((double)0)), int>::value), "");
  542. static_assert((std::is_same<decltype(std::fpclassify(0)), int>::value), "");
  543. static_assert((std::is_same<decltype(std::fpclassify((long double)0)), int>::value), "");
  544. static_assert((std::is_same<decltype(fpclassify(Ambiguous())), Ambiguous>::value), "");
  545. assert(std::fpclassify(-1.0) == FP_NORMAL);
  546. assert(std::fpclassify(0) == FP_ZERO);
  547. assert(std::fpclassify(1) == FP_NORMAL);
  548. assert(std::fpclassify(-1) == FP_NORMAL);
  549. assert(std::fpclassify(std::numeric_limits<int>::max()) == FP_NORMAL);
  550. assert(std::fpclassify(std::numeric_limits<int>::min()) == FP_NORMAL);
  551. }
  552. void test_isfinite()
  553. {
  554. #ifdef isfinite
  555. #error isfinite defined
  556. #endif
  557. static_assert((std::is_same<decltype(std::isfinite((float)0)), bool>::value), "");
  558. static_assert((std::is_same<decltype(std::isfinite((double)0)), bool>::value), "");
  559. static_assert((std::is_same<decltype(std::isfinite(0)), bool>::value), "");
  560. static_assert((std::is_same<decltype(std::isfinite((long double)0)), bool>::value), "");
  561. static_assert((std::is_same<decltype(isfinite(Ambiguous())), Ambiguous>::value), "");
  562. assert(std::isfinite(-1.0) == true);
  563. assert(std::isfinite(0) == true);
  564. assert(std::isfinite(1) == true);
  565. assert(std::isfinite(-1) == true);
  566. assert(std::isfinite(std::numeric_limits<int>::max()) == true);
  567. assert(std::isfinite(std::numeric_limits<int>::min()) == true);
  568. }
  569. void test_isnormal()
  570. {
  571. #ifdef isnormal
  572. #error isnormal defined
  573. #endif
  574. static_assert((std::is_same<decltype(std::isnormal((float)0)), bool>::value), "");
  575. static_assert((std::is_same<decltype(std::isnormal((double)0)), bool>::value), "");
  576. static_assert((std::is_same<decltype(std::isnormal(0)), bool>::value), "");
  577. static_assert((std::is_same<decltype(std::isnormal((long double)0)), bool>::value), "");
  578. static_assert((std::is_same<decltype(isnormal(Ambiguous())), Ambiguous>::value), "");
  579. assert(std::isnormal(-1.0) == true);
  580. assert(std::isnormal(0) == false);
  581. assert(std::isnormal(1) == true);
  582. assert(std::isnormal(-1) == true);
  583. assert(std::isnormal(std::numeric_limits<int>::max()) == true);
  584. assert(std::isnormal(std::numeric_limits<int>::min()) == true);
  585. }
  586. void test_isgreater()
  587. {
  588. #ifdef isgreater
  589. #error isgreater defined
  590. #endif
  591. static_assert((std::is_same<decltype(std::isgreater((float)0, (float)0)), bool>::value), "");
  592. static_assert((std::is_same<decltype(std::isgreater((float)0, (double)0)), bool>::value), "");
  593. static_assert((std::is_same<decltype(std::isgreater((float)0, (long double)0)), bool>::value), "");
  594. static_assert((std::is_same<decltype(std::isgreater((double)0, (float)0)), bool>::value), "");
  595. static_assert((std::is_same<decltype(std::isgreater((double)0, (double)0)), bool>::value), "");
  596. static_assert((std::is_same<decltype(std::isgreater(0, (double)0)), bool>::value), "");
  597. static_assert((std::is_same<decltype(std::isgreater((double)0, (long double)0)), bool>::value), "");
  598. static_assert((std::is_same<decltype(std::isgreater((long double)0, (float)0)), bool>::value), "");
  599. static_assert((std::is_same<decltype(std::isgreater((long double)0, (double)0)), bool>::value), "");
  600. static_assert((std::is_same<decltype(std::isgreater((long double)0, (long double)0)), bool>::value), "");
  601. static_assert((std::is_same<decltype(isgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  602. assert(std::isgreater(-1.0, 0.F) == false);
  603. }
  604. void test_isgreaterequal()
  605. {
  606. #ifdef isgreaterequal
  607. #error isgreaterequal defined
  608. #endif
  609. static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (float)0)), bool>::value), "");
  610. static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (double)0)), bool>::value), "");
  611. static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (long double)0)), bool>::value), "");
  612. static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (float)0)), bool>::value), "");
  613. static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (double)0)), bool>::value), "");
  614. static_assert((std::is_same<decltype(std::isgreaterequal(0, (double)0)), bool>::value), "");
  615. static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (long double)0)), bool>::value), "");
  616. static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (float)0)), bool>::value), "");
  617. static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (double)0)), bool>::value), "");
  618. static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (long double)0)), bool>::value), "");
  619. static_assert((std::is_same<decltype(isgreaterequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  620. assert(std::isgreaterequal(-1.0, 0.F) == false);
  621. }
  622. void test_isinf()
  623. {
  624. #ifdef isinf
  625. #error isinf defined
  626. #endif
  627. static_assert((std::is_same<decltype(std::isinf((float)0)), bool>::value), "");
  628. typedef decltype(std::isinf((double)0)) DoubleRetType;
  629. #if !defined(__linux__) || defined(__clang__)
  630. static_assert((std::is_same<DoubleRetType, bool>::value), "");
  631. #else
  632. // GLIBC < 2.23 defines 'isinf(double)' with a return type of 'int' in
  633. // all C++ dialects. The test should tolerate this when libc++ can't work
  634. // around it.
  635. // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
  636. static_assert((std::is_same<DoubleRetType, bool>::value
  637. || std::is_same<DoubleRetType, int>::value), "");
  638. #endif
  639. static_assert((std::is_same<decltype(std::isinf(0)), bool>::value), "");
  640. static_assert((std::is_same<decltype(std::isinf((long double)0)), bool>::value), "");
  641. assert(std::isinf(-1.0) == false);
  642. assert(std::isinf(0) == false);
  643. assert(std::isinf(1) == false);
  644. assert(std::isinf(-1) == false);
  645. assert(std::isinf(std::numeric_limits<int>::max()) == false);
  646. assert(std::isinf(std::numeric_limits<int>::min()) == false);
  647. }
  648. void test_isless()
  649. {
  650. #ifdef isless
  651. #error isless defined
  652. #endif
  653. static_assert((std::is_same<decltype(std::isless((float)0, (float)0)), bool>::value), "");
  654. static_assert((std::is_same<decltype(std::isless((float)0, (double)0)), bool>::value), "");
  655. static_assert((std::is_same<decltype(std::isless((float)0, (long double)0)), bool>::value), "");
  656. static_assert((std::is_same<decltype(std::isless((double)0, (float)0)), bool>::value), "");
  657. static_assert((std::is_same<decltype(std::isless((double)0, (double)0)), bool>::value), "");
  658. static_assert((std::is_same<decltype(std::isless(0, (double)0)), bool>::value), "");
  659. static_assert((std::is_same<decltype(std::isless((double)0, (long double)0)), bool>::value), "");
  660. static_assert((std::is_same<decltype(std::isless((long double)0, (float)0)), bool>::value), "");
  661. static_assert((std::is_same<decltype(std::isless((long double)0, (double)0)), bool>::value), "");
  662. static_assert((std::is_same<decltype(std::isless((long double)0, (long double)0)), bool>::value), "");
  663. static_assert((std::is_same<decltype(isless(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  664. assert(std::isless(-1.0, 0.F) == true);
  665. }
  666. void test_islessequal()
  667. {
  668. #ifdef islessequal
  669. #error islessequal defined
  670. #endif
  671. static_assert((std::is_same<decltype(std::islessequal((float)0, (float)0)), bool>::value), "");
  672. static_assert((std::is_same<decltype(std::islessequal((float)0, (double)0)), bool>::value), "");
  673. static_assert((std::is_same<decltype(std::islessequal((float)0, (long double)0)), bool>::value), "");
  674. static_assert((std::is_same<decltype(std::islessequal((double)0, (float)0)), bool>::value), "");
  675. static_assert((std::is_same<decltype(std::islessequal((double)0, (double)0)), bool>::value), "");
  676. static_assert((std::is_same<decltype(std::islessequal(0, (double)0)), bool>::value), "");
  677. static_assert((std::is_same<decltype(std::islessequal((double)0, (long double)0)), bool>::value), "");
  678. static_assert((std::is_same<decltype(std::islessequal((long double)0, (float)0)), bool>::value), "");
  679. static_assert((std::is_same<decltype(std::islessequal((long double)0, (double)0)), bool>::value), "");
  680. static_assert((std::is_same<decltype(std::islessequal((long double)0, (long double)0)), bool>::value), "");
  681. static_assert((std::is_same<decltype(islessequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  682. assert(std::islessequal(-1.0, 0.F) == true);
  683. }
  684. void test_islessgreater()
  685. {
  686. #ifdef islessgreater
  687. #error islessgreater defined
  688. #endif
  689. static_assert((std::is_same<decltype(std::islessgreater((float)0, (float)0)), bool>::value), "");
  690. static_assert((std::is_same<decltype(std::islessgreater((float)0, (double)0)), bool>::value), "");
  691. static_assert((std::is_same<decltype(std::islessgreater((float)0, (long double)0)), bool>::value), "");
  692. static_assert((std::is_same<decltype(std::islessgreater((double)0, (float)0)), bool>::value), "");
  693. static_assert((std::is_same<decltype(std::islessgreater((double)0, (double)0)), bool>::value), "");
  694. static_assert((std::is_same<decltype(std::islessgreater(0, (double)0)), bool>::value), "");
  695. static_assert((std::is_same<decltype(std::islessgreater((double)0, (long double)0)), bool>::value), "");
  696. static_assert((std::is_same<decltype(std::islessgreater((long double)0, (float)0)), bool>::value), "");
  697. static_assert((std::is_same<decltype(std::islessgreater((long double)0, (double)0)), bool>::value), "");
  698. static_assert((std::is_same<decltype(std::islessgreater((long double)0, (long double)0)), bool>::value), "");
  699. static_assert((std::is_same<decltype(islessgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  700. assert(std::islessgreater(-1.0, 0.F) == true);
  701. }
  702. void test_isnan()
  703. {
  704. #ifdef isnan
  705. #error isnan defined
  706. #endif
  707. static_assert((std::is_same<decltype(std::isnan((float)0)), bool>::value), "");
  708. typedef decltype(std::isnan((double)0)) DoubleRetType;
  709. #if !defined(__linux__) || defined(__clang__)
  710. static_assert((std::is_same<DoubleRetType, bool>::value), "");
  711. #else
  712. // GLIBC < 2.23 defines 'isinf(double)' with a return type of 'int' in
  713. // all C++ dialects. The test should tolerate this when libc++ can't work
  714. // around it.
  715. // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439
  716. static_assert((std::is_same<DoubleRetType, bool>::value
  717. || std::is_same<DoubleRetType, int>::value), "");
  718. #endif
  719. static_assert((std::is_same<decltype(std::isnan(0)), bool>::value), "");
  720. static_assert((std::is_same<decltype(std::isnan((long double)0)), bool>::value), "");
  721. assert(std::isnan(-1.0) == false);
  722. assert(std::isnan(0) == false);
  723. assert(std::isnan(1) == false);
  724. assert(std::isnan(-1) == false);
  725. assert(std::isnan(std::numeric_limits<int>::max()) == false);
  726. assert(std::isnan(std::numeric_limits<int>::min()) == false);
  727. }
  728. void test_isunordered()
  729. {
  730. #ifdef isunordered
  731. #error isunordered defined
  732. #endif
  733. static_assert((std::is_same<decltype(std::isunordered((float)0, (float)0)), bool>::value), "");
  734. static_assert((std::is_same<decltype(std::isunordered((float)0, (double)0)), bool>::value), "");
  735. static_assert((std::is_same<decltype(std::isunordered((float)0, (long double)0)), bool>::value), "");
  736. static_assert((std::is_same<decltype(std::isunordered((double)0, (float)0)), bool>::value), "");
  737. static_assert((std::is_same<decltype(std::isunordered((double)0, (double)0)), bool>::value), "");
  738. static_assert((std::is_same<decltype(std::isunordered(0, (double)0)), bool>::value), "");
  739. static_assert((std::is_same<decltype(std::isunordered((double)0, (long double)0)), bool>::value), "");
  740. static_assert((std::is_same<decltype(std::isunordered((long double)0, (float)0)), bool>::value), "");
  741. static_assert((std::is_same<decltype(std::isunordered((long double)0, (double)0)), bool>::value), "");
  742. static_assert((std::is_same<decltype(std::isunordered((long double)0, (long double)0)), bool>::value), "");
  743. static_assert((std::is_same<decltype(isunordered(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  744. assert(std::isunordered(-1.0, 0.F) == false);
  745. }
  746. void test_acosh()
  747. {
  748. static_assert((std::is_same<decltype(std::acosh((float)0)), float>::value), "");
  749. static_assert((std::is_same<decltype(std::acosh((bool)0)), double>::value), "");
  750. static_assert((std::is_same<decltype(std::acosh((unsigned short)0)), double>::value), "");
  751. static_assert((std::is_same<decltype(std::acosh((int)0)), double>::value), "");
  752. static_assert((std::is_same<decltype(std::acosh((unsigned int)0)), double>::value), "");
  753. static_assert((std::is_same<decltype(std::acosh((long)0)), double>::value), "");
  754. static_assert((std::is_same<decltype(std::acosh((unsigned long)0)), double>::value), "");
  755. static_assert((std::is_same<decltype(std::acosh((long long)0)), double>::value), "");
  756. static_assert((std::is_same<decltype(std::acosh((unsigned long long)0)), double>::value), "");
  757. static_assert((std::is_same<decltype(std::acosh((double)0)), double>::value), "");
  758. static_assert((std::is_same<decltype(std::acosh((long double)0)), long double>::value), "");
  759. static_assert((std::is_same<decltype(std::acoshf(0)), float>::value), "");
  760. static_assert((std::is_same<decltype(std::acoshl(0)), long double>::value), "");
  761. static_assert((std::is_same<decltype(acosh(Ambiguous())), Ambiguous>::value), "");
  762. assert(std::acosh(1) == 0);
  763. }
  764. void test_asinh()
  765. {
  766. static_assert((std::is_same<decltype(std::asinh((float)0)), float>::value), "");
  767. static_assert((std::is_same<decltype(std::asinh((bool)0)), double>::value), "");
  768. static_assert((std::is_same<decltype(std::asinh((unsigned short)0)), double>::value), "");
  769. static_assert((std::is_same<decltype(std::asinh((int)0)), double>::value), "");
  770. static_assert((std::is_same<decltype(std::asinh((unsigned int)0)), double>::value), "");
  771. static_assert((std::is_same<decltype(std::asinh((long)0)), double>::value), "");
  772. static_assert((std::is_same<decltype(std::asinh((unsigned long)0)), double>::value), "");
  773. static_assert((std::is_same<decltype(std::asinh((long long)0)), double>::value), "");
  774. static_assert((std::is_same<decltype(std::asinh((unsigned long long)0)), double>::value), "");
  775. static_assert((std::is_same<decltype(std::asinh((double)0)), double>::value), "");
  776. static_assert((std::is_same<decltype(std::asinh((long double)0)), long double>::value), "");
  777. static_assert((std::is_same<decltype(std::asinhf(0)), float>::value), "");
  778. static_assert((std::is_same<decltype(std::asinhl(0)), long double>::value), "");
  779. static_assert((std::is_same<decltype(asinh(Ambiguous())), Ambiguous>::value), "");
  780. assert(std::asinh(0) == 0);
  781. }
  782. void test_atanh()
  783. {
  784. static_assert((std::is_same<decltype(std::atanh((float)0)), float>::value), "");
  785. static_assert((std::is_same<decltype(std::atanh((bool)0)), double>::value), "");
  786. static_assert((std::is_same<decltype(std::atanh((unsigned short)0)), double>::value), "");
  787. static_assert((std::is_same<decltype(std::atanh((int)0)), double>::value), "");
  788. static_assert((std::is_same<decltype(std::atanh((unsigned int)0)), double>::value), "");
  789. static_assert((std::is_same<decltype(std::atanh((long)0)), double>::value), "");
  790. static_assert((std::is_same<decltype(std::atanh((unsigned long)0)), double>::value), "");
  791. static_assert((std::is_same<decltype(std::atanh((long long)0)), double>::value), "");
  792. static_assert((std::is_same<decltype(std::atanh((unsigned long long)0)), double>::value), "");
  793. static_assert((std::is_same<decltype(std::atanh((double)0)), double>::value), "");
  794. static_assert((std::is_same<decltype(std::atanh((long double)0)), long double>::value), "");
  795. static_assert((std::is_same<decltype(std::atanhf(0)), float>::value), "");
  796. static_assert((std::is_same<decltype(std::atanhl(0)), long double>::value), "");
  797. static_assert((std::is_same<decltype(atanh(Ambiguous())), Ambiguous>::value), "");
  798. assert(std::atanh(0) == 0);
  799. }
  800. void test_cbrt()
  801. {
  802. static_assert((std::is_same<decltype(std::cbrt((float)0)), float>::value), "");
  803. static_assert((std::is_same<decltype(std::cbrt((bool)0)), double>::value), "");
  804. static_assert((std::is_same<decltype(std::cbrt((unsigned short)0)), double>::value), "");
  805. static_assert((std::is_same<decltype(std::cbrt((int)0)), double>::value), "");
  806. static_assert((std::is_same<decltype(std::cbrt((unsigned int)0)), double>::value), "");
  807. static_assert((std::is_same<decltype(std::cbrt((long)0)), double>::value), "");
  808. static_assert((std::is_same<decltype(std::cbrt((unsigned long)0)), double>::value), "");
  809. static_assert((std::is_same<decltype(std::cbrt((long long)0)), double>::value), "");
  810. static_assert((std::is_same<decltype(std::cbrt((unsigned long long)0)), double>::value), "");
  811. static_assert((std::is_same<decltype(std::cbrt((double)0)), double>::value), "");
  812. static_assert((std::is_same<decltype(std::cbrt((long double)0)), long double>::value), "");
  813. static_assert((std::is_same<decltype(std::cbrtf(0)), float>::value), "");
  814. static_assert((std::is_same<decltype(std::cbrtl(0)), long double>::value), "");
  815. static_assert((std::is_same<decltype(cbrt(Ambiguous())), Ambiguous>::value), "");
  816. assert(truncate_fp(std::cbrt(1)) == 1);
  817. }
  818. void test_copysign()
  819. {
  820. static_assert((std::is_same<decltype(std::copysign((float)0, (float)0)), float>::value), "");
  821. static_assert((std::is_same<decltype(std::copysign((bool)0, (float)0)), double>::value), "");
  822. static_assert((std::is_same<decltype(std::copysign((unsigned short)0, (double)0)), double>::value), "");
  823. static_assert((std::is_same<decltype(std::copysign((int)0, (long double)0)), long double>::value), "");
  824. static_assert((std::is_same<decltype(std::copysign((float)0, (unsigned int)0)), double>::value), "");
  825. static_assert((std::is_same<decltype(std::copysign((double)0, (long)0)), double>::value), "");
  826. static_assert((std::is_same<decltype(std::copysign((long double)0, (unsigned long)0)), long double>::value), "");
  827. static_assert((std::is_same<decltype(std::copysign((int)0, (long long)0)), double>::value), "");
  828. static_assert((std::is_same<decltype(std::copysign((int)0, (unsigned long long)0)), double>::value), "");
  829. static_assert((std::is_same<decltype(std::copysign((double)0, (double)0)), double>::value), "");
  830. static_assert((std::is_same<decltype(std::copysign((long double)0, (long double)0)), long double>::value), "");
  831. static_assert((std::is_same<decltype(std::copysign((float)0, (double)0)), double>::value), "");
  832. static_assert((std::is_same<decltype(std::copysign((float)0, (long double)0)), long double>::value), "");
  833. static_assert((std::is_same<decltype(std::copysign((double)0, (long double)0)), long double>::value), "");
  834. static_assert((std::is_same<decltype(std::copysignf(0,0)), float>::value), "");
  835. static_assert((std::is_same<decltype(std::copysignl(0,0)), long double>::value), "");
  836. static_assert((std::is_same<decltype(std::copysign((int)0, (int)0)), double>::value), "");
  837. static_assert((std::is_same<decltype(copysign(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  838. assert(std::copysign(1,1) == 1);
  839. }
  840. void test_erf()
  841. {
  842. static_assert((std::is_same<decltype(std::erf((float)0)), float>::value), "");
  843. static_assert((std::is_same<decltype(std::erf((bool)0)), double>::value), "");
  844. static_assert((std::is_same<decltype(std::erf((unsigned short)0)), double>::value), "");
  845. static_assert((std::is_same<decltype(std::erf((int)0)), double>::value), "");
  846. static_assert((std::is_same<decltype(std::erf((unsigned int)0)), double>::value), "");
  847. static_assert((std::is_same<decltype(std::erf((long)0)), double>::value), "");
  848. static_assert((std::is_same<decltype(std::erf((unsigned long)0)), double>::value), "");
  849. static_assert((std::is_same<decltype(std::erf((long long)0)), double>::value), "");
  850. static_assert((std::is_same<decltype(std::erf((unsigned long long)0)), double>::value), "");
  851. static_assert((std::is_same<decltype(std::erf((double)0)), double>::value), "");
  852. static_assert((std::is_same<decltype(std::erf((long double)0)), long double>::value), "");
  853. static_assert((std::is_same<decltype(std::erff(0)), float>::value), "");
  854. static_assert((std::is_same<decltype(std::erfl(0)), long double>::value), "");
  855. static_assert((std::is_same<decltype(erf(Ambiguous())), Ambiguous>::value), "");
  856. assert(std::erf(0) == 0);
  857. }
  858. void test_erfc()
  859. {
  860. static_assert((std::is_same<decltype(std::erfc((float)0)), float>::value), "");
  861. static_assert((std::is_same<decltype(std::erfc((bool)0)), double>::value), "");
  862. static_assert((std::is_same<decltype(std::erfc((unsigned short)0)), double>::value), "");
  863. static_assert((std::is_same<decltype(std::erfc((int)0)), double>::value), "");
  864. static_assert((std::is_same<decltype(std::erfc((unsigned int)0)), double>::value), "");
  865. static_assert((std::is_same<decltype(std::erfc((long)0)), double>::value), "");
  866. static_assert((std::is_same<decltype(std::erfc((unsigned long)0)), double>::value), "");
  867. static_assert((std::is_same<decltype(std::erfc((long long)0)), double>::value), "");
  868. static_assert((std::is_same<decltype(std::erfc((unsigned long long)0)), double>::value), "");
  869. static_assert((std::is_same<decltype(std::erfc((double)0)), double>::value), "");
  870. static_assert((std::is_same<decltype(std::erfc((long double)0)), long double>::value), "");
  871. static_assert((std::is_same<decltype(std::erfcf(0)), float>::value), "");
  872. static_assert((std::is_same<decltype(std::erfcl(0)), long double>::value), "");
  873. static_assert((std::is_same<decltype(erfc(Ambiguous())), Ambiguous>::value), "");
  874. assert(std::erfc(0) == 1);
  875. }
  876. void test_exp2()
  877. {
  878. static_assert((std::is_same<decltype(std::exp2((float)0)), float>::value), "");
  879. static_assert((std::is_same<decltype(std::exp2((bool)0)), double>::value), "");
  880. static_assert((std::is_same<decltype(std::exp2((unsigned short)0)), double>::value), "");
  881. static_assert((std::is_same<decltype(std::exp2((int)0)), double>::value), "");
  882. static_assert((std::is_same<decltype(std::exp2((unsigned int)0)), double>::value), "");
  883. static_assert((std::is_same<decltype(std::exp2((long)0)), double>::value), "");
  884. static_assert((std::is_same<decltype(std::exp2((unsigned long)0)), double>::value), "");
  885. static_assert((std::is_same<decltype(std::exp2((long long)0)), double>::value), "");
  886. static_assert((std::is_same<decltype(std::exp2((unsigned long long)0)), double>::value), "");
  887. static_assert((std::is_same<decltype(std::exp2((double)0)), double>::value), "");
  888. static_assert((std::is_same<decltype(std::exp2((long double)0)), long double>::value), "");
  889. static_assert((std::is_same<decltype(std::exp2f(0)), float>::value), "");
  890. static_assert((std::is_same<decltype(std::exp2l(0)), long double>::value), "");
  891. static_assert((std::is_same<decltype(exp2(Ambiguous())), Ambiguous>::value), "");
  892. assert(std::exp2(1) == 2);
  893. }
  894. void test_expm1()
  895. {
  896. static_assert((std::is_same<decltype(std::expm1((float)0)), float>::value), "");
  897. static_assert((std::is_same<decltype(std::expm1((bool)0)), double>::value), "");
  898. static_assert((std::is_same<decltype(std::expm1((unsigned short)0)), double>::value), "");
  899. static_assert((std::is_same<decltype(std::expm1((int)0)), double>::value), "");
  900. static_assert((std::is_same<decltype(std::expm1((unsigned int)0)), double>::value), "");
  901. static_assert((std::is_same<decltype(std::expm1((long)0)), double>::value), "");
  902. static_assert((std::is_same<decltype(std::expm1((unsigned long)0)), double>::value), "");
  903. static_assert((std::is_same<decltype(std::expm1((long long)0)), double>::value), "");
  904. static_assert((std::is_same<decltype(std::expm1((unsigned long long)0)), double>::value), "");
  905. static_assert((std::is_same<decltype(std::expm1((double)0)), double>::value), "");
  906. static_assert((std::is_same<decltype(std::expm1((long double)0)), long double>::value), "");
  907. static_assert((std::is_same<decltype(std::expm1f(0)), float>::value), "");
  908. static_assert((std::is_same<decltype(std::expm1l(0)), long double>::value), "");
  909. static_assert((std::is_same<decltype(expm1(Ambiguous())), Ambiguous>::value), "");
  910. assert(std::expm1(0) == 0);
  911. }
  912. void test_fdim()
  913. {
  914. static_assert((std::is_same<decltype(std::fdim((float)0, (float)0)), float>::value), "");
  915. static_assert((std::is_same<decltype(std::fdim((bool)0, (float)0)), double>::value), "");
  916. static_assert((std::is_same<decltype(std::fdim((unsigned short)0, (double)0)), double>::value), "");
  917. static_assert((std::is_same<decltype(std::fdim((int)0, (long double)0)), long double>::value), "");
  918. static_assert((std::is_same<decltype(std::fdim((float)0, (unsigned int)0)), double>::value), "");
  919. static_assert((std::is_same<decltype(std::fdim((double)0, (long)0)), double>::value), "");
  920. static_assert((std::is_same<decltype(std::fdim((long double)0, (unsigned long)0)), long double>::value), "");
  921. static_assert((std::is_same<decltype(std::fdim((int)0, (long long)0)), double>::value), "");
  922. static_assert((std::is_same<decltype(std::fdim((int)0, (unsigned long long)0)), double>::value), "");
  923. static_assert((std::is_same<decltype(std::fdim((double)0, (double)0)), double>::value), "");
  924. static_assert((std::is_same<decltype(std::fdim((long double)0, (long double)0)), long double>::value), "");
  925. static_assert((std::is_same<decltype(std::fdim((float)0, (double)0)), double>::value), "");
  926. static_assert((std::is_same<decltype(std::fdim((float)0, (long double)0)), long double>::value), "");
  927. static_assert((std::is_same<decltype(std::fdim((double)0, (long double)0)), long double>::value), "");
  928. static_assert((std::is_same<decltype(std::fdimf(0,0)), float>::value), "");
  929. static_assert((std::is_same<decltype(std::fdiml(0,0)), long double>::value), "");
  930. static_assert((std::is_same<decltype(std::fdim((int)0, (int)0)), double>::value), "");
  931. static_assert((std::is_same<decltype(fdim(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  932. assert(std::fdim(1,0) == 1);
  933. }
  934. void test_fma()
  935. {
  936. static_assert((std::is_same<decltype(std::fma((bool)0, (float)0, (float)0)), double>::value), "");
  937. static_assert((std::is_same<decltype(std::fma((char)0, (float)0, (float)0)), double>::value), "");
  938. static_assert((std::is_same<decltype(std::fma((unsigned)0, (float)0, (float)0)), double>::value), "");
  939. static_assert((std::is_same<decltype(std::fma((float)0, (int)0, (float)0)), double>::value), "");
  940. static_assert((std::is_same<decltype(std::fma((float)0, (long)0, (float)0)), double>::value), "");
  941. static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (unsigned long long)0)), double>::value), "");
  942. static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (double)0)), double>::value), "");
  943. static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (long double)0)), long double>::value), "");
  944. static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (float)0)), float>::value), "");
  945. static_assert((std::is_same<decltype(std::fma((bool)0, (double)0, (double)0)), double>::value), "");
  946. static_assert((std::is_same<decltype(std::fma((char)0, (double)0, (double)0)), double>::value), "");
  947. static_assert((std::is_same<decltype(std::fma((unsigned)0, (double)0, (double)0)), double>::value), "");
  948. static_assert((std::is_same<decltype(std::fma((double)0, (int)0, (double)0)), double>::value), "");
  949. static_assert((std::is_same<decltype(std::fma((double)0, (long)0, (double)0)), double>::value), "");
  950. static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (unsigned long long)0)), double>::value), "");
  951. static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (float)0)), double>::value), "");
  952. static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (long double)0)), long double>::value), "");
  953. static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (double)0)), double>::value), "");
  954. static_assert((std::is_same<decltype(std::fma((bool)0, (long double)0, (long double)0)), long double>::value), "");
  955. static_assert((std::is_same<decltype(std::fma((char)0, (long double)0, (long double)0)), long double>::value), "");
  956. static_assert((std::is_same<decltype(std::fma((unsigned)0, (long double)0, (long double)0)), long double>::value), "");
  957. static_assert((std::is_same<decltype(std::fma((long double)0, (int)0, (long double)0)), long double>::value), "");
  958. static_assert((std::is_same<decltype(std::fma((long double)0, (long)0, (long double)0)), long double>::value), "");
  959. static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (unsigned long long)0)), long double>::value), "");
  960. static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (float)0)), long double>::value), "");
  961. static_assert((std::is_same<decltype(std::fma((double)0, (long double)0, (long double)0)), long double>::value), "");
  962. static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (long double)0)), long double>::value), "");
  963. static_assert((std::is_same<decltype(std::fmaf(0,0,0)), float>::value), "");
  964. static_assert((std::is_same<decltype(std::fmal(0,0,0)), long double>::value), "");
  965. static_assert((std::is_same<decltype(fma(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  966. assert(std::fma(1,1,1) == 2);
  967. }
  968. void test_fmax()
  969. {
  970. static_assert((std::is_same<decltype(std::fmax((float)0, (float)0)), float>::value), "");
  971. static_assert((std::is_same<decltype(std::fmax((bool)0, (float)0)), double>::value), "");
  972. static_assert((std::is_same<decltype(std::fmax((unsigned short)0, (double)0)), double>::value), "");
  973. static_assert((std::is_same<decltype(std::fmax((int)0, (long double)0)), long double>::value), "");
  974. static_assert((std::is_same<decltype(std::fmax((float)0, (unsigned int)0)), double>::value), "");
  975. static_assert((std::is_same<decltype(std::fmax((double)0, (long)0)), double>::value), "");
  976. static_assert((std::is_same<decltype(std::fmax((long double)0, (unsigned long)0)), long double>::value), "");
  977. static_assert((std::is_same<decltype(std::fmax((int)0, (long long)0)), double>::value), "");
  978. static_assert((std::is_same<decltype(std::fmax((int)0, (unsigned long long)0)), double>::value), "");
  979. static_assert((std::is_same<decltype(std::fmax((double)0, (double)0)), double>::value), "");
  980. static_assert((std::is_same<decltype(std::fmax((long double)0, (long double)0)), long double>::value), "");
  981. static_assert((std::is_same<decltype(std::fmax((float)0, (double)0)), double>::value), "");
  982. static_assert((std::is_same<decltype(std::fmax((float)0, (long double)0)), long double>::value), "");
  983. static_assert((std::is_same<decltype(std::fmax((double)0, (long double)0)), long double>::value), "");
  984. static_assert((std::is_same<decltype(std::fmaxf(0,0)), float>::value), "");
  985. static_assert((std::is_same<decltype(std::fmaxl(0,0)), long double>::value), "");
  986. static_assert((std::is_same<decltype(std::fmax((int)0, (int)0)), double>::value), "");
  987. static_assert((std::is_same<decltype(fmax(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  988. assert(std::fmax(1,0) == 1);
  989. }
  990. void test_fmin()
  991. {
  992. static_assert((std::is_same<decltype(std::fmin((float)0, (float)0)), float>::value), "");
  993. static_assert((std::is_same<decltype(std::fmin((bool)0, (float)0)), double>::value), "");
  994. static_assert((std::is_same<decltype(std::fmin((unsigned short)0, (double)0)), double>::value), "");
  995. static_assert((std::is_same<decltype(std::fmin((int)0, (long double)0)), long double>::value), "");
  996. static_assert((std::is_same<decltype(std::fmin((float)0, (unsigned int)0)), double>::value), "");
  997. static_assert((std::is_same<decltype(std::fmin((double)0, (long)0)), double>::value), "");
  998. static_assert((std::is_same<decltype(std::fmin((long double)0, (unsigned long)0)), long double>::value), "");
  999. static_assert((std::is_same<decltype(std::fmin((int)0, (long long)0)), double>::value), "");
  1000. static_assert((std::is_same<decltype(std::fmin((int)0, (unsigned long long)0)), double>::value), "");
  1001. static_assert((std::is_same<decltype(std::fmin((double)0, (double)0)), double>::value), "");
  1002. static_assert((std::is_same<decltype(std::fmin((long double)0, (long double)0)), long double>::value), "");
  1003. static_assert((std::is_same<decltype(std::fmin((float)0, (double)0)), double>::value), "");
  1004. static_assert((std::is_same<decltype(std::fmin((float)0, (long double)0)), long double>::value), "");
  1005. static_assert((std::is_same<decltype(std::fmin((double)0, (long double)0)), long double>::value), "");
  1006. static_assert((std::is_same<decltype(std::fminf(0,0)), float>::value), "");
  1007. static_assert((std::is_same<decltype(std::fminl(0,0)), long double>::value), "");
  1008. static_assert((std::is_same<decltype(std::fmin((int)0, (int)0)), double>::value), "");
  1009. static_assert((std::is_same<decltype(fmin(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1010. assert(std::fmin(1,0) == 0);
  1011. }
  1012. void test_hypot()
  1013. {
  1014. static_assert((std::is_same<decltype(std::hypot((float)0, (float)0)), float>::value), "");
  1015. static_assert((std::is_same<decltype(std::hypot((bool)0, (float)0)), double>::value), "");
  1016. static_assert((std::is_same<decltype(std::hypot((unsigned short)0, (double)0)), double>::value), "");
  1017. static_assert((std::is_same<decltype(std::hypot((int)0, (long double)0)), long double>::value), "");
  1018. static_assert((std::is_same<decltype(std::hypot((float)0, (unsigned int)0)), double>::value), "");
  1019. static_assert((std::is_same<decltype(std::hypot((double)0, (long)0)), double>::value), "");
  1020. static_assert((std::is_same<decltype(std::hypot((long double)0, (unsigned long)0)), long double>::value), "");
  1021. static_assert((std::is_same<decltype(std::hypot((int)0, (long long)0)), double>::value), "");
  1022. static_assert((std::is_same<decltype(std::hypot((int)0, (unsigned long long)0)), double>::value), "");
  1023. static_assert((std::is_same<decltype(std::hypot((double)0, (double)0)), double>::value), "");
  1024. static_assert((std::is_same<decltype(std::hypot((long double)0, (long double)0)), long double>::value), "");
  1025. static_assert((std::is_same<decltype(std::hypot((float)0, (double)0)), double>::value), "");
  1026. static_assert((std::is_same<decltype(std::hypot((float)0, (long double)0)), long double>::value), "");
  1027. static_assert((std::is_same<decltype(std::hypot((double)0, (long double)0)), long double>::value), "");
  1028. static_assert((std::is_same<decltype(std::hypotf(0,0)), float>::value), "");
  1029. static_assert((std::is_same<decltype(std::hypotl(0,0)), long double>::value), "");
  1030. static_assert((std::is_same<decltype(std::hypot((int)0, (int)0)), double>::value), "");
  1031. static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1032. assert(std::hypot(3,4) == 5);
  1033. #if TEST_STD_VER > 14
  1034. static_assert((std::is_same<decltype(std::hypot((float)0, (float)0, (float)0)), float>::value), "");
  1035. static_assert((std::is_same<decltype(std::hypot((float)0, (bool)0, (float)0)), double>::value), "");
  1036. static_assert((std::is_same<decltype(std::hypot((float)0, (unsigned short)0, (double)0)), double>::value), "");
  1037. static_assert((std::is_same<decltype(std::hypot((float)0, (int)0, (long double)0)), long double>::value), "");
  1038. static_assert((std::is_same<decltype(std::hypot((float)0, (unsigned int)0)), double>::value), "");
  1039. static_assert((std::is_same<decltype(std::hypot((float)0, (double)0, (long)0)), double>::value), "");
  1040. static_assert((std::is_same<decltype(std::hypot((float)0, (long double)0, (unsigned long)0)), long double>::value), "");
  1041. static_assert((std::is_same<decltype(std::hypot((float)0, (int)0, (long long)0)), double>::value), "");
  1042. static_assert((std::is_same<decltype(std::hypot((float)0, (int)0, (unsigned long long)0)), double>::value), "");
  1043. static_assert((std::is_same<decltype(std::hypot((float)0, (double)0, (double)0)), double>::value), "");
  1044. static_assert((std::is_same<decltype(std::hypot((float)0, (long double)0, (long double)0)), long double>::value), "");
  1045. static_assert((std::is_same<decltype(std::hypot((float)0, (float)0, (double)0)), double>::value), "");
  1046. static_assert((std::is_same<decltype(std::hypot((float)0, (float)0, (long double)0)), long double>::value), "");
  1047. static_assert((std::is_same<decltype(std::hypot((float)0, (double)0, (long double)0)), long double>::value), "");
  1048. static_assert((std::is_same<decltype(std::hypot((int)0, (int)0, (int)0)), double>::value), "");
  1049. static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1050. assert(std::hypot(2,3,6) == 7);
  1051. assert(std::hypot(1,4,8) == 9);
  1052. #endif
  1053. }
  1054. void test_ilogb()
  1055. {
  1056. static_assert((std::is_same<decltype(std::ilogb((float)0)), int>::value), "");
  1057. static_assert((std::is_same<decltype(std::ilogb((bool)0)), int>::value), "");
  1058. static_assert((std::is_same<decltype(std::ilogb((unsigned short)0)), int>::value), "");
  1059. static_assert((std::is_same<decltype(std::ilogb((int)0)), int>::value), "");
  1060. static_assert((std::is_same<decltype(std::ilogb((unsigned int)0)), int>::value), "");
  1061. static_assert((std::is_same<decltype(std::ilogb((long)0)), int>::value), "");
  1062. static_assert((std::is_same<decltype(std::ilogb((unsigned long)0)), int>::value), "");
  1063. static_assert((std::is_same<decltype(std::ilogb((long long)0)), int>::value), "");
  1064. static_assert((std::is_same<decltype(std::ilogb((unsigned long long)0)), int>::value), "");
  1065. static_assert((std::is_same<decltype(std::ilogb((double)0)), int>::value), "");
  1066. static_assert((std::is_same<decltype(std::ilogb((long double)0)), int>::value), "");
  1067. static_assert((std::is_same<decltype(std::ilogbf(0)), int>::value), "");
  1068. static_assert((std::is_same<decltype(std::ilogbl(0)), int>::value), "");
  1069. static_assert((std::is_same<decltype(ilogb(Ambiguous())), Ambiguous>::value), "");
  1070. assert(std::ilogb(1) == 0);
  1071. }
  1072. void test_lgamma()
  1073. {
  1074. static_assert((std::is_same<decltype(std::lgamma((float)0)), float>::value), "");
  1075. static_assert((std::is_same<decltype(std::lgamma((bool)0)), double>::value), "");
  1076. static_assert((std::is_same<decltype(std::lgamma((unsigned short)0)), double>::value), "");
  1077. static_assert((std::is_same<decltype(std::lgamma((int)0)), double>::value), "");
  1078. static_assert((std::is_same<decltype(std::lgamma((unsigned int)0)), double>::value), "");
  1079. static_assert((std::is_same<decltype(std::lgamma((long)0)), double>::value), "");
  1080. static_assert((std::is_same<decltype(std::lgamma((unsigned long)0)), double>::value), "");
  1081. static_assert((std::is_same<decltype(std::lgamma((long long)0)), double>::value), "");
  1082. static_assert((std::is_same<decltype(std::lgamma((unsigned long long)0)), double>::value), "");
  1083. static_assert((std::is_same<decltype(std::lgamma((double)0)), double>::value), "");
  1084. static_assert((std::is_same<decltype(std::lgamma((long double)0)), long double>::value), "");
  1085. static_assert((std::is_same<decltype(std::lgammaf(0)), float>::value), "");
  1086. static_assert((std::is_same<decltype(std::lgammal(0)), long double>::value), "");
  1087. static_assert((std::is_same<decltype(lgamma(Ambiguous())), Ambiguous>::value), "");
  1088. assert(std::lgamma(1) == 0);
  1089. }
  1090. void test_llrint()
  1091. {
  1092. static_assert((std::is_same<decltype(std::llrint((float)0)), long long>::value), "");
  1093. static_assert((std::is_same<decltype(std::llrint((bool)0)), long long>::value), "");
  1094. static_assert((std::is_same<decltype(std::llrint((unsigned short)0)), long long>::value), "");
  1095. static_assert((std::is_same<decltype(std::llrint((int)0)), long long>::value), "");
  1096. static_assert((std::is_same<decltype(std::llrint((unsigned int)0)), long long>::value), "");
  1097. static_assert((std::is_same<decltype(std::llrint((long)0)), long long>::value), "");
  1098. static_assert((std::is_same<decltype(std::llrint((unsigned long)0)), long long>::value), "");
  1099. static_assert((std::is_same<decltype(std::llrint((long long)0)), long long>::value), "");
  1100. static_assert((std::is_same<decltype(std::llrint((unsigned long long)0)), long long>::value), "");
  1101. static_assert((std::is_same<decltype(std::llrint((double)0)), long long>::value), "");
  1102. static_assert((std::is_same<decltype(std::llrint((long double)0)), long long>::value), "");
  1103. static_assert((std::is_same<decltype(std::llrintf(0)), long long>::value), "");
  1104. static_assert((std::is_same<decltype(std::llrintl(0)), long long>::value), "");
  1105. static_assert((std::is_same<decltype(llrint(Ambiguous())), Ambiguous>::value), "");
  1106. assert(std::llrint(1) == 1LL);
  1107. }
  1108. void test_llround()
  1109. {
  1110. static_assert((std::is_same<decltype(std::llround((float)0)), long long>::value), "");
  1111. static_assert((std::is_same<decltype(std::llround((bool)0)), long long>::value), "");
  1112. static_assert((std::is_same<decltype(std::llround((unsigned short)0)), long long>::value), "");
  1113. static_assert((std::is_same<decltype(std::llround((int)0)), long long>::value), "");
  1114. static_assert((std::is_same<decltype(std::llround((unsigned int)0)), long long>::value), "");
  1115. static_assert((std::is_same<decltype(std::llround((long)0)), long long>::value), "");
  1116. static_assert((std::is_same<decltype(std::llround((unsigned long)0)), long long>::value), "");
  1117. static_assert((std::is_same<decltype(std::llround((long long)0)), long long>::value), "");
  1118. static_assert((std::is_same<decltype(std::llround((unsigned long long)0)), long long>::value), "");
  1119. static_assert((std::is_same<decltype(std::llround((double)0)), long long>::value), "");
  1120. static_assert((std::is_same<decltype(std::llround((long double)0)), long long>::value), "");
  1121. static_assert((std::is_same<decltype(std::llroundf(0)), long long>::value), "");
  1122. static_assert((std::is_same<decltype(std::llroundl(0)), long long>::value), "");
  1123. static_assert((std::is_same<decltype(llround(Ambiguous())), Ambiguous>::value), "");
  1124. assert(std::llround(1) == 1LL);
  1125. }
  1126. void test_log1p()
  1127. {
  1128. static_assert((std::is_same<decltype(std::log1p((float)0)), float>::value), "");
  1129. static_assert((std::is_same<decltype(std::log1p((bool)0)), double>::value), "");
  1130. static_assert((std::is_same<decltype(std::log1p((unsigned short)0)), double>::value), "");
  1131. static_assert((std::is_same<decltype(std::log1p((int)0)), double>::value), "");
  1132. static_assert((std::is_same<decltype(std::log1p((unsigned int)0)), double>::value), "");
  1133. static_assert((std::is_same<decltype(std::log1p((long)0)), double>::value), "");
  1134. static_assert((std::is_same<decltype(std::log1p((unsigned long)0)), double>::value), "");
  1135. static_assert((std::is_same<decltype(std::log1p((long long)0)), double>::value), "");
  1136. static_assert((std::is_same<decltype(std::log1p((unsigned long long)0)), double>::value), "");
  1137. static_assert((std::is_same<decltype(std::log1p((double)0)), double>::value), "");
  1138. static_assert((std::is_same<decltype(std::log1p((long double)0)), long double>::value), "");
  1139. static_assert((std::is_same<decltype(std::log1pf(0)), float>::value), "");
  1140. static_assert((std::is_same<decltype(std::log1pl(0)), long double>::value), "");
  1141. static_assert((std::is_same<decltype(log1p(Ambiguous())), Ambiguous>::value), "");
  1142. assert(std::log1p(0) == 0);
  1143. }
  1144. void test_log2()
  1145. {
  1146. static_assert((std::is_same<decltype(std::log2((float)0)), float>::value), "");
  1147. static_assert((std::is_same<decltype(std::log2((bool)0)), double>::value), "");
  1148. static_assert((std::is_same<decltype(std::log2((unsigned short)0)), double>::value), "");
  1149. static_assert((std::is_same<decltype(std::log2((int)0)), double>::value), "");
  1150. static_assert((std::is_same<decltype(std::log2((unsigned int)0)), double>::value), "");
  1151. static_assert((std::is_same<decltype(std::log2((long)0)), double>::value), "");
  1152. static_assert((std::is_same<decltype(std::log2((unsigned long)0)), double>::value), "");
  1153. static_assert((std::is_same<decltype(std::log2((long long)0)), double>::value), "");
  1154. static_assert((std::is_same<decltype(std::log2((unsigned long long)0)), double>::value), "");
  1155. static_assert((std::is_same<decltype(std::log2((double)0)), double>::value), "");
  1156. static_assert((std::is_same<decltype(std::log2((long double)0)), long double>::value), "");
  1157. static_assert((std::is_same<decltype(std::log2f(0)), float>::value), "");
  1158. static_assert((std::is_same<decltype(std::log2l(0)), long double>::value), "");
  1159. static_assert((std::is_same<decltype(log2(Ambiguous())), Ambiguous>::value), "");
  1160. assert(std::log2(1) == 0);
  1161. }
  1162. void test_logb()
  1163. {
  1164. static_assert((std::is_same<decltype(std::logb((float)0)), float>::value), "");
  1165. static_assert((std::is_same<decltype(std::logb((bool)0)), double>::value), "");
  1166. static_assert((std::is_same<decltype(std::logb((unsigned short)0)), double>::value), "");
  1167. static_assert((std::is_same<decltype(std::logb((int)0)), double>::value), "");
  1168. static_assert((std::is_same<decltype(std::logb((unsigned int)0)), double>::value), "");
  1169. static_assert((std::is_same<decltype(std::logb((long)0)), double>::value), "");
  1170. static_assert((std::is_same<decltype(std::logb((unsigned long)0)), double>::value), "");
  1171. static_assert((std::is_same<decltype(std::logb((long long)0)), double>::value), "");
  1172. static_assert((std::is_same<decltype(std::logb((unsigned long long)0)), double>::value), "");
  1173. static_assert((std::is_same<decltype(std::logb((double)0)), double>::value), "");
  1174. static_assert((std::is_same<decltype(std::logb((long double)0)), long double>::value), "");
  1175. static_assert((std::is_same<decltype(std::logbf(0)), float>::value), "");
  1176. static_assert((std::is_same<decltype(std::logbl(0)), long double>::value), "");
  1177. static_assert((std::is_same<decltype(logb(Ambiguous())), Ambiguous>::value), "");
  1178. assert(std::logb(1) == 0);
  1179. }
  1180. void test_lrint()
  1181. {
  1182. static_assert((std::is_same<decltype(std::lrint((float)0)), long>::value), "");
  1183. static_assert((std::is_same<decltype(std::lrint((bool)0)), long>::value), "");
  1184. static_assert((std::is_same<decltype(std::lrint((unsigned short)0)), long>::value), "");
  1185. static_assert((std::is_same<decltype(std::lrint((int)0)), long>::value), "");
  1186. static_assert((std::is_same<decltype(std::lrint((unsigned int)0)), long>::value), "");
  1187. static_assert((std::is_same<decltype(std::lrint((long)0)), long>::value), "");
  1188. static_assert((std::is_same<decltype(std::lrint((unsigned long)0)), long>::value), "");
  1189. static_assert((std::is_same<decltype(std::lrint((long long)0)), long>::value), "");
  1190. static_assert((std::is_same<decltype(std::lrint((unsigned long long)0)), long>::value), "");
  1191. static_assert((std::is_same<decltype(std::lrint((double)0)), long>::value), "");
  1192. static_assert((std::is_same<decltype(std::lrint((long double)0)), long>::value), "");
  1193. static_assert((std::is_same<decltype(std::lrintf(0)), long>::value), "");
  1194. static_assert((std::is_same<decltype(std::lrintl(0)), long>::value), "");
  1195. static_assert((std::is_same<decltype(lrint(Ambiguous())), Ambiguous>::value), "");
  1196. assert(std::lrint(1) == 1L);
  1197. }
  1198. void test_lround()
  1199. {
  1200. static_assert((std::is_same<decltype(std::lround((float)0)), long>::value), "");
  1201. static_assert((std::is_same<decltype(std::lround((bool)0)), long>::value), "");
  1202. static_assert((std::is_same<decltype(std::lround((unsigned short)0)), long>::value), "");
  1203. static_assert((std::is_same<decltype(std::lround((int)0)), long>::value), "");
  1204. static_assert((std::is_same<decltype(std::lround((unsigned int)0)), long>::value), "");
  1205. static_assert((std::is_same<decltype(std::lround((long)0)), long>::value), "");
  1206. static_assert((std::is_same<decltype(std::lround((unsigned long)0)), long>::value), "");
  1207. static_assert((std::is_same<decltype(std::lround((long long)0)), long>::value), "");
  1208. static_assert((std::is_same<decltype(std::lround((unsigned long long)0)), long>::value), "");
  1209. static_assert((std::is_same<decltype(std::lround((double)0)), long>::value), "");
  1210. static_assert((std::is_same<decltype(std::lround((long double)0)), long>::value), "");
  1211. static_assert((std::is_same<decltype(std::lroundf(0)), long>::value), "");
  1212. static_assert((std::is_same<decltype(std::lroundl(0)), long>::value), "");
  1213. static_assert((std::is_same<decltype(lround(Ambiguous())), Ambiguous>::value), "");
  1214. assert(std::lround(1) == 1L);
  1215. }
  1216. void test_nan()
  1217. {
  1218. static_assert((std::is_same<decltype(std::nan("")), double>::value), "");
  1219. static_assert((std::is_same<decltype(std::nanf("")), float>::value), "");
  1220. static_assert((std::is_same<decltype(std::nanl("")), long double>::value), "");
  1221. }
  1222. void test_nearbyint()
  1223. {
  1224. static_assert((std::is_same<decltype(std::nearbyint((float)0)), float>::value), "");
  1225. static_assert((std::is_same<decltype(std::nearbyint((bool)0)), double>::value), "");
  1226. static_assert((std::is_same<decltype(std::nearbyint((unsigned short)0)), double>::value), "");
  1227. static_assert((std::is_same<decltype(std::nearbyint((int)0)), double>::value), "");
  1228. static_assert((std::is_same<decltype(std::nearbyint((unsigned int)0)), double>::value), "");
  1229. static_assert((std::is_same<decltype(std::nearbyint((long)0)), double>::value), "");
  1230. static_assert((std::is_same<decltype(std::nearbyint((unsigned long)0)), double>::value), "");
  1231. static_assert((std::is_same<decltype(std::nearbyint((long long)0)), double>::value), "");
  1232. static_assert((std::is_same<decltype(std::nearbyint((unsigned long long)0)), double>::value), "");
  1233. static_assert((std::is_same<decltype(std::nearbyint((double)0)), double>::value), "");
  1234. static_assert((std::is_same<decltype(std::nearbyint((long double)0)), long double>::value), "");
  1235. static_assert((std::is_same<decltype(std::nearbyintf(0)), float>::value), "");
  1236. static_assert((std::is_same<decltype(std::nearbyintl(0)), long double>::value), "");
  1237. static_assert((std::is_same<decltype(nearbyint(Ambiguous())), Ambiguous>::value), "");
  1238. assert(std::nearbyint(1) == 1);
  1239. }
  1240. void test_nextafter()
  1241. {
  1242. static_assert((std::is_same<decltype(std::nextafter((float)0, (float)0)), float>::value), "");
  1243. static_assert((std::is_same<decltype(std::nextafter((bool)0, (float)0)), double>::value), "");
  1244. static_assert((std::is_same<decltype(std::nextafter((unsigned short)0, (double)0)), double>::value), "");
  1245. static_assert((std::is_same<decltype(std::nextafter((int)0, (long double)0)), long double>::value), "");
  1246. static_assert((std::is_same<decltype(std::nextafter((float)0, (unsigned int)0)), double>::value), "");
  1247. static_assert((std::is_same<decltype(std::nextafter((double)0, (long)0)), double>::value), "");
  1248. static_assert((std::is_same<decltype(std::nextafter((long double)0, (unsigned long)0)), long double>::value), "");
  1249. static_assert((std::is_same<decltype(std::nextafter((int)0, (long long)0)), double>::value), "");
  1250. static_assert((std::is_same<decltype(std::nextafter((int)0, (unsigned long long)0)), double>::value), "");
  1251. static_assert((std::is_same<decltype(std::nextafter((double)0, (double)0)), double>::value), "");
  1252. static_assert((std::is_same<decltype(std::nextafter((long double)0, (long double)0)), long double>::value), "");
  1253. static_assert((std::is_same<decltype(std::nextafter((float)0, (double)0)), double>::value), "");
  1254. static_assert((std::is_same<decltype(std::nextafter((float)0, (long double)0)), long double>::value), "");
  1255. static_assert((std::is_same<decltype(std::nextafter((double)0, (long double)0)), long double>::value), "");
  1256. static_assert((std::is_same<decltype(std::nextafterf(0,0)), float>::value), "");
  1257. static_assert((std::is_same<decltype(std::nextafterl(0,0)), long double>::value), "");
  1258. static_assert((std::is_same<decltype(std::nextafter((int)0, (int)0)), double>::value), "");
  1259. static_assert((std::is_same<decltype(nextafter(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1260. assert(std::nextafter(0,1) == hexfloat<double>(0x1, 0, -1074));
  1261. }
  1262. void test_nexttoward()
  1263. {
  1264. static_assert((std::is_same<decltype(std::nexttoward((float)0, (long double)0)), float>::value), "");
  1265. static_assert((std::is_same<decltype(std::nexttoward((bool)0, (long double)0)), double>::value), "");
  1266. static_assert((std::is_same<decltype(std::nexttoward((unsigned short)0, (long double)0)), double>::value), "");
  1267. static_assert((std::is_same<decltype(std::nexttoward((int)0, (long double)0)), double>::value), "");
  1268. static_assert((std::is_same<decltype(std::nexttoward((unsigned int)0, (long double)0)), double>::value), "");
  1269. static_assert((std::is_same<decltype(std::nexttoward((long)0, (long double)0)), double>::value), "");
  1270. static_assert((std::is_same<decltype(std::nexttoward((unsigned long)0, (long double)0)), double>::value), "");
  1271. static_assert((std::is_same<decltype(std::nexttoward((long long)0, (long double)0)), double>::value), "");
  1272. static_assert((std::is_same<decltype(std::nexttoward((unsigned long long)0, (long double)0)), double>::value), "");
  1273. static_assert((std::is_same<decltype(std::nexttoward((double)0, (long double)0)), double>::value), "");
  1274. static_assert((std::is_same<decltype(std::nexttoward((long double)0, (long double)0)), long double>::value), "");
  1275. static_assert((std::is_same<decltype(std::nexttowardf(0, (long double)0)), float>::value), "");
  1276. static_assert((std::is_same<decltype(std::nexttowardl(0, (long double)0)), long double>::value), "");
  1277. static_assert((std::is_same<decltype(nexttoward(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1278. assert(std::nexttoward(0, 1) == hexfloat<double>(0x1, 0, -1074));
  1279. }
  1280. void test_remainder()
  1281. {
  1282. static_assert((std::is_same<decltype(std::remainder((float)0, (float)0)), float>::value), "");
  1283. static_assert((std::is_same<decltype(std::remainder((bool)0, (float)0)), double>::value), "");
  1284. static_assert((std::is_same<decltype(std::remainder((unsigned short)0, (double)0)), double>::value), "");
  1285. static_assert((std::is_same<decltype(std::remainder((int)0, (long double)0)), long double>::value), "");
  1286. static_assert((std::is_same<decltype(std::remainder((float)0, (unsigned int)0)), double>::value), "");
  1287. static_assert((std::is_same<decltype(std::remainder((double)0, (long)0)), double>::value), "");
  1288. static_assert((std::is_same<decltype(std::remainder((long double)0, (unsigned long)0)), long double>::value), "");
  1289. static_assert((std::is_same<decltype(std::remainder((int)0, (long long)0)), double>::value), "");
  1290. static_assert((std::is_same<decltype(std::remainder((int)0, (unsigned long long)0)), double>::value), "");
  1291. static_assert((std::is_same<decltype(std::remainder((double)0, (double)0)), double>::value), "");
  1292. static_assert((std::is_same<decltype(std::remainder((long double)0, (long double)0)), long double>::value), "");
  1293. static_assert((std::is_same<decltype(std::remainder((float)0, (double)0)), double>::value), "");
  1294. static_assert((std::is_same<decltype(std::remainder((float)0, (long double)0)), long double>::value), "");
  1295. static_assert((std::is_same<decltype(std::remainder((double)0, (long double)0)), long double>::value), "");
  1296. static_assert((std::is_same<decltype(std::remainderf(0,0)), float>::value), "");
  1297. static_assert((std::is_same<decltype(std::remainderl(0,0)), long double>::value), "");
  1298. static_assert((std::is_same<decltype(std::remainder((int)0, (int)0)), double>::value), "");
  1299. static_assert((std::is_same<decltype(remainder(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1300. assert(std::remainder(0.5,1) == 0.5);
  1301. }
  1302. void test_remquo()
  1303. {
  1304. int ip;
  1305. static_assert((std::is_same<decltype(std::remquo((float)0, (float)0, &ip)), float>::value), "");
  1306. static_assert((std::is_same<decltype(std::remquo((bool)0, (float)0, &ip)), double>::value), "");
  1307. static_assert((std::is_same<decltype(std::remquo((unsigned short)0, (double)0, &ip)), double>::value), "");
  1308. static_assert((std::is_same<decltype(std::remquo((int)0, (long double)0, &ip)), long double>::value), "");
  1309. static_assert((std::is_same<decltype(std::remquo((float)0, (unsigned int)0, &ip)), double>::value), "");
  1310. static_assert((std::is_same<decltype(std::remquo((double)0, (long)0, &ip)), double>::value), "");
  1311. static_assert((std::is_same<decltype(std::remquo((long double)0, (unsigned long)0, &ip)), long double>::value), "");
  1312. static_assert((std::is_same<decltype(std::remquo((int)0, (long long)0, &ip)), double>::value), "");
  1313. static_assert((std::is_same<decltype(std::remquo((int)0, (unsigned long long)0, &ip)), double>::value), "");
  1314. static_assert((std::is_same<decltype(std::remquo((double)0, (double)0, &ip)), double>::value), "");
  1315. static_assert((std::is_same<decltype(std::remquo((long double)0, (long double)0, &ip)), long double>::value), "");
  1316. static_assert((std::is_same<decltype(std::remquo((float)0, (double)0, &ip)), double>::value), "");
  1317. static_assert((std::is_same<decltype(std::remquo((float)0, (long double)0, &ip)), long double>::value), "");
  1318. static_assert((std::is_same<decltype(std::remquo((double)0, (long double)0, &ip)), long double>::value), "");
  1319. static_assert((std::is_same<decltype(std::remquof(0,0, &ip)), float>::value), "");
  1320. static_assert((std::is_same<decltype(std::remquol(0,0, &ip)), long double>::value), "");
  1321. static_assert((std::is_same<decltype(std::remquo((int)0, (int)0, &ip)), double>::value), "");
  1322. static_assert((std::is_same<decltype(remquo(Ambiguous(), Ambiguous(), &ip)), Ambiguous>::value), "");
  1323. assert(std::remquo(0.5,1, &ip) == 0.5);
  1324. }
  1325. void test_rint()
  1326. {
  1327. static_assert((std::is_same<decltype(std::rint((float)0)), float>::value), "");
  1328. static_assert((std::is_same<decltype(std::rint((bool)0)), double>::value), "");
  1329. static_assert((std::is_same<decltype(std::rint((unsigned short)0)), double>::value), "");
  1330. static_assert((std::is_same<decltype(std::rint((int)0)), double>::value), "");
  1331. static_assert((std::is_same<decltype(std::rint((unsigned int)0)), double>::value), "");
  1332. static_assert((std::is_same<decltype(std::rint((long)0)), double>::value), "");
  1333. static_assert((std::is_same<decltype(std::rint((unsigned long)0)), double>::value), "");
  1334. static_assert((std::is_same<decltype(std::rint((long long)0)), double>::value), "");
  1335. static_assert((std::is_same<decltype(std::rint((unsigned long long)0)), double>::value), "");
  1336. static_assert((std::is_same<decltype(std::rint((double)0)), double>::value), "");
  1337. static_assert((std::is_same<decltype(std::rint((long double)0)), long double>::value), "");
  1338. static_assert((std::is_same<decltype(std::rintf(0)), float>::value), "");
  1339. static_assert((std::is_same<decltype(std::rintl(0)), long double>::value), "");
  1340. static_assert((std::is_same<decltype(rint(Ambiguous())), Ambiguous>::value), "");
  1341. assert(std::rint(1) == 1);
  1342. }
  1343. void test_round()
  1344. {
  1345. static_assert((std::is_same<decltype(std::round((float)0)), float>::value), "");
  1346. static_assert((std::is_same<decltype(std::round((bool)0)), double>::value), "");
  1347. static_assert((std::is_same<decltype(std::round((unsigned short)0)), double>::value), "");
  1348. static_assert((std::is_same<decltype(std::round((int)0)), double>::value), "");
  1349. static_assert((std::is_same<decltype(std::round((unsigned int)0)), double>::value), "");
  1350. static_assert((std::is_same<decltype(std::round((long)0)), double>::value), "");
  1351. static_assert((std::is_same<decltype(std::round((unsigned long)0)), double>::value), "");
  1352. static_assert((std::is_same<decltype(std::round((long long)0)), double>::value), "");
  1353. static_assert((std::is_same<decltype(std::round((unsigned long long)0)), double>::value), "");
  1354. static_assert((std::is_same<decltype(std::round((double)0)), double>::value), "");
  1355. static_assert((std::is_same<decltype(std::round((long double)0)), long double>::value), "");
  1356. static_assert((std::is_same<decltype(std::roundf(0)), float>::value), "");
  1357. static_assert((std::is_same<decltype(std::roundl(0)), long double>::value), "");
  1358. static_assert((std::is_same<decltype(round(Ambiguous())), Ambiguous>::value), "");
  1359. assert(std::round(1) == 1);
  1360. }
  1361. void test_scalbln()
  1362. {
  1363. static_assert((std::is_same<decltype(std::scalbln((float)0, (long)0)), float>::value), "");
  1364. static_assert((std::is_same<decltype(std::scalbln((bool)0, (long)0)), double>::value), "");
  1365. static_assert((std::is_same<decltype(std::scalbln((unsigned short)0, (long)0)), double>::value), "");
  1366. static_assert((std::is_same<decltype(std::scalbln((int)0, (long)0)), double>::value), "");
  1367. static_assert((std::is_same<decltype(std::scalbln((unsigned int)0, (long)0)), double>::value), "");
  1368. static_assert((std::is_same<decltype(std::scalbln((long)0, (long)0)), double>::value), "");
  1369. static_assert((std::is_same<decltype(std::scalbln((unsigned long)0, (long)0)), double>::value), "");
  1370. static_assert((std::is_same<decltype(std::scalbln((long long)0, (long)0)), double>::value), "");
  1371. static_assert((std::is_same<decltype(std::scalbln((unsigned long long)0, (long)0)), double>::value), "");
  1372. static_assert((std::is_same<decltype(std::scalbln((double)0, (long)0)), double>::value), "");
  1373. static_assert((std::is_same<decltype(std::scalbln((long double)0, (long)0)), long double>::value), "");
  1374. static_assert((std::is_same<decltype(std::scalblnf(0, (long)0)), float>::value), "");
  1375. static_assert((std::is_same<decltype(std::scalblnl(0, (long)0)), long double>::value), "");
  1376. static_assert((std::is_same<decltype(scalbln(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1377. assert(std::scalbln(1, 1) == 2);
  1378. }
  1379. void test_scalbn()
  1380. {
  1381. static_assert((std::is_same<decltype(std::scalbn((float)0, (int)0)), float>::value), "");
  1382. static_assert((std::is_same<decltype(std::scalbn((bool)0, (int)0)), double>::value), "");
  1383. static_assert((std::is_same<decltype(std::scalbn((unsigned short)0, (int)0)), double>::value), "");
  1384. static_assert((std::is_same<decltype(std::scalbn((int)0, (int)0)), double>::value), "");
  1385. static_assert((std::is_same<decltype(std::scalbn((unsigned int)0, (int)0)), double>::value), "");
  1386. static_assert((std::is_same<decltype(std::scalbn((long)0, (int)0)), double>::value), "");
  1387. static_assert((std::is_same<decltype(std::scalbn((unsigned long)0, (int)0)), double>::value), "");
  1388. static_assert((std::is_same<decltype(std::scalbn((long long)0, (int)0)), double>::value), "");
  1389. static_assert((std::is_same<decltype(std::scalbn((unsigned long long)0, (int)0)), double>::value), "");
  1390. static_assert((std::is_same<decltype(std::scalbn((double)0, (int)0)), double>::value), "");
  1391. static_assert((std::is_same<decltype(std::scalbn((long double)0, (int)0)), long double>::value), "");
  1392. static_assert((std::is_same<decltype(std::scalbnf(0, (int)0)), float>::value), "");
  1393. static_assert((std::is_same<decltype(std::scalbnl(0, (int)0)), long double>::value), "");
  1394. static_assert((std::is_same<decltype(scalbn(Ambiguous(), Ambiguous())), Ambiguous>::value), "");
  1395. assert(std::scalbn(1, 1) == 2);
  1396. }
  1397. void test_tgamma()
  1398. {
  1399. static_assert((std::is_same<decltype(std::tgamma((float)0)), float>::value), "");
  1400. static_assert((std::is_same<decltype(std::tgamma((bool)0)), double>::value), "");
  1401. static_assert((std::is_same<decltype(std::tgamma((unsigned short)0)), double>::value), "");
  1402. static_assert((std::is_same<decltype(std::tgamma((int)0)), double>::value), "");
  1403. static_assert((std::is_same<decltype(std::tgamma((unsigned int)0)), double>::value), "");
  1404. static_assert((std::is_same<decltype(std::tgamma((long)0)), double>::value), "");
  1405. static_assert((std::is_same<decltype(std::tgamma((unsigned long)0)), double>::value), "");
  1406. static_assert((std::is_same<decltype(std::tgamma((long long)0)), double>::value), "");
  1407. static_assert((std::is_same<decltype(std::tgamma((unsigned long long)0)), double>::value), "");
  1408. static_assert((std::is_same<decltype(std::tgamma((double)0)), double>::value), "");
  1409. static_assert((std::is_same<decltype(std::tgamma((long double)0)), long double>::value), "");
  1410. static_assert((std::is_same<decltype(std::tgammaf(0)), float>::value), "");
  1411. static_assert((std::is_same<decltype(std::tgammal(0)), long double>::value), "");
  1412. static_assert((std::is_same<decltype(tgamma(Ambiguous())), Ambiguous>::value), "");
  1413. assert(std::tgamma(1) == 1);
  1414. }
  1415. void test_trunc()
  1416. {
  1417. static_assert((std::is_same<decltype(std::trunc((float)0)), float>::value), "");
  1418. static_assert((std::is_same<decltype(std::trunc((bool)0)), double>::value), "");
  1419. static_assert((std::is_same<decltype(std::trunc((unsigned short)0)), double>::value), "");
  1420. static_assert((std::is_same<decltype(std::trunc((int)0)), double>::value), "");
  1421. static_assert((std::is_same<decltype(std::trunc((unsigned int)0)), double>::value), "");
  1422. static_assert((std::is_same<decltype(std::trunc((long)0)), double>::value), "");
  1423. static_assert((std::is_same<decltype(std::trunc((unsigned long)0)), double>::value), "");
  1424. static_assert((std::is_same<decltype(std::trunc((long long)0)), double>::value), "");
  1425. static_assert((std::is_same<decltype(std::trunc((unsigned long long)0)), double>::value), "");
  1426. static_assert((std::is_same<decltype(std::trunc((double)0)), double>::value), "");
  1427. static_assert((std::is_same<decltype(std::trunc((long double)0)), long double>::value), "");
  1428. static_assert((std::is_same<decltype(std::truncf(0)), float>::value), "");
  1429. static_assert((std::is_same<decltype(std::truncl(0)), long double>::value), "");
  1430. static_assert((std::is_same<decltype(trunc(Ambiguous())), Ambiguous>::value), "");
  1431. assert(std::trunc(1) == 1);
  1432. }
  1433. int main()
  1434. {
  1435. test_abs();
  1436. test_acos();
  1437. test_asin();
  1438. test_atan();
  1439. test_atan2();
  1440. test_ceil();
  1441. test_cos();
  1442. test_cosh();
  1443. test_exp();
  1444. test_fabs();
  1445. test_floor();
  1446. test_fmod();
  1447. test_frexp();
  1448. test_ldexp();
  1449. test_log();
  1450. test_log10();
  1451. test_modf();
  1452. test_pow();
  1453. test_sin();
  1454. test_sinh();
  1455. test_sqrt();
  1456. test_tan();
  1457. test_tanh();
  1458. test_signbit();
  1459. test_fpclassify();
  1460. test_isfinite();
  1461. test_isnormal();
  1462. test_isgreater();
  1463. test_isgreaterequal();
  1464. test_isinf();
  1465. test_isless();
  1466. test_islessequal();
  1467. test_islessgreater();
  1468. test_isnan();
  1469. test_isunordered();
  1470. test_acosh();
  1471. test_asinh();
  1472. test_atanh();
  1473. test_cbrt();
  1474. test_copysign();
  1475. test_erf();
  1476. test_erfc();
  1477. test_exp2();
  1478. test_expm1();
  1479. test_fdim();
  1480. test_fma();
  1481. test_fmax();
  1482. test_fmin();
  1483. test_hypot();
  1484. test_ilogb();
  1485. test_lgamma();
  1486. test_llrint();
  1487. test_llround();
  1488. test_log1p();
  1489. test_log2();
  1490. test_logb();
  1491. test_lrint();
  1492. test_lround();
  1493. test_nan();
  1494. test_nearbyint();
  1495. test_nextafter();
  1496. test_nexttoward();
  1497. test_remainder();
  1498. test_remquo();
  1499. test_rint();
  1500. test_round();
  1501. test_scalbln();
  1502. test_scalbn();
  1503. test_tgamma();
  1504. test_trunc();
  1505. }