1724 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <cmath>10 11#include <cmath>12#include <array>13#include <cassert>14#include <limits>15#include <type_traits>16#include <utility>17 18#include "fp_compare.h"19#include "test_macros.h"20#include "hexfloat.h"21#include "truncate_fp.h"22#include "type_algorithms.h"23 24// convertible to int/float/double/etc25template <class T, int N=0>26struct Value {27 operator T () { return T(N); }28};29 30// See PR2108331// Ambiguous is a user-defined type that defines its own overloads of cmath32// functions. When the std overloads are candidates too (by using or adl),33// they should not interfere.34struct Ambiguous : std::true_type { // ADL35 operator float () { return 0.f; }36 operator double () { return 0.; }37};38Ambiguous abs(Ambiguous){ return Ambiguous(); }39Ambiguous acos(Ambiguous){ return Ambiguous(); }40Ambiguous asin(Ambiguous){ return Ambiguous(); }41Ambiguous atan(Ambiguous){ return Ambiguous(); }42Ambiguous atan2(Ambiguous, Ambiguous){ return Ambiguous(); }43Ambiguous ceil(Ambiguous){ return Ambiguous(); }44Ambiguous cos(Ambiguous){ return Ambiguous(); }45Ambiguous cosh(Ambiguous){ return Ambiguous(); }46Ambiguous exp(Ambiguous){ return Ambiguous(); }47Ambiguous fabs(Ambiguous){ return Ambiguous(); }48Ambiguous floor(Ambiguous){ return Ambiguous(); }49Ambiguous fmod(Ambiguous, Ambiguous){ return Ambiguous(); }50Ambiguous frexp(Ambiguous, int*){ return Ambiguous(); }51Ambiguous ldexp(Ambiguous, int){ return Ambiguous(); }52Ambiguous log(Ambiguous){ return Ambiguous(); }53Ambiguous log10(Ambiguous){ return Ambiguous(); }54Ambiguous modf(Ambiguous, Ambiguous*){ return Ambiguous(); }55Ambiguous pow(Ambiguous, Ambiguous){ return Ambiguous(); }56Ambiguous sin(Ambiguous){ return Ambiguous(); }57Ambiguous sinh(Ambiguous){ return Ambiguous(); }58Ambiguous sqrt(Ambiguous){ return Ambiguous(); }59Ambiguous tan(Ambiguous){ return Ambiguous(); }60Ambiguous tanh(Ambiguous){ return Ambiguous(); }61Ambiguous signbit(Ambiguous){ return Ambiguous(); }62Ambiguous fpclassify(Ambiguous){ return Ambiguous(); }63Ambiguous isfinite(Ambiguous){ return Ambiguous(); }64Ambiguous isnormal(Ambiguous){ return Ambiguous(); }65Ambiguous isgreater(Ambiguous, Ambiguous){ return Ambiguous(); }66Ambiguous isgreaterequal(Ambiguous, Ambiguous){ return Ambiguous(); }67Ambiguous isless(Ambiguous, Ambiguous){ return Ambiguous(); }68Ambiguous islessequal(Ambiguous, Ambiguous){ return Ambiguous(); }69Ambiguous islessgreater(Ambiguous, Ambiguous){ return Ambiguous(); }70Ambiguous isunordered(Ambiguous, Ambiguous){ return Ambiguous(); }71Ambiguous acosh(Ambiguous){ return Ambiguous(); }72Ambiguous asinh(Ambiguous){ return Ambiguous(); }73Ambiguous atanh(Ambiguous){ return Ambiguous(); }74Ambiguous cbrt(Ambiguous){ return Ambiguous(); }75Ambiguous copysign(Ambiguous, Ambiguous){ return Ambiguous(); }76Ambiguous erf(Ambiguous){ return Ambiguous(); }77Ambiguous erfc(Ambiguous){ return Ambiguous(); }78Ambiguous exp2(Ambiguous){ return Ambiguous(); }79Ambiguous expm1(Ambiguous){ return Ambiguous(); }80Ambiguous fdim(Ambiguous, Ambiguous){ return Ambiguous(); }81Ambiguous fma(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }82Ambiguous fmax(Ambiguous, Ambiguous){ return Ambiguous(); }83Ambiguous fmin(Ambiguous, Ambiguous){ return Ambiguous(); }84Ambiguous hypot(Ambiguous, Ambiguous){ return Ambiguous(); }85Ambiguous hypot(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }86Ambiguous ilogb(Ambiguous){ return Ambiguous(); }87Ambiguous lerp(Ambiguous, Ambiguous, Ambiguous){ return Ambiguous(); }88Ambiguous lgamma(Ambiguous){ return Ambiguous(); }89Ambiguous llrint(Ambiguous){ return Ambiguous(); }90Ambiguous llround(Ambiguous){ return Ambiguous(); }91Ambiguous log1p(Ambiguous){ return Ambiguous(); }92Ambiguous log2(Ambiguous){ return Ambiguous(); }93Ambiguous logb(Ambiguous){ return Ambiguous(); }94Ambiguous lrint(Ambiguous){ return Ambiguous(); }95Ambiguous lround(Ambiguous){ return Ambiguous(); }96Ambiguous nearbyint(Ambiguous){ return Ambiguous(); }97Ambiguous nextafter(Ambiguous, Ambiguous){ return Ambiguous(); }98Ambiguous nexttoward(Ambiguous, Ambiguous){ return Ambiguous(); }99Ambiguous remainder(Ambiguous, Ambiguous){ return Ambiguous(); }100Ambiguous remquo(Ambiguous, Ambiguous, int*){ return Ambiguous(); }101Ambiguous rint(Ambiguous){ return Ambiguous(); }102Ambiguous round(Ambiguous){ return Ambiguous(); }103Ambiguous scalbln(Ambiguous, Ambiguous){ return Ambiguous(); }104Ambiguous scalbn(Ambiguous, Ambiguous){ return Ambiguous(); }105Ambiguous tgamma(Ambiguous){ return Ambiguous(); }106Ambiguous trunc(Ambiguous){ return Ambiguous(); }107 108template <class T, class = decltype(std::abs(std::declval<T>()))>109std::true_type has_abs_imp(int);110template <class T>111std::false_type has_abs_imp(...);112 113template <class T>114struct has_abs : decltype(has_abs_imp<T>(0)) {};115 116void test_abs()117{118 // See also "abs.pass.cpp"119 120 TEST_DIAGNOSTIC_PUSH121 TEST_CLANG_DIAGNOSTIC_IGNORED("-Wabsolute-value")122 123 static_assert((std::is_same<decltype(std::abs((float)0)), float>::value), "");124 static_assert((std::is_same<decltype(std::abs((double)0)), double>::value), "");125 static_assert((std::is_same<decltype(std::abs((long double)0)), long double>::value), "");126 static_assert((std::is_same<decltype(std::abs((int)0)), int>::value), "");127 static_assert((std::is_same<decltype(std::abs((long)0)), long>::value), "");128 static_assert((std::is_same<decltype(std::abs((long long)0)), long long>::value), "");129 static_assert((std::is_same<decltype(std::abs((unsigned char)0)), int>::value), "");130 static_assert((std::is_same<decltype(std::abs((unsigned short)0)), int>::value), "");131 static_assert((std::is_same<decltype(std::abs((signed char)0)), int>::value), "");132 static_assert((std::is_same<decltype(std::abs((short)0)), int>::value), "");133 static_assert((std::is_same<decltype(std::abs((unsigned char)0)), int>::value), "");134 static_assert((std::is_same<decltype(std::abs((char)0)), int>::value), "");135 static_assert((std::is_same<decltype(abs(Ambiguous())), Ambiguous>::value), "");136 137 static_assert(!has_abs<unsigned>::value, "");138 static_assert(!has_abs<unsigned long>::value, "");139 static_assert(!has_abs<unsigned long long>::value, "");140 static_assert(!has_abs<std::size_t>::value, "");141 142 TEST_DIAGNOSTIC_POP143 144 assert(std::abs(-1.) == 1);145}146 147 148void test_acos()149{150 static_assert((std::is_same<decltype(std::acos((float)0)), float>::value), "");151 static_assert((std::is_same<decltype(std::acos((bool)0)), double>::value), "");152 static_assert((std::is_same<decltype(std::acos((unsigned short)0)), double>::value), "");153 static_assert((std::is_same<decltype(std::acos((int)0)), double>::value), "");154 static_assert((std::is_same<decltype(std::acos((unsigned int)0)), double>::value), "");155 static_assert((std::is_same<decltype(std::acos((long)0)), double>::value), "");156 static_assert((std::is_same<decltype(std::acos((unsigned long)0)), double>::value), "");157 static_assert((std::is_same<decltype(std::acos((long long)0)), double>::value), "");158 static_assert((std::is_same<decltype(std::acos((unsigned long long)0)), double>::value), "");159 static_assert((std::is_same<decltype(std::acos((double)0)), double>::value), "");160 static_assert((std::is_same<decltype(std::acos((long double)0)), long double>::value), "");161 static_assert((std::is_same<decltype(std::acosf(0)), float>::value), "");162 static_assert((std::is_same<decltype(std::acosl(0)), long double>::value), "");163 static_assert((std::is_same<decltype(acos(Ambiguous())), Ambiguous>::value), "");164 assert(std::acos(1) == 0);165}166 167void test_asin()168{169 static_assert((std::is_same<decltype(std::asin((float)0)), float>::value), "");170 static_assert((std::is_same<decltype(std::asin((bool)0)), double>::value), "");171 static_assert((std::is_same<decltype(std::asin((unsigned short)0)), double>::value), "");172 static_assert((std::is_same<decltype(std::asin((int)0)), double>::value), "");173 static_assert((std::is_same<decltype(std::asin((unsigned int)0)), double>::value), "");174 static_assert((std::is_same<decltype(std::asin((long)0)), double>::value), "");175 static_assert((std::is_same<decltype(std::asin((unsigned long)0)), double>::value), "");176 static_assert((std::is_same<decltype(std::asin((long long)0)), double>::value), "");177 static_assert((std::is_same<decltype(std::asin((unsigned long long)0)), double>::value), "");178 static_assert((std::is_same<decltype(std::asin((double)0)), double>::value), "");179 static_assert((std::is_same<decltype(std::asin((long double)0)), long double>::value), "");180 static_assert((std::is_same<decltype(std::asinf(0)), float>::value), "");181 static_assert((std::is_same<decltype(std::asinl(0)), long double>::value), "");182 static_assert((std::is_same<decltype(asin(Ambiguous())), Ambiguous>::value), "");183 assert(std::asin(0) == 0);184}185 186void test_atan()187{188 static_assert((std::is_same<decltype(std::atan((float)0)), float>::value), "");189 static_assert((std::is_same<decltype(std::atan((bool)0)), double>::value), "");190 static_assert((std::is_same<decltype(std::atan((unsigned short)0)), double>::value), "");191 static_assert((std::is_same<decltype(std::atan((int)0)), double>::value), "");192 static_assert((std::is_same<decltype(std::atan((unsigned int)0)), double>::value), "");193 static_assert((std::is_same<decltype(std::atan((long)0)), double>::value), "");194 static_assert((std::is_same<decltype(std::atan((unsigned long)0)), double>::value), "");195 static_assert((std::is_same<decltype(std::atan((long long)0)), double>::value), "");196 static_assert((std::is_same<decltype(std::atan((unsigned long long)0)), double>::value), "");197 static_assert((std::is_same<decltype(std::atan((double)0)), double>::value), "");198 static_assert((std::is_same<decltype(std::atan((long double)0)), long double>::value), "");199 static_assert((std::is_same<decltype(std::atanf(0)), float>::value), "");200 static_assert((std::is_same<decltype(std::atanl(0)), long double>::value), "");201 static_assert((std::is_same<decltype(atan(Ambiguous())), Ambiguous>::value), "");202 assert(std::atan(0) == 0);203}204 205void test_atan2()206{207 static_assert((std::is_same<decltype(std::atan2((float)0, (float)0)), float>::value), "");208 static_assert((std::is_same<decltype(std::atan2((bool)0, (float)0)), double>::value), "");209 static_assert((std::is_same<decltype(std::atan2((unsigned short)0, (double)0)), double>::value), "");210 static_assert((std::is_same<decltype(std::atan2((int)0, (long double)0)), long double>::value), "");211 static_assert((std::is_same<decltype(std::atan2((float)0, (unsigned int)0)), double>::value), "");212 static_assert((std::is_same<decltype(std::atan2((double)0, (long)0)), double>::value), "");213 static_assert((std::is_same<decltype(std::atan2((long double)0, (unsigned long)0)), long double>::value), "");214 static_assert((std::is_same<decltype(std::atan2((int)0, (long long)0)), double>::value), "");215 static_assert((std::is_same<decltype(std::atan2((int)0, (unsigned long long)0)), double>::value), "");216 static_assert((std::is_same<decltype(std::atan2((double)0, (double)0)), double>::value), "");217 static_assert((std::is_same<decltype(std::atan2((long double)0, (long double)0)), long double>::value), "");218 static_assert((std::is_same<decltype(std::atan2((float)0, (double)0)), double>::value), "");219 static_assert((std::is_same<decltype(std::atan2((float)0, (long double)0)), long double>::value), "");220 static_assert((std::is_same<decltype(std::atan2((double)0, (long double)0)), long double>::value), "");221 static_assert((std::is_same<decltype(std::atan2f(0,0)), float>::value), "");222 static_assert((std::is_same<decltype(std::atan2l(0,0)), long double>::value), "");223 static_assert((std::is_same<decltype(std::atan2((int)0, (int)0)), double>::value), "");224 static_assert((std::is_same<decltype(atan2(Ambiguous(), Ambiguous())), Ambiguous>::value), "");225 assert(std::atan2(0,1) == 0);226}227 228void test_ceil()229{230 static_assert((std::is_same<decltype(std::ceil((float)0)), float>::value), "");231 static_assert((std::is_same<decltype(std::ceil((bool)0)), double>::value), "");232 static_assert((std::is_same<decltype(std::ceil((unsigned short)0)), double>::value), "");233 static_assert((std::is_same<decltype(std::ceil((int)0)), double>::value), "");234 static_assert((std::is_same<decltype(std::ceil((unsigned int)0)), double>::value), "");235 static_assert((std::is_same<decltype(std::ceil((long)0)), double>::value), "");236 static_assert((std::is_same<decltype(std::ceil((unsigned long)0)), double>::value), "");237 static_assert((std::is_same<decltype(std::ceil((long long)0)), double>::value), "");238 static_assert((std::is_same<decltype(std::ceil((unsigned long long)0)), double>::value), "");239 static_assert((std::is_same<decltype(std::ceil((double)0)), double>::value), "");240 static_assert((std::is_same<decltype(std::ceil((long double)0)), long double>::value), "");241 static_assert((std::is_same<decltype(std::ceilf(0)), float>::value), "");242 static_assert((std::is_same<decltype(std::ceill(0)), long double>::value), "");243 static_assert((std::is_same<decltype(ceil(Ambiguous())), Ambiguous>::value), "");244 assert(std::ceil(0) == 0);245}246 247void test_cos()248{249 static_assert((std::is_same<decltype(std::cos((float)0)), float>::value), "");250 static_assert((std::is_same<decltype(std::cos((bool)0)), double>::value), "");251 static_assert((std::is_same<decltype(std::cos((unsigned short)0)), double>::value), "");252 static_assert((std::is_same<decltype(std::cos((int)0)), double>::value), "");253 static_assert((std::is_same<decltype(std::cos((unsigned int)0)), double>::value), "");254 static_assert((std::is_same<decltype(std::cos((long)0)), double>::value), "");255 static_assert((std::is_same<decltype(std::cos((unsigned long)0)), double>::value), "");256 static_assert((std::is_same<decltype(std::cos((long long)0)), double>::value), "");257 static_assert((std::is_same<decltype(std::cos((unsigned long long)0)), double>::value), "");258 static_assert((std::is_same<decltype(std::cos((double)0)), double>::value), "");259 static_assert((std::is_same<decltype(std::cos((long double)0)), long double>::value), "");260 static_assert((std::is_same<decltype(std::cosf(0)), float>::value), "");261 static_assert((std::is_same<decltype(std::cosl(0)), long double>::value), "");262 static_assert((std::is_same<decltype(cos(Ambiguous())), Ambiguous>::value), "");263 assert(std::cos(0) == 1);264}265 266void test_cosh()267{268 static_assert((std::is_same<decltype(std::cosh((float)0)), float>::value), "");269 static_assert((std::is_same<decltype(std::cosh((bool)0)), double>::value), "");270 static_assert((std::is_same<decltype(std::cosh((unsigned short)0)), double>::value), "");271 static_assert((std::is_same<decltype(std::cosh((int)0)), double>::value), "");272 static_assert((std::is_same<decltype(std::cosh((unsigned int)0)), double>::value), "");273 static_assert((std::is_same<decltype(std::cosh((long)0)), double>::value), "");274 static_assert((std::is_same<decltype(std::cosh((unsigned long)0)), double>::value), "");275 static_assert((std::is_same<decltype(std::cosh((long long)0)), double>::value), "");276 static_assert((std::is_same<decltype(std::cosh((unsigned long long)0)), double>::value), "");277 static_assert((std::is_same<decltype(std::cosh((double)0)), double>::value), "");278 static_assert((std::is_same<decltype(std::cosh((long double)0)), long double>::value), "");279 static_assert((std::is_same<decltype(std::coshf(0)), float>::value), "");280 static_assert((std::is_same<decltype(std::coshl(0)), long double>::value), "");281 static_assert((std::is_same<decltype(cosh(Ambiguous())), Ambiguous>::value), "");282 assert(std::cosh(0) == 1);283}284 285void test_exp()286{287 static_assert((std::is_same<decltype(std::exp((float)0)), float>::value), "");288 static_assert((std::is_same<decltype(std::exp((bool)0)), double>::value), "");289 static_assert((std::is_same<decltype(std::exp((unsigned short)0)), double>::value), "");290 static_assert((std::is_same<decltype(std::exp((int)0)), double>::value), "");291 static_assert((std::is_same<decltype(std::exp((unsigned int)0)), double>::value), "");292 static_assert((std::is_same<decltype(std::exp((long)0)), double>::value), "");293 static_assert((std::is_same<decltype(std::exp((unsigned long)0)), double>::value), "");294 static_assert((std::is_same<decltype(std::exp((long long)0)), double>::value), "");295 static_assert((std::is_same<decltype(std::exp((unsigned long long)0)), double>::value), "");296 static_assert((std::is_same<decltype(std::exp((double)0)), double>::value), "");297 static_assert((std::is_same<decltype(std::exp((long double)0)), long double>::value), "");298 static_assert((std::is_same<decltype(std::expf(0)), float>::value), "");299 static_assert((std::is_same<decltype(std::expl(0)), long double>::value), "");300 static_assert((std::is_same<decltype(exp(Ambiguous())), Ambiguous>::value), "");301 assert(std::exp(0) == 1);302}303 304void test_fabs()305{306 static_assert((std::is_same<decltype(std::fabs((float)0)), float>::value), "");307 static_assert((std::is_same<decltype(std::fabs((bool)0)), double>::value), "");308 static_assert((std::is_same<decltype(std::fabs((unsigned short)0)), double>::value), "");309 static_assert((std::is_same<decltype(std::fabs((int)0)), double>::value), "");310 static_assert((std::is_same<decltype(std::fabs((unsigned int)0)), double>::value), "");311 static_assert((std::is_same<decltype(std::fabs((long)0)), double>::value), "");312 static_assert((std::is_same<decltype(std::fabs((unsigned long)0)), double>::value), "");313 static_assert((std::is_same<decltype(std::fabs((long long)0)), double>::value), "");314 static_assert((std::is_same<decltype(std::fabs((unsigned long long)0)), double>::value), "");315 static_assert((std::is_same<decltype(std::fabs((double)0)), double>::value), "");316 static_assert((std::is_same<decltype(std::fabs((long double)0)), long double>::value), "");317 static_assert((std::is_same<decltype(std::fabsf(0.0f)), float>::value), "");318 static_assert((std::is_same<decltype(std::fabsl(0.0L)), long double>::value), "");319 static_assert((std::is_same<decltype(fabs(Ambiguous())), Ambiguous>::value), "");320 assert(std::fabs(-1) == 1);321}322 323void test_floor()324{325 static_assert((std::is_same<decltype(std::floor((float)0)), float>::value), "");326 static_assert((std::is_same<decltype(std::floor((bool)0)), double>::value), "");327 static_assert((std::is_same<decltype(std::floor((unsigned short)0)), double>::value), "");328 static_assert((std::is_same<decltype(std::floor((int)0)), double>::value), "");329 static_assert((std::is_same<decltype(std::floor((unsigned int)0)), double>::value), "");330 static_assert((std::is_same<decltype(std::floor((long)0)), double>::value), "");331 static_assert((std::is_same<decltype(std::floor((unsigned long)0)), double>::value), "");332 static_assert((std::is_same<decltype(std::floor((long long)0)), double>::value), "");333 static_assert((std::is_same<decltype(std::floor((unsigned long long)0)), double>::value), "");334 static_assert((std::is_same<decltype(std::floor((double)0)), double>::value), "");335 static_assert((std::is_same<decltype(std::floor((long double)0)), long double>::value), "");336 static_assert((std::is_same<decltype(std::floorf(0)), float>::value), "");337 static_assert((std::is_same<decltype(std::floorl(0)), long double>::value), "");338 static_assert((std::is_same<decltype(floor(Ambiguous())), Ambiguous>::value), "");339 assert(std::floor(1) == 1);340}341 342void test_fmod()343{344 static_assert((std::is_same<decltype(std::fmod((float)0, (float)0)), float>::value), "");345 static_assert((std::is_same<decltype(std::fmod((bool)0, (float)0)), double>::value), "");346 static_assert((std::is_same<decltype(std::fmod((unsigned short)0, (double)0)), double>::value), "");347 static_assert((std::is_same<decltype(std::fmod((int)0, (long double)0)), long double>::value), "");348 static_assert((std::is_same<decltype(std::fmod((float)0, (unsigned int)0)), double>::value), "");349 static_assert((std::is_same<decltype(std::fmod((double)0, (long)0)), double>::value), "");350 static_assert((std::is_same<decltype(std::fmod((long double)0, (unsigned long)0)), long double>::value), "");351 static_assert((std::is_same<decltype(std::fmod((int)0, (long long)0)), double>::value), "");352 static_assert((std::is_same<decltype(std::fmod((int)0, (unsigned long long)0)), double>::value), "");353 static_assert((std::is_same<decltype(std::fmod((double)0, (double)0)), double>::value), "");354 static_assert((std::is_same<decltype(std::fmod((long double)0, (long double)0)), long double>::value), "");355 static_assert((std::is_same<decltype(std::fmod((float)0, (double)0)), double>::value), "");356 static_assert((std::is_same<decltype(std::fmod((float)0, (long double)0)), long double>::value), "");357 static_assert((std::is_same<decltype(std::fmod((double)0, (long double)0)), long double>::value), "");358 static_assert((std::is_same<decltype(std::fmodf(0,0)), float>::value), "");359 static_assert((std::is_same<decltype(std::fmodl(0,0)), long double>::value), "");360 static_assert((std::is_same<decltype(std::fmod((int)0, (int)0)), double>::value), "");361 static_assert((std::is_same<decltype(fmod(Ambiguous(), Ambiguous())), Ambiguous>::value), "");362 assert(std::fmod(1.5,1) == .5);363}364 365void test_frexp()366{367 int ip;368 static_assert((std::is_same<decltype(std::frexp((float)0, &ip)), float>::value), "");369 static_assert((std::is_same<decltype(std::frexp((bool)0, &ip)), double>::value), "");370 static_assert((std::is_same<decltype(std::frexp((unsigned short)0, &ip)), double>::value), "");371 static_assert((std::is_same<decltype(std::frexp((int)0, &ip)), double>::value), "");372 static_assert((std::is_same<decltype(std::frexp((unsigned int)0, &ip)), double>::value), "");373 static_assert((std::is_same<decltype(std::frexp((long)0, &ip)), double>::value), "");374 static_assert((std::is_same<decltype(std::frexp((unsigned long)0, &ip)), double>::value), "");375 static_assert((std::is_same<decltype(std::frexp((long long)0, &ip)), double>::value), "");376 static_assert((std::is_same<decltype(std::frexp((unsigned long long)0, &ip)), double>::value), "");377 static_assert((std::is_same<decltype(std::frexp((double)0, &ip)), double>::value), "");378 static_assert((std::is_same<decltype(std::frexp((long double)0, &ip)), long double>::value), "");379 static_assert((std::is_same<decltype(std::frexpf(0, &ip)), float>::value), "");380 static_assert((std::is_same<decltype(std::frexpl(0, &ip)), long double>::value), "");381 static_assert((std::is_same<decltype(frexp(Ambiguous(), &ip)), Ambiguous>::value), "");382 assert(std::frexp(0, &ip) == 0);383}384 385void test_ldexp()386{387 int ip = 1;388 static_assert((std::is_same<decltype(std::ldexp((float)0, ip)), float>::value), "");389 static_assert((std::is_same<decltype(std::ldexp((bool)0, ip)), double>::value), "");390 static_assert((std::is_same<decltype(std::ldexp((unsigned short)0, ip)), double>::value), "");391 static_assert((std::is_same<decltype(std::ldexp((int)0, ip)), double>::value), "");392 static_assert((std::is_same<decltype(std::ldexp((unsigned int)0, ip)), double>::value), "");393 static_assert((std::is_same<decltype(std::ldexp((long)0, ip)), double>::value), "");394 static_assert((std::is_same<decltype(std::ldexp((unsigned long)0, ip)), double>::value), "");395 static_assert((std::is_same<decltype(std::ldexp((long long)0, ip)), double>::value), "");396 static_assert((std::is_same<decltype(std::ldexp((unsigned long long)0, ip)), double>::value), "");397 static_assert((std::is_same<decltype(std::ldexp((double)0, ip)), double>::value), "");398 static_assert((std::is_same<decltype(std::ldexp((long double)0, ip)), long double>::value), "");399 static_assert((std::is_same<decltype(std::ldexpf(0, ip)), float>::value), "");400 static_assert((std::is_same<decltype(std::ldexpl(0, ip)), long double>::value), "");401 static_assert((std::is_same<decltype(ldexp(Ambiguous(), ip)), Ambiguous>::value), "");402 assert(std::ldexp(1, ip) == 2);403}404 405void test_log()406{407 static_assert((std::is_same<decltype(std::log((float)0)), float>::value), "");408 static_assert((std::is_same<decltype(std::log((bool)0)), double>::value), "");409 static_assert((std::is_same<decltype(std::log((unsigned short)0)), double>::value), "");410 static_assert((std::is_same<decltype(std::log((int)0)), double>::value), "");411 static_assert((std::is_same<decltype(std::log((unsigned int)0)), double>::value), "");412 static_assert((std::is_same<decltype(std::log((long)0)), double>::value), "");413 static_assert((std::is_same<decltype(std::log((unsigned long)0)), double>::value), "");414 static_assert((std::is_same<decltype(std::log((long long)0)), double>::value), "");415 static_assert((std::is_same<decltype(std::log((unsigned long long)0)), double>::value), "");416 static_assert((std::is_same<decltype(std::log((double)0)), double>::value), "");417 static_assert((std::is_same<decltype(std::log((long double)0)), long double>::value), "");418 static_assert((std::is_same<decltype(std::logf(0)), float>::value), "");419 static_assert((std::is_same<decltype(std::logl(0)), long double>::value), "");420 static_assert((std::is_same<decltype(log(Ambiguous())), Ambiguous>::value), "");421 assert(std::log(1) == 0);422}423 424void test_log10()425{426 static_assert((std::is_same<decltype(std::log10((float)0)), float>::value), "");427 static_assert((std::is_same<decltype(std::log10((bool)0)), double>::value), "");428 static_assert((std::is_same<decltype(std::log10((unsigned short)0)), double>::value), "");429 static_assert((std::is_same<decltype(std::log10((int)0)), double>::value), "");430 static_assert((std::is_same<decltype(std::log10((unsigned int)0)), double>::value), "");431 static_assert((std::is_same<decltype(std::log10((long)0)), double>::value), "");432 static_assert((std::is_same<decltype(std::log10((unsigned long)0)), double>::value), "");433 static_assert((std::is_same<decltype(std::log10((long long)0)), double>::value), "");434 static_assert((std::is_same<decltype(std::log10((unsigned long long)0)), double>::value), "");435 static_assert((std::is_same<decltype(std::log10((double)0)), double>::value), "");436 static_assert((std::is_same<decltype(std::log10((long double)0)), long double>::value), "");437 static_assert((std::is_same<decltype(std::log10f(0)), float>::value), "");438 static_assert((std::is_same<decltype(std::log10l(0)), long double>::value), "");439 static_assert((std::is_same<decltype(log10(Ambiguous())), Ambiguous>::value), "");440 assert(std::log10(1) == 0);441}442 443void test_modf()444{445 static_assert((std::is_same<decltype(std::modf((float)0, (float*)0)), float>::value), "");446 static_assert((std::is_same<decltype(std::modf((double)0, (double*)0)), double>::value), "");447 static_assert((std::is_same<decltype(std::modf((long double)0, (long double*)0)), long double>::value), "");448 static_assert((std::is_same<decltype(std::modff(0, (float*)0)), float>::value), "");449 static_assert((std::is_same<decltype(std::modfl(0, (long double*)0)), long double>::value), "");450 static_assert((std::is_same<decltype(modf(Ambiguous(), (Ambiguous*)0)), Ambiguous>::value), "");451 double i;452 assert(std::modf(1., &i) == 0);453}454 455void test_pow()456{457 static_assert((std::is_same<decltype(std::pow((float)0, (float)0)), float>::value), "");458 static_assert((std::is_same<decltype(std::pow((bool)0, (float)0)), double>::value), "");459 static_assert((std::is_same<decltype(std::pow((unsigned short)0, (double)0)), double>::value), "");460 static_assert((std::is_same<decltype(std::pow((int)0, (long double)0)), long double>::value), "");461 static_assert((std::is_same<decltype(std::pow((float)0, (unsigned int)0)), double>::value), "");462 static_assert((std::is_same<decltype(std::pow((double)0, (long)0)), double>::value), "");463 static_assert((std::is_same<decltype(std::pow((long double)0, (unsigned long)0)), long double>::value), "");464 static_assert((std::is_same<decltype(std::pow((int)0, (long long)0)), double>::value), "");465 static_assert((std::is_same<decltype(std::pow((int)0, (unsigned long long)0)), double>::value), "");466 static_assert((std::is_same<decltype(std::pow((double)0, (double)0)), double>::value), "");467 static_assert((std::is_same<decltype(std::pow((long double)0, (long double)0)), long double>::value), "");468 static_assert((std::is_same<decltype(std::pow((float)0, (double)0)), double>::value), "");469 static_assert((std::is_same<decltype(std::pow((float)0, (long double)0)), long double>::value), "");470 static_assert((std::is_same<decltype(std::pow((double)0, (long double)0)), long double>::value), "");471 static_assert((std::is_same<decltype(std::powf(0,0)), float>::value), "");472 static_assert((std::is_same<decltype(std::powl(0,0)), long double>::value), "");473 static_assert((std::is_same<decltype(std::pow((int)0, (int)0)), double>::value), "");474// static_assert((std::is_same<decltype(std::pow(Value<int>(), (int)0)), double>::value), "");475// static_assert((std::is_same<decltype(std::pow(Value<long double>(), (float)0)), long double>::value), "");476// static_assert((std::is_same<decltype(std::pow((float) 0, Value<float>())), float>::value), "");477 static_assert((std::is_same<decltype(pow(Ambiguous(), Ambiguous())), Ambiguous>::value), "");478 assert(std::pow(1,1) == 1);479// assert(std::pow(Value<int,1>(), Value<float,1>()) == 1);480// assert(std::pow(1.0f, Value<double,1>()) == 1);481// assert(std::pow(1.0, Value<int,1>()) == 1);482// assert(std::pow(Value<long double,1>(), 1LL) == 1);483}484 485void test_sin()486{487 static_assert((std::is_same<decltype(std::sin((float)0)), float>::value), "");488 static_assert((std::is_same<decltype(std::sin((bool)0)), double>::value), "");489 static_assert((std::is_same<decltype(std::sin((unsigned short)0)), double>::value), "");490 static_assert((std::is_same<decltype(std::sin((int)0)), double>::value), "");491 static_assert((std::is_same<decltype(std::sin((unsigned int)0)), double>::value), "");492 static_assert((std::is_same<decltype(std::sin((long)0)), double>::value), "");493 static_assert((std::is_same<decltype(std::sin((unsigned long)0)), double>::value), "");494 static_assert((std::is_same<decltype(std::sin((long long)0)), double>::value), "");495 static_assert((std::is_same<decltype(std::sin((unsigned long long)0)), double>::value), "");496 static_assert((std::is_same<decltype(std::sin((double)0)), double>::value), "");497 static_assert((std::is_same<decltype(std::sin((long double)0)), long double>::value), "");498 static_assert((std::is_same<decltype(std::sinf(0)), float>::value), "");499 static_assert((std::is_same<decltype(std::sinl(0)), long double>::value), "");500 static_assert((std::is_same<decltype(sin(Ambiguous())), Ambiguous>::value), "");501 assert(std::sin(0) == 0);502}503 504void test_sinh()505{506 static_assert((std::is_same<decltype(std::sinh((float)0)), float>::value), "");507 static_assert((std::is_same<decltype(std::sinh((bool)0)), double>::value), "");508 static_assert((std::is_same<decltype(std::sinh((unsigned short)0)), double>::value), "");509 static_assert((std::is_same<decltype(std::sinh((int)0)), double>::value), "");510 static_assert((std::is_same<decltype(std::sinh((unsigned int)0)), double>::value), "");511 static_assert((std::is_same<decltype(std::sinh((long)0)), double>::value), "");512 static_assert((std::is_same<decltype(std::sinh((unsigned long)0)), double>::value), "");513 static_assert((std::is_same<decltype(std::sinh((long long)0)), double>::value), "");514 static_assert((std::is_same<decltype(std::sinh((unsigned long long)0)), double>::value), "");515 static_assert((std::is_same<decltype(std::sinh((double)0)), double>::value), "");516 static_assert((std::is_same<decltype(std::sinh((long double)0)), long double>::value), "");517 static_assert((std::is_same<decltype(std::sinhf(0)), float>::value), "");518 static_assert((std::is_same<decltype(std::sinhl(0)), long double>::value), "");519 static_assert((std::is_same<decltype(sinh(Ambiguous())), Ambiguous>::value), "");520 assert(std::sinh(0) == 0);521}522 523void test_sqrt()524{525 static_assert((std::is_same<decltype(std::sqrt((float)0)), float>::value), "");526 static_assert((std::is_same<decltype(std::sqrt((bool)0)), double>::value), "");527 static_assert((std::is_same<decltype(std::sqrt((unsigned short)0)), double>::value), "");528 static_assert((std::is_same<decltype(std::sqrt((int)0)), double>::value), "");529 static_assert((std::is_same<decltype(std::sqrt((unsigned int)0)), double>::value), "");530 static_assert((std::is_same<decltype(std::sqrt((long)0)), double>::value), "");531 static_assert((std::is_same<decltype(std::sqrt((unsigned long)0)), double>::value), "");532 static_assert((std::is_same<decltype(std::sqrt((long long)0)), double>::value), "");533 static_assert((std::is_same<decltype(std::sqrt((unsigned long long)0)), double>::value), "");534 static_assert((std::is_same<decltype(std::sqrt((double)0)), double>::value), "");535 static_assert((std::is_same<decltype(std::sqrt((long double)0)), long double>::value), "");536 static_assert((std::is_same<decltype(std::sqrtf(0)), float>::value), "");537 static_assert((std::is_same<decltype(std::sqrtl(0)), long double>::value), "");538 static_assert((std::is_same<decltype(sqrt(Ambiguous())), Ambiguous>::value), "");539 assert(std::sqrt(4) == 2);540}541 542void test_tan()543{544 static_assert((std::is_same<decltype(std::tan((float)0)), float>::value), "");545 static_assert((std::is_same<decltype(std::tan((bool)0)), double>::value), "");546 static_assert((std::is_same<decltype(std::tan((unsigned short)0)), double>::value), "");547 static_assert((std::is_same<decltype(std::tan((int)0)), double>::value), "");548 static_assert((std::is_same<decltype(std::tan((unsigned int)0)), double>::value), "");549 static_assert((std::is_same<decltype(std::tan((long)0)), double>::value), "");550 static_assert((std::is_same<decltype(std::tan((unsigned long)0)), double>::value), "");551 static_assert((std::is_same<decltype(std::tan((long long)0)), double>::value), "");552 static_assert((std::is_same<decltype(std::tan((unsigned long long)0)), double>::value), "");553 static_assert((std::is_same<decltype(std::tan((double)0)), double>::value), "");554 static_assert((std::is_same<decltype(std::tan((long double)0)), long double>::value), "");555 static_assert((std::is_same<decltype(std::tanf(0)), float>::value), "");556 static_assert((std::is_same<decltype(std::tanl(0)), long double>::value), "");557 static_assert((std::is_same<decltype(tan(Ambiguous())), Ambiguous>::value), "");558 assert(std::tan(0) == 0);559}560 561void test_tanh()562{563 static_assert((std::is_same<decltype(std::tanh((float)0)), float>::value), "");564 static_assert((std::is_same<decltype(std::tanh((bool)0)), double>::value), "");565 static_assert((std::is_same<decltype(std::tanh((unsigned short)0)), double>::value), "");566 static_assert((std::is_same<decltype(std::tanh((int)0)), double>::value), "");567 static_assert((std::is_same<decltype(std::tanh((unsigned int)0)), double>::value), "");568 static_assert((std::is_same<decltype(std::tanh((long)0)), double>::value), "");569 static_assert((std::is_same<decltype(std::tanh((unsigned long)0)), double>::value), "");570 static_assert((std::is_same<decltype(std::tanh((long long)0)), double>::value), "");571 static_assert((std::is_same<decltype(std::tanh((unsigned long long)0)), double>::value), "");572 static_assert((std::is_same<decltype(std::tanh((double)0)), double>::value), "");573 static_assert((std::is_same<decltype(std::tanh((long double)0)), long double>::value), "");574 static_assert((std::is_same<decltype(std::tanhf(0)), float>::value), "");575 static_assert((std::is_same<decltype(std::tanhl(0)), long double>::value), "");576 static_assert((std::is_same<decltype(tanh(Ambiguous())), Ambiguous>::value), "");577 assert(std::tanh(0) == 0);578}579 580void test_signbit()581{582#ifdef signbit583#error signbit defined584#endif585 static_assert((std::is_same<decltype(std::signbit((float)0)), bool>::value), "");586 static_assert((std::is_same<decltype(std::signbit((double)0)), bool>::value), "");587 static_assert((std::is_same<decltype(std::signbit(0)), bool>::value), "");588 static_assert((std::is_same<decltype(std::signbit((long double)0)), bool>::value), "");589 static_assert((std::is_same<decltype(signbit(Ambiguous())), Ambiguous>::value), "");590 assert(std::signbit(-1.0) == true);591 assert(std::signbit(0u) == false);592 assert(std::signbit(std::numeric_limits<unsigned>::max()) == false);593 assert(std::signbit(0) == false);594 assert(std::signbit(1) == false);595 assert(std::signbit(-1) == true);596 assert(std::signbit(std::numeric_limits<int>::max()) == false);597 assert(std::signbit(std::numeric_limits<int>::min()) == true);598}599 600void test_fpclassify()601{602#ifdef fpclassify603#error fpclassify defined604#endif605 static_assert((std::is_same<decltype(std::fpclassify((float)0)), int>::value), "");606 static_assert((std::is_same<decltype(std::fpclassify((double)0)), int>::value), "");607 static_assert((std::is_same<decltype(std::fpclassify(0)), int>::value), "");608 static_assert((std::is_same<decltype(std::fpclassify((long double)0)), int>::value), "");609 static_assert((std::is_same<decltype(fpclassify(Ambiguous())), Ambiguous>::value), "");610 static_assert((std::is_same<decltype(fpclassify(Value<float>())), int>::value), "");611 static_assert((std::is_same<decltype(fpclassify(Value<double>())), int>::value), "");612 static_assert((std::is_same<decltype(fpclassify(Value<long double>())), int>::value), "");613 ASSERT_NOEXCEPT(std::fpclassify((float)0));614 ASSERT_NOEXCEPT(std::fpclassify((double)0));615 ASSERT_NOEXCEPT(std::fpclassify((long double)0));616 ASSERT_NOEXCEPT(std::fpclassify(0));617 assert(std::fpclassify(-1.0) == FP_NORMAL);618 assert(std::fpclassify(0) == FP_ZERO);619 assert(std::fpclassify(1) == FP_NORMAL);620 assert(std::fpclassify(-1) == FP_NORMAL);621 assert(std::fpclassify(std::numeric_limits<int>::max()) == FP_NORMAL);622 assert(std::fpclassify(std::numeric_limits<int>::min()) == FP_NORMAL);623 assert(std::fpclassify(Value<double, 1>()) == FP_NORMAL);624}625 626void test_isfinite()627{628#ifdef isfinite629#error isfinite defined630#endif631 static_assert((std::is_same<decltype(std::isfinite((float)0)), bool>::value), "");632 static_assert((std::is_same<decltype(std::isfinite((double)0)), bool>::value), "");633 static_assert((std::is_same<decltype(std::isfinite(0)), bool>::value), "");634 static_assert((std::is_same<decltype(std::isfinite((long double)0)), bool>::value), "");635 static_assert((std::is_same<decltype(isfinite(Ambiguous())), Ambiguous>::value), "");636 assert(std::isfinite(-1.0) == true);637 assert(std::isfinite(0) == true);638 assert(std::isfinite(1) == true);639 assert(std::isfinite(-1) == true);640 assert(std::isfinite(std::numeric_limits<int>::max()) == true);641 assert(std::isfinite(std::numeric_limits<int>::min()) == true);642}643 644void test_isnormal()645{646#ifdef isnormal647#error isnormal defined648#endif649 static_assert((std::is_same<decltype(std::isnormal((float)0)), bool>::value), "");650 static_assert((std::is_same<decltype(std::isnormal((double)0)), bool>::value), "");651 static_assert((std::is_same<decltype(std::isnormal(0)), bool>::value), "");652 static_assert((std::is_same<decltype(std::isnormal((long double)0)), bool>::value), "");653 static_assert((std::is_same<decltype(isnormal(Ambiguous())), Ambiguous>::value), "");654 assert(std::isnormal(-1.0) == true);655 assert(std::isnormal(0) == false);656 assert(std::isnormal(1) == true);657 assert(std::isnormal(-1) == true);658 assert(std::isnormal(std::numeric_limits<int>::max()) == true);659 assert(std::isnormal(std::numeric_limits<int>::min()) == true);660}661 662void test_isgreater()663{664#ifdef isgreater665#error isgreater defined666#endif667 static_assert((std::is_same<decltype(std::isgreater((float)0, (float)0)), bool>::value), "");668 static_assert((std::is_same<decltype(std::isgreater((float)0, (double)0)), bool>::value), "");669 static_assert((std::is_same<decltype(std::isgreater((float)0, (long double)0)), bool>::value), "");670 static_assert((std::is_same<decltype(std::isgreater((double)0, (float)0)), bool>::value), "");671 static_assert((std::is_same<decltype(std::isgreater((double)0, (double)0)), bool>::value), "");672 static_assert((std::is_same<decltype(std::isgreater(0, (double)0)), bool>::value), "");673 static_assert((std::is_same<decltype(std::isgreater((double)0, (long double)0)), bool>::value), "");674 static_assert((std::is_same<decltype(std::isgreater((long double)0, (float)0)), bool>::value), "");675 static_assert((std::is_same<decltype(std::isgreater((long double)0, (double)0)), bool>::value), "");676 static_assert((std::is_same<decltype(std::isgreater((long double)0, (long double)0)), bool>::value), "");677 static_assert((std::is_same<decltype(isgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");678 assert(std::isgreater(-1.0, 0.F) == false);679}680 681void test_isgreaterequal()682{683#ifdef isgreaterequal684#error isgreaterequal defined685#endif686 static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (float)0)), bool>::value), "");687 static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (double)0)), bool>::value), "");688 static_assert((std::is_same<decltype(std::isgreaterequal((float)0, (long double)0)), bool>::value), "");689 static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (float)0)), bool>::value), "");690 static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (double)0)), bool>::value), "");691 static_assert((std::is_same<decltype(std::isgreaterequal(0, (double)0)), bool>::value), "");692 static_assert((std::is_same<decltype(std::isgreaterequal((double)0, (long double)0)), bool>::value), "");693 static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (float)0)), bool>::value), "");694 static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (double)0)), bool>::value), "");695 static_assert((std::is_same<decltype(std::isgreaterequal((long double)0, (long double)0)), bool>::value), "");696 static_assert((std::is_same<decltype(isgreaterequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");697 assert(std::isgreaterequal(-1.0, 0.F) == false);698}699 700void test_isinf()701{702#ifdef isinf703#error isinf defined704#endif705 static_assert((std::is_same<decltype(std::isinf((float)0)), bool>::value), "");706 707 typedef decltype(std::isinf((double)0)) DoubleRetType;708#if defined(__GLIBC__) && TEST_STD_VER == 03 && defined(TEST_COMPILER_CLANG)709 // GLIBC < 2.23 defines 'isinf(double)' with a return type of 'int' in710 // all C++ dialects. The test should tolerate this when libc++ can't work711 // around it via `_LIBCPP_PREFERRED_OVERLOAD`, which is only available712 // in modern versions of Clang, and not elsewhere.713 // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439714 static_assert((std::is_same<DoubleRetType, bool>::value715 || std::is_same<DoubleRetType, int>::value), "");716#else717 static_assert((std::is_same<DoubleRetType, bool>::value), "");718#endif719 720 static_assert((std::is_same<decltype(std::isinf(0)), bool>::value), "");721 static_assert((std::is_same<decltype(std::isinf((long double)0)), bool>::value), "");722 assert(std::isinf(-1.0) == false);723 assert(std::isinf(0) == false);724 assert(std::isinf(1) == false);725 assert(std::isinf(-1) == false);726 assert(std::isinf(std::numeric_limits<int>::max()) == false);727 assert(std::isinf(std::numeric_limits<int>::min()) == false);728}729 730void test_isless()731{732#ifdef isless733#error isless defined734#endif735 static_assert((std::is_same<decltype(std::isless((float)0, (float)0)), bool>::value), "");736 static_assert((std::is_same<decltype(std::isless((float)0, (double)0)), bool>::value), "");737 static_assert((std::is_same<decltype(std::isless((float)0, (long double)0)), bool>::value), "");738 static_assert((std::is_same<decltype(std::isless((double)0, (float)0)), bool>::value), "");739 static_assert((std::is_same<decltype(std::isless((double)0, (double)0)), bool>::value), "");740 static_assert((std::is_same<decltype(std::isless(0, (double)0)), bool>::value), "");741 static_assert((std::is_same<decltype(std::isless((double)0, (long double)0)), bool>::value), "");742 static_assert((std::is_same<decltype(std::isless((long double)0, (float)0)), bool>::value), "");743 static_assert((std::is_same<decltype(std::isless((long double)0, (double)0)), bool>::value), "");744 static_assert((std::is_same<decltype(std::isless((long double)0, (long double)0)), bool>::value), "");745 static_assert((std::is_same<decltype(isless(Ambiguous(), Ambiguous())), Ambiguous>::value), "");746 assert(std::isless(-1.0, 0.F) == true);747}748 749void test_islessequal()750{751#ifdef islessequal752#error islessequal defined753#endif754 static_assert((std::is_same<decltype(std::islessequal((float)0, (float)0)), bool>::value), "");755 static_assert((std::is_same<decltype(std::islessequal((float)0, (double)0)), bool>::value), "");756 static_assert((std::is_same<decltype(std::islessequal((float)0, (long double)0)), bool>::value), "");757 static_assert((std::is_same<decltype(std::islessequal((double)0, (float)0)), bool>::value), "");758 static_assert((std::is_same<decltype(std::islessequal((double)0, (double)0)), bool>::value), "");759 static_assert((std::is_same<decltype(std::islessequal(0, (double)0)), bool>::value), "");760 static_assert((std::is_same<decltype(std::islessequal((double)0, (long double)0)), bool>::value), "");761 static_assert((std::is_same<decltype(std::islessequal((long double)0, (float)0)), bool>::value), "");762 static_assert((std::is_same<decltype(std::islessequal((long double)0, (double)0)), bool>::value), "");763 static_assert((std::is_same<decltype(std::islessequal((long double)0, (long double)0)), bool>::value), "");764 static_assert((std::is_same<decltype(islessequal(Ambiguous(), Ambiguous())), Ambiguous>::value), "");765 assert(std::islessequal(-1.0, 0.F) == true);766}767 768void test_islessgreater()769{770#ifdef islessgreater771#error islessgreater defined772#endif773 static_assert((std::is_same<decltype(std::islessgreater((float)0, (float)0)), bool>::value), "");774 static_assert((std::is_same<decltype(std::islessgreater((float)0, (double)0)), bool>::value), "");775 static_assert((std::is_same<decltype(std::islessgreater((float)0, (long double)0)), bool>::value), "");776 static_assert((std::is_same<decltype(std::islessgreater((double)0, (float)0)), bool>::value), "");777 static_assert((std::is_same<decltype(std::islessgreater((double)0, (double)0)), bool>::value), "");778 static_assert((std::is_same<decltype(std::islessgreater(0, (double)0)), bool>::value), "");779 static_assert((std::is_same<decltype(std::islessgreater((double)0, (long double)0)), bool>::value), "");780 static_assert((std::is_same<decltype(std::islessgreater((long double)0, (float)0)), bool>::value), "");781 static_assert((std::is_same<decltype(std::islessgreater((long double)0, (double)0)), bool>::value), "");782 static_assert((std::is_same<decltype(std::islessgreater((long double)0, (long double)0)), bool>::value), "");783 static_assert((std::is_same<decltype(islessgreater(Ambiguous(), Ambiguous())), Ambiguous>::value), "");784 assert(std::islessgreater(-1.0, 0.F) == true);785}786 787void test_isnan()788{789#ifdef isnan790#error isnan defined791#endif792 static_assert((std::is_same<decltype(std::isnan((float)0)), bool>::value), "");793 794 typedef decltype(std::isnan((double)0)) DoubleRetType;795#if defined(__GLIBC__) && TEST_STD_VER == 03 && defined(TEST_COMPILER_CLANG)796 // GLIBC < 2.23 defines 'isnan(double)' with a return type of 'int' in797 // all C++ dialects. The test should tolerate this when libc++ can't work798 // around it via `_LIBCPP_PREFERRED_OVERLOAD`, which is only available799 // in modern versions of Clang, and not elsewhere.800 // See: https://sourceware.org/bugzilla/show_bug.cgi?id=19439801 static_assert((std::is_same<DoubleRetType, bool>::value802 || std::is_same<DoubleRetType, int>::value), "");803#else804 static_assert((std::is_same<DoubleRetType, bool>::value), "");805#endif806 807 static_assert((std::is_same<decltype(std::isnan(0)), bool>::value), "");808 static_assert((std::is_same<decltype(std::isnan((long double)0)), bool>::value), "");809 assert(std::isnan(-1.0) == false);810 assert(std::isnan(0) == false);811 assert(std::isnan(1) == false);812 assert(std::isnan(-1) == false);813 assert(std::isnan(std::numeric_limits<int>::max()) == false);814 assert(std::isnan(std::numeric_limits<int>::min()) == false);815}816 817void test_isunordered()818{819#ifdef isunordered820#error isunordered defined821#endif822 static_assert((std::is_same<decltype(std::isunordered((float)0, (float)0)), bool>::value), "");823 static_assert((std::is_same<decltype(std::isunordered((float)0, (double)0)), bool>::value), "");824 static_assert((std::is_same<decltype(std::isunordered((float)0, (long double)0)), bool>::value), "");825 static_assert((std::is_same<decltype(std::isunordered((double)0, (float)0)), bool>::value), "");826 static_assert((std::is_same<decltype(std::isunordered((double)0, (double)0)), bool>::value), "");827 static_assert((std::is_same<decltype(std::isunordered(0, (double)0)), bool>::value), "");828 static_assert((std::is_same<decltype(std::isunordered((double)0, (long double)0)), bool>::value), "");829 static_assert((std::is_same<decltype(std::isunordered((long double)0, (float)0)), bool>::value), "");830 static_assert((std::is_same<decltype(std::isunordered((long double)0, (double)0)), bool>::value), "");831 static_assert((std::is_same<decltype(std::isunordered((long double)0, (long double)0)), bool>::value), "");832 static_assert((std::is_same<decltype(isunordered(Ambiguous(), Ambiguous())), Ambiguous>::value), "");833 assert(std::isunordered(-1.0, 0.F) == false);834}835 836void test_acosh()837{838 static_assert((std::is_same<decltype(std::acosh((float)0)), float>::value), "");839 static_assert((std::is_same<decltype(std::acosh((bool)0)), double>::value), "");840 static_assert((std::is_same<decltype(std::acosh((unsigned short)0)), double>::value), "");841 static_assert((std::is_same<decltype(std::acosh((int)0)), double>::value), "");842 static_assert((std::is_same<decltype(std::acosh((unsigned int)0)), double>::value), "");843 static_assert((std::is_same<decltype(std::acosh((long)0)), double>::value), "");844 static_assert((std::is_same<decltype(std::acosh((unsigned long)0)), double>::value), "");845 static_assert((std::is_same<decltype(std::acosh((long long)0)), double>::value), "");846 static_assert((std::is_same<decltype(std::acosh((unsigned long long)0)), double>::value), "");847 static_assert((std::is_same<decltype(std::acosh((double)0)), double>::value), "");848 static_assert((std::is_same<decltype(std::acosh((long double)0)), long double>::value), "");849 static_assert((std::is_same<decltype(std::acoshf(0)), float>::value), "");850 static_assert((std::is_same<decltype(std::acoshl(0)), long double>::value), "");851 static_assert((std::is_same<decltype(acosh(Ambiguous())), Ambiguous>::value), "");852 assert(std::acosh(1) == 0);853}854 855void test_asinh()856{857 static_assert((std::is_same<decltype(std::asinh((float)0)), float>::value), "");858 static_assert((std::is_same<decltype(std::asinh((bool)0)), double>::value), "");859 static_assert((std::is_same<decltype(std::asinh((unsigned short)0)), double>::value), "");860 static_assert((std::is_same<decltype(std::asinh((int)0)), double>::value), "");861 static_assert((std::is_same<decltype(std::asinh((unsigned int)0)), double>::value), "");862 static_assert((std::is_same<decltype(std::asinh((long)0)), double>::value), "");863 static_assert((std::is_same<decltype(std::asinh((unsigned long)0)), double>::value), "");864 static_assert((std::is_same<decltype(std::asinh((long long)0)), double>::value), "");865 static_assert((std::is_same<decltype(std::asinh((unsigned long long)0)), double>::value), "");866 static_assert((std::is_same<decltype(std::asinh((double)0)), double>::value), "");867 static_assert((std::is_same<decltype(std::asinh((long double)0)), long double>::value), "");868 static_assert((std::is_same<decltype(std::asinhf(0)), float>::value), "");869 static_assert((std::is_same<decltype(std::asinhl(0)), long double>::value), "");870 static_assert((std::is_same<decltype(asinh(Ambiguous())), Ambiguous>::value), "");871 assert(std::asinh(0) == 0);872}873 874void test_atanh()875{876 static_assert((std::is_same<decltype(std::atanh((float)0)), float>::value), "");877 static_assert((std::is_same<decltype(std::atanh((bool)0)), double>::value), "");878 static_assert((std::is_same<decltype(std::atanh((unsigned short)0)), double>::value), "");879 static_assert((std::is_same<decltype(std::atanh((int)0)), double>::value), "");880 static_assert((std::is_same<decltype(std::atanh((unsigned int)0)), double>::value), "");881 static_assert((std::is_same<decltype(std::atanh((long)0)), double>::value), "");882 static_assert((std::is_same<decltype(std::atanh((unsigned long)0)), double>::value), "");883 static_assert((std::is_same<decltype(std::atanh((long long)0)), double>::value), "");884 static_assert((std::is_same<decltype(std::atanh((unsigned long long)0)), double>::value), "");885 static_assert((std::is_same<decltype(std::atanh((double)0)), double>::value), "");886 static_assert((std::is_same<decltype(std::atanh((long double)0)), long double>::value), "");887 static_assert((std::is_same<decltype(std::atanhf(0)), float>::value), "");888 static_assert((std::is_same<decltype(std::atanhl(0)), long double>::value), "");889 static_assert((std::is_same<decltype(atanh(Ambiguous())), Ambiguous>::value), "");890 assert(std::atanh(0) == 0);891}892 893void test_cbrt()894{895 static_assert((std::is_same<decltype(std::cbrt((float)0)), float>::value), "");896 static_assert((std::is_same<decltype(std::cbrt((bool)0)), double>::value), "");897 static_assert((std::is_same<decltype(std::cbrt((unsigned short)0)), double>::value), "");898 static_assert((std::is_same<decltype(std::cbrt((int)0)), double>::value), "");899 static_assert((std::is_same<decltype(std::cbrt((unsigned int)0)), double>::value), "");900 static_assert((std::is_same<decltype(std::cbrt((long)0)), double>::value), "");901 static_assert((std::is_same<decltype(std::cbrt((unsigned long)0)), double>::value), "");902 static_assert((std::is_same<decltype(std::cbrt((long long)0)), double>::value), "");903 static_assert((std::is_same<decltype(std::cbrt((unsigned long long)0)), double>::value), "");904 static_assert((std::is_same<decltype(std::cbrt((double)0)), double>::value), "");905 static_assert((std::is_same<decltype(std::cbrt((long double)0)), long double>::value), "");906 static_assert((std::is_same<decltype(std::cbrtf(0)), float>::value), "");907 static_assert((std::is_same<decltype(std::cbrtl(0)), long double>::value), "");908 static_assert((std::is_same<decltype(cbrt(Ambiguous())), Ambiguous>::value), "");909 assert(truncate_fp(std::cbrt(1)) == 1);910}911 912void test_copysign()913{914 static_assert((std::is_same<decltype(std::copysign((float)0, (float)0)), float>::value), "");915 static_assert((std::is_same<decltype(std::copysign((bool)0, (float)0)), double>::value), "");916 static_assert((std::is_same<decltype(std::copysign((unsigned short)0, (double)0)), double>::value), "");917 static_assert((std::is_same<decltype(std::copysign((int)0, (long double)0)), long double>::value), "");918 static_assert((std::is_same<decltype(std::copysign((float)0, (unsigned int)0)), double>::value), "");919 static_assert((std::is_same<decltype(std::copysign((double)0, (long)0)), double>::value), "");920 static_assert((std::is_same<decltype(std::copysign((long double)0, (unsigned long)0)), long double>::value), "");921 static_assert((std::is_same<decltype(std::copysign((int)0, (long long)0)), double>::value), "");922 static_assert((std::is_same<decltype(std::copysign((int)0, (unsigned long long)0)), double>::value), "");923 static_assert((std::is_same<decltype(std::copysign((double)0, (double)0)), double>::value), "");924 static_assert((std::is_same<decltype(std::copysign((long double)0, (long double)0)), long double>::value), "");925 static_assert((std::is_same<decltype(std::copysign((float)0, (double)0)), double>::value), "");926 static_assert((std::is_same<decltype(std::copysign((float)0, (long double)0)), long double>::value), "");927 static_assert((std::is_same<decltype(std::copysign((double)0, (long double)0)), long double>::value), "");928 static_assert((std::is_same<decltype(std::copysignf(0,0)), float>::value), "");929 static_assert((std::is_same<decltype(std::copysignl(0,0)), long double>::value), "");930 static_assert((std::is_same<decltype(std::copysign((int)0, (int)0)), double>::value), "");931 static_assert((std::is_same<decltype(copysign(Ambiguous(), Ambiguous())), Ambiguous>::value), "");932 assert(std::copysign(1,1) == 1);933}934 935void test_erf()936{937 static_assert((std::is_same<decltype(std::erf((float)0)), float>::value), "");938 static_assert((std::is_same<decltype(std::erf((bool)0)), double>::value), "");939 static_assert((std::is_same<decltype(std::erf((unsigned short)0)), double>::value), "");940 static_assert((std::is_same<decltype(std::erf((int)0)), double>::value), "");941 static_assert((std::is_same<decltype(std::erf((unsigned int)0)), double>::value), "");942 static_assert((std::is_same<decltype(std::erf((long)0)), double>::value), "");943 static_assert((std::is_same<decltype(std::erf((unsigned long)0)), double>::value), "");944 static_assert((std::is_same<decltype(std::erf((long long)0)), double>::value), "");945 static_assert((std::is_same<decltype(std::erf((unsigned long long)0)), double>::value), "");946 static_assert((std::is_same<decltype(std::erf((double)0)), double>::value), "");947 static_assert((std::is_same<decltype(std::erf((long double)0)), long double>::value), "");948 static_assert((std::is_same<decltype(std::erff(0)), float>::value), "");949 static_assert((std::is_same<decltype(std::erfl(0)), long double>::value), "");950 static_assert((std::is_same<decltype(erf(Ambiguous())), Ambiguous>::value), "");951 assert(std::erf(0) == 0);952}953 954void test_erfc()955{956 static_assert((std::is_same<decltype(std::erfc((float)0)), float>::value), "");957 static_assert((std::is_same<decltype(std::erfc((bool)0)), double>::value), "");958 static_assert((std::is_same<decltype(std::erfc((unsigned short)0)), double>::value), "");959 static_assert((std::is_same<decltype(std::erfc((int)0)), double>::value), "");960 static_assert((std::is_same<decltype(std::erfc((unsigned int)0)), double>::value), "");961 static_assert((std::is_same<decltype(std::erfc((long)0)), double>::value), "");962 static_assert((std::is_same<decltype(std::erfc((unsigned long)0)), double>::value), "");963 static_assert((std::is_same<decltype(std::erfc((long long)0)), double>::value), "");964 static_assert((std::is_same<decltype(std::erfc((unsigned long long)0)), double>::value), "");965 static_assert((std::is_same<decltype(std::erfc((double)0)), double>::value), "");966 static_assert((std::is_same<decltype(std::erfc((long double)0)), long double>::value), "");967 static_assert((std::is_same<decltype(std::erfcf(0)), float>::value), "");968 static_assert((std::is_same<decltype(std::erfcl(0)), long double>::value), "");969 static_assert((std::is_same<decltype(erfc(Ambiguous())), Ambiguous>::value), "");970 assert(std::erfc(0) == 1);971}972 973void test_exp2()974{975 static_assert((std::is_same<decltype(std::exp2((float)0)), float>::value), "");976 static_assert((std::is_same<decltype(std::exp2((bool)0)), double>::value), "");977 static_assert((std::is_same<decltype(std::exp2((unsigned short)0)), double>::value), "");978 static_assert((std::is_same<decltype(std::exp2((int)0)), double>::value), "");979 static_assert((std::is_same<decltype(std::exp2((unsigned int)0)), double>::value), "");980 static_assert((std::is_same<decltype(std::exp2((long)0)), double>::value), "");981 static_assert((std::is_same<decltype(std::exp2((unsigned long)0)), double>::value), "");982 static_assert((std::is_same<decltype(std::exp2((long long)0)), double>::value), "");983 static_assert((std::is_same<decltype(std::exp2((unsigned long long)0)), double>::value), "");984 static_assert((std::is_same<decltype(std::exp2((double)0)), double>::value), "");985 static_assert((std::is_same<decltype(std::exp2((long double)0)), long double>::value), "");986 static_assert((std::is_same<decltype(std::exp2f(0)), float>::value), "");987 static_assert((std::is_same<decltype(std::exp2l(0)), long double>::value), "");988 static_assert((std::is_same<decltype(exp2(Ambiguous())), Ambiguous>::value), "");989 assert(std::exp2(1) == 2);990}991 992void test_expm1()993{994 static_assert((std::is_same<decltype(std::expm1((float)0)), float>::value), "");995 static_assert((std::is_same<decltype(std::expm1((bool)0)), double>::value), "");996 static_assert((std::is_same<decltype(std::expm1((unsigned short)0)), double>::value), "");997 static_assert((std::is_same<decltype(std::expm1((int)0)), double>::value), "");998 static_assert((std::is_same<decltype(std::expm1((unsigned int)0)), double>::value), "");999 static_assert((std::is_same<decltype(std::expm1((long)0)), double>::value), "");1000 static_assert((std::is_same<decltype(std::expm1((unsigned long)0)), double>::value), "");1001 static_assert((std::is_same<decltype(std::expm1((long long)0)), double>::value), "");1002 static_assert((std::is_same<decltype(std::expm1((unsigned long long)0)), double>::value), "");1003 static_assert((std::is_same<decltype(std::expm1((double)0)), double>::value), "");1004 static_assert((std::is_same<decltype(std::expm1((long double)0)), long double>::value), "");1005 static_assert((std::is_same<decltype(std::expm1f(0)), float>::value), "");1006 static_assert((std::is_same<decltype(std::expm1l(0)), long double>::value), "");1007 static_assert((std::is_same<decltype(expm1(Ambiguous())), Ambiguous>::value), "");1008 assert(std::expm1(0) == 0);1009}1010 1011void test_fdim()1012{1013 static_assert((std::is_same<decltype(std::fdim((float)0, (float)0)), float>::value), "");1014 static_assert((std::is_same<decltype(std::fdim((bool)0, (float)0)), double>::value), "");1015 static_assert((std::is_same<decltype(std::fdim((unsigned short)0, (double)0)), double>::value), "");1016 static_assert((std::is_same<decltype(std::fdim((int)0, (long double)0)), long double>::value), "");1017 static_assert((std::is_same<decltype(std::fdim((float)0, (unsigned int)0)), double>::value), "");1018 static_assert((std::is_same<decltype(std::fdim((double)0, (long)0)), double>::value), "");1019 static_assert((std::is_same<decltype(std::fdim((long double)0, (unsigned long)0)), long double>::value), "");1020 static_assert((std::is_same<decltype(std::fdim((int)0, (long long)0)), double>::value), "");1021 static_assert((std::is_same<decltype(std::fdim((int)0, (unsigned long long)0)), double>::value), "");1022 static_assert((std::is_same<decltype(std::fdim((double)0, (double)0)), double>::value), "");1023 static_assert((std::is_same<decltype(std::fdim((long double)0, (long double)0)), long double>::value), "");1024 static_assert((std::is_same<decltype(std::fdim((float)0, (double)0)), double>::value), "");1025 static_assert((std::is_same<decltype(std::fdim((float)0, (long double)0)), long double>::value), "");1026 static_assert((std::is_same<decltype(std::fdim((double)0, (long double)0)), long double>::value), "");1027 static_assert((std::is_same<decltype(std::fdimf(0,0)), float>::value), "");1028 static_assert((std::is_same<decltype(std::fdiml(0,0)), long double>::value), "");1029 static_assert((std::is_same<decltype(std::fdim((int)0, (int)0)), double>::value), "");1030 static_assert((std::is_same<decltype(fdim(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1031 assert(std::fdim(1,0) == 1);1032}1033 1034void test_fma()1035{1036 static_assert((std::is_same<decltype(std::fma((bool)0, (float)0, (float)0)), double>::value), "");1037 static_assert((std::is_same<decltype(std::fma((char)0, (float)0, (float)0)), double>::value), "");1038 static_assert((std::is_same<decltype(std::fma((unsigned)0, (float)0, (float)0)), double>::value), "");1039 static_assert((std::is_same<decltype(std::fma((float)0, (int)0, (float)0)), double>::value), "");1040 static_assert((std::is_same<decltype(std::fma((float)0, (long)0, (float)0)), double>::value), "");1041 static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (unsigned long long)0)), double>::value), "");1042 static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (double)0)), double>::value), "");1043 static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (long double)0)), long double>::value), "");1044 static_assert((std::is_same<decltype(std::fma((float)0, (float)0, (float)0)), float>::value), "");1045 1046 static_assert((std::is_same<decltype(std::fma((bool)0, (double)0, (double)0)), double>::value), "");1047 static_assert((std::is_same<decltype(std::fma((char)0, (double)0, (double)0)), double>::value), "");1048 static_assert((std::is_same<decltype(std::fma((unsigned)0, (double)0, (double)0)), double>::value), "");1049 static_assert((std::is_same<decltype(std::fma((double)0, (int)0, (double)0)), double>::value), "");1050 static_assert((std::is_same<decltype(std::fma((double)0, (long)0, (double)0)), double>::value), "");1051 static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (unsigned long long)0)), double>::value), "");1052 static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (float)0)), double>::value), "");1053 static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (long double)0)), long double>::value), "");1054 static_assert((std::is_same<decltype(std::fma((double)0, (double)0, (double)0)), double>::value), "");1055 1056 static_assert((std::is_same<decltype(std::fma((bool)0, (long double)0, (long double)0)), long double>::value), "");1057 static_assert((std::is_same<decltype(std::fma((char)0, (long double)0, (long double)0)), long double>::value), "");1058 static_assert((std::is_same<decltype(std::fma((unsigned)0, (long double)0, (long double)0)), long double>::value), "");1059 static_assert((std::is_same<decltype(std::fma((long double)0, (int)0, (long double)0)), long double>::value), "");1060 static_assert((std::is_same<decltype(std::fma((long double)0, (long)0, (long double)0)), long double>::value), "");1061 static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (unsigned long long)0)), long double>::value), "");1062 static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (float)0)), long double>::value), "");1063 static_assert((std::is_same<decltype(std::fma((double)0, (long double)0, (long double)0)), long double>::value), "");1064 static_assert((std::is_same<decltype(std::fma((long double)0, (long double)0, (long double)0)), long double>::value), "");1065 1066 static_assert((std::is_same<decltype(std::fmaf(0,0,0)), float>::value), "");1067 static_assert((std::is_same<decltype(std::fmal(0,0,0)), long double>::value), "");1068 static_assert((std::is_same<decltype(fma(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");1069 assert(std::fma(1,1,1) == 2);1070}1071 1072void test_fmax()1073{1074 static_assert((std::is_same<decltype(std::fmax((float)0, (float)0)), float>::value), "");1075 static_assert((std::is_same<decltype(std::fmax((bool)0, (float)0)), double>::value), "");1076 static_assert((std::is_same<decltype(std::fmax((unsigned short)0, (double)0)), double>::value), "");1077 static_assert((std::is_same<decltype(std::fmax((int)0, (long double)0)), long double>::value), "");1078 static_assert((std::is_same<decltype(std::fmax((float)0, (unsigned int)0)), double>::value), "");1079 static_assert((std::is_same<decltype(std::fmax((double)0, (long)0)), double>::value), "");1080 static_assert((std::is_same<decltype(std::fmax((long double)0, (unsigned long)0)), long double>::value), "");1081 static_assert((std::is_same<decltype(std::fmax((int)0, (long long)0)), double>::value), "");1082 static_assert((std::is_same<decltype(std::fmax((int)0, (unsigned long long)0)), double>::value), "");1083 static_assert((std::is_same<decltype(std::fmax((double)0, (double)0)), double>::value), "");1084 static_assert((std::is_same<decltype(std::fmax((long double)0, (long double)0)), long double>::value), "");1085 static_assert((std::is_same<decltype(std::fmax((float)0, (double)0)), double>::value), "");1086 static_assert((std::is_same<decltype(std::fmax((float)0, (long double)0)), long double>::value), "");1087 static_assert((std::is_same<decltype(std::fmax((double)0, (long double)0)), long double>::value), "");1088 static_assert((std::is_same<decltype(std::fmaxf(0,0)), float>::value), "");1089 static_assert((std::is_same<decltype(std::fmaxl(0,0)), long double>::value), "");1090 static_assert((std::is_same<decltype(std::fmax((int)0, (int)0)), double>::value), "");1091 static_assert((std::is_same<decltype(fmax(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1092 assert(std::fmax(1,0) == 1);1093}1094 1095void test_fmin()1096{1097 static_assert((std::is_same<decltype(std::fmin((float)0, (float)0)), float>::value), "");1098 static_assert((std::is_same<decltype(std::fmin((bool)0, (float)0)), double>::value), "");1099 static_assert((std::is_same<decltype(std::fmin((unsigned short)0, (double)0)), double>::value), "");1100 static_assert((std::is_same<decltype(std::fmin((int)0, (long double)0)), long double>::value), "");1101 static_assert((std::is_same<decltype(std::fmin((float)0, (unsigned int)0)), double>::value), "");1102 static_assert((std::is_same<decltype(std::fmin((double)0, (long)0)), double>::value), "");1103 static_assert((std::is_same<decltype(std::fmin((long double)0, (unsigned long)0)), long double>::value), "");1104 static_assert((std::is_same<decltype(std::fmin((int)0, (long long)0)), double>::value), "");1105 static_assert((std::is_same<decltype(std::fmin((int)0, (unsigned long long)0)), double>::value), "");1106 static_assert((std::is_same<decltype(std::fmin((double)0, (double)0)), double>::value), "");1107 static_assert((std::is_same<decltype(std::fmin((long double)0, (long double)0)), long double>::value), "");1108 static_assert((std::is_same<decltype(std::fmin((float)0, (double)0)), double>::value), "");1109 static_assert((std::is_same<decltype(std::fmin((float)0, (long double)0)), long double>::value), "");1110 static_assert((std::is_same<decltype(std::fmin((double)0, (long double)0)), long double>::value), "");1111 static_assert((std::is_same<decltype(std::fminf(0,0)), float>::value), "");1112 static_assert((std::is_same<decltype(std::fminl(0,0)), long double>::value), "");1113 static_assert((std::is_same<decltype(std::fmin((int)0, (int)0)), double>::value), "");1114 static_assert((std::is_same<decltype(fmin(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1115 assert(std::fmin(1,0) == 0);1116}1117 1118#if TEST_STD_VER >= 171119struct TestHypot3 {1120 template <class Real>1121 void operator()() const {1122 const auto check = [](Real elem, Real abs_tol) {1123 assert(std::isfinite(std::hypot(elem, Real(0), Real(0))));1124 assert(fptest_close(std::hypot(elem, Real(0), Real(0)), elem, abs_tol));1125 assert(std::isfinite(std::hypot(elem, elem, Real(0))));1126 assert(fptest_close(std::hypot(elem, elem, Real(0)), std::sqrt(Real(2)) * elem, abs_tol));1127 assert(std::isfinite(std::hypot(elem, elem, elem)));1128 assert(fptest_close(std::hypot(elem, elem, elem), std::sqrt(Real(3)) * elem, abs_tol));1129 };1130 1131 { // check for overflow1132 const auto [elem, abs_tol] = []() -> std::array<Real, 2> {1133 if constexpr (std::is_same_v<Real, float>)1134 return {1e20f, 1e16f};1135 else if constexpr (std::is_same_v<Real, double>)1136 return {1e300, 1e287};1137 else { // long double1138# if __DBL_MAX_EXP__ == __LDBL_MAX_EXP__1139 return {1e300l, 1e287l}; // 64-bit1140# else1141 return {1e4000l, 1e3985l}; // 80- or 128-bit1142# endif1143 }1144 }();1145 check(elem, abs_tol);1146 }1147 1148 { // check for underflow1149 const auto [elem, abs_tol] = []() -> std::array<Real, 2> {1150 if constexpr (std::is_same_v<Real, float>)1151 return {1e-20f, 1e-24f};1152 else if constexpr (std::is_same_v<Real, double>)1153 return {1e-287, 1e-300};1154 else { // long double1155# if __DBL_MAX_EXP__ == __LDBL_MAX_EXP__1156 return {1e-287l, 1e-300l}; // 64-bit1157# else1158 return {1e-3985l, 1e-4000l}; // 80- or 128-bit1159# endif1160 }1161 }();1162 check(elem, abs_tol);1163 }1164 }1165};1166#endif1167 1168void test_hypot()1169{1170 static_assert((std::is_same<decltype(std::hypot((float)0, (float)0)), float>::value), "");1171 static_assert((std::is_same<decltype(std::hypot((bool)0, (float)0)), double>::value), "");1172 static_assert((std::is_same<decltype(std::hypot((unsigned short)0, (double)0)), double>::value), "");1173 static_assert((std::is_same<decltype(std::hypot((int)0, (long double)0)), long double>::value), "");1174 static_assert((std::is_same<decltype(std::hypot((float)0, (unsigned int)0)), double>::value), "");1175 static_assert((std::is_same<decltype(std::hypot((double)0, (long)0)), double>::value), "");1176 static_assert((std::is_same<decltype(std::hypot((long double)0, (unsigned long)0)), long double>::value), "");1177 static_assert((std::is_same<decltype(std::hypot((int)0, (long long)0)), double>::value), "");1178 static_assert((std::is_same<decltype(std::hypot((int)0, (unsigned long long)0)), double>::value), "");1179 static_assert((std::is_same<decltype(std::hypot((double)0, (double)0)), double>::value), "");1180 static_assert((std::is_same<decltype(std::hypot((long double)0, (long double)0)), long double>::value), "");1181 static_assert((std::is_same<decltype(std::hypot((float)0, (double)0)), double>::value), "");1182 static_assert((std::is_same<decltype(std::hypot((float)0, (long double)0)), long double>::value), "");1183 static_assert((std::is_same<decltype(std::hypot((double)0, (long double)0)), long double>::value), "");1184 static_assert((std::is_same<decltype(std::hypotf(0,0)), float>::value), "");1185 static_assert((std::is_same<decltype(std::hypotl(0,0)), long double>::value), "");1186 static_assert((std::is_same<decltype(std::hypot((int)0, (int)0)), double>::value), "");1187 static_assert((std::is_same<decltype(hypot(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1188 assert(std::hypot(3,4) == 5);1189 1190#if TEST_STD_VER >= 171191 // clang-format off1192 static_assert((std::is_same_v<decltype(std::hypot((float)0, (float)0, (float)0)), float>));1193 static_assert((std::is_same_v<decltype(std::hypot((float)0, (bool)0, (float)0)), double>));1194 static_assert((std::is_same_v<decltype(std::hypot((float)0, (unsigned short)0, (double)0)), double>));1195 static_assert((std::is_same_v<decltype(std::hypot((float)0, (int)0, (long double)0)), long double>));1196 static_assert((std::is_same_v<decltype(std::hypot((float)0, (double)0, (long)0)), double>));1197 static_assert((std::is_same_v<decltype(std::hypot((float)0, (long double)0, (unsigned long)0)), long double>));1198 static_assert((std::is_same_v<decltype(std::hypot((float)0, (int)0, (long long)0)), double>));1199 static_assert((std::is_same_v<decltype(std::hypot((float)0, (int)0, (unsigned long long)0)), double>));1200 static_assert((std::is_same_v<decltype(std::hypot((float)0, (double)0, (double)0)), double>));1201 static_assert((std::is_same_v<decltype(std::hypot((float)0, (long double)0, (long double)0)), long double>));1202 static_assert((std::is_same_v<decltype(std::hypot((float)0, (float)0, (double)0)), double>));1203 static_assert((std::is_same_v<decltype(std::hypot((float)0, (float)0, (long double)0)), long double>));1204 static_assert((std::is_same_v<decltype(std::hypot((float)0, (double)0, (long double)0)), long double>));1205 static_assert((std::is_same_v<decltype(std::hypot((int)0, (int)0, (int)0)), double>));1206 static_assert((std::is_same_v<decltype(hypot(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>));1207 // clang-format on1208 1209 assert(std::hypot(2,3,6) == 7);1210 assert(std::hypot(1,4,8) == 9);1211 1212 // Check for undue over-/underflows of intermediate results.1213 // See discussion at https://llvm.org/PR92782.1214 types::for_each(types::floating_point_types(), TestHypot3());1215#endif1216}1217 1218void test_ilogb()1219{1220 static_assert((std::is_same<decltype(std::ilogb((float)0)), int>::value), "");1221 static_assert((std::is_same<decltype(std::ilogb((bool)0)), int>::value), "");1222 static_assert((std::is_same<decltype(std::ilogb((unsigned short)0)), int>::value), "");1223 static_assert((std::is_same<decltype(std::ilogb((int)0)), int>::value), "");1224 static_assert((std::is_same<decltype(std::ilogb((unsigned int)0)), int>::value), "");1225 static_assert((std::is_same<decltype(std::ilogb((long)0)), int>::value), "");1226 static_assert((std::is_same<decltype(std::ilogb((unsigned long)0)), int>::value), "");1227 static_assert((std::is_same<decltype(std::ilogb((long long)0)), int>::value), "");1228 static_assert((std::is_same<decltype(std::ilogb((unsigned long long)0)), int>::value), "");1229 static_assert((std::is_same<decltype(std::ilogb((double)0)), int>::value), "");1230 static_assert((std::is_same<decltype(std::ilogb((long double)0)), int>::value), "");1231 static_assert((std::is_same<decltype(std::ilogbf(0)), int>::value), "");1232 static_assert((std::is_same<decltype(std::ilogbl(0)), int>::value), "");1233 static_assert((std::is_same<decltype(ilogb(Ambiguous())), Ambiguous>::value), "");1234 assert(std::ilogb(1) == 0);1235}1236 1237void test_lerp()1238{1239 // See also "lerp.pass.cpp"1240 1241#if TEST_STD_VER > 171242 static_assert((std::is_same<decltype(std::lerp((float)0, (float)0, (float)0)), float>::value), "");1243 static_assert((std::is_same<decltype(std::lerp((float)0, (bool)0, (float)0)), double>::value), "");1244 static_assert((std::is_same<decltype(std::lerp((float)0, (unsigned short)0, (double)0)), double>::value), "");1245 static_assert((std::is_same<decltype(std::lerp((float)0, (int)0, (long double)0)), long double>::value), "");1246 static_assert((std::is_same<decltype(std::lerp((float)0, (double)0, (long)0)), double>::value), "");1247 static_assert((std::is_same<decltype(std::lerp((float)0, (long double)0, (unsigned long)0)), long double>::value), "");1248 static_assert((std::is_same<decltype(std::lerp((float)0, (int)0, (long long)0)), double>::value), "");1249 static_assert((std::is_same<decltype(std::lerp((float)0, (int)0, (unsigned long long)0)), double>::value), "");1250 static_assert((std::is_same<decltype(std::lerp((float)0, (double)0, (double)0)), double>::value), "");1251 static_assert((std::is_same<decltype(std::lerp((float)0, (long double)0, (long double)0)), long double>::value), "");1252 static_assert((std::is_same<decltype(std::lerp((float)0, (float)0, (double)0)), double>::value), "");1253 static_assert((std::is_same<decltype(std::lerp((float)0, (float)0, (long double)0)), long double>::value), "");1254 static_assert((std::is_same<decltype(std::lerp((float)0, (double)0, (long double)0)), long double>::value), "");1255 static_assert((std::is_same<decltype(std::lerp((int)0, (int)0, (int)0)), double>::value), "");1256 static_assert((std::is_same<decltype(lerp(Ambiguous(), Ambiguous(), Ambiguous())), Ambiguous>::value), "");1257 1258 assert(std::lerp(2, 3, 1) == 3);1259 assert(std::lerp(1, 3, 0.5) == 2);1260 assert(std::lerp(0, 4.0, 0) == 0);1261 static_assert(std::lerp(2, 3, 1) == 3);1262 static_assert(std::lerp(1, 3, 0.5) == 2);1263 static_assert(std::lerp(0, 4.0, 0) == 0);1264#endif1265}1266 1267void test_lgamma()1268{1269 static_assert((std::is_same<decltype(std::lgamma((float)0)), float>::value), "");1270 static_assert((std::is_same<decltype(std::lgamma((bool)0)), double>::value), "");1271 static_assert((std::is_same<decltype(std::lgamma((unsigned short)0)), double>::value), "");1272 static_assert((std::is_same<decltype(std::lgamma((int)0)), double>::value), "");1273 static_assert((std::is_same<decltype(std::lgamma((unsigned int)0)), double>::value), "");1274 static_assert((std::is_same<decltype(std::lgamma((long)0)), double>::value), "");1275 static_assert((std::is_same<decltype(std::lgamma((unsigned long)0)), double>::value), "");1276 static_assert((std::is_same<decltype(std::lgamma((long long)0)), double>::value), "");1277 static_assert((std::is_same<decltype(std::lgamma((unsigned long long)0)), double>::value), "");1278 static_assert((std::is_same<decltype(std::lgamma((double)0)), double>::value), "");1279 static_assert((std::is_same<decltype(std::lgamma((long double)0)), long double>::value), "");1280 static_assert((std::is_same<decltype(std::lgammaf(0)), float>::value), "");1281 static_assert((std::is_same<decltype(std::lgammal(0)), long double>::value), "");1282 static_assert((std::is_same<decltype(lgamma(Ambiguous())), Ambiguous>::value), "");1283 assert(std::lgamma(1) == 0);1284}1285 1286void test_llrint()1287{1288 static_assert((std::is_same<decltype(std::llrint((float)0)), long long>::value), "");1289 static_assert((std::is_same<decltype(std::llrint((bool)0)), long long>::value), "");1290 static_assert((std::is_same<decltype(std::llrint((unsigned short)0)), long long>::value), "");1291 static_assert((std::is_same<decltype(std::llrint((int)0)), long long>::value), "");1292 static_assert((std::is_same<decltype(std::llrint((unsigned int)0)), long long>::value), "");1293 static_assert((std::is_same<decltype(std::llrint((long)0)), long long>::value), "");1294 static_assert((std::is_same<decltype(std::llrint((unsigned long)0)), long long>::value), "");1295 static_assert((std::is_same<decltype(std::llrint((long long)0)), long long>::value), "");1296 static_assert((std::is_same<decltype(std::llrint((unsigned long long)0)), long long>::value), "");1297 static_assert((std::is_same<decltype(std::llrint((double)0)), long long>::value), "");1298 static_assert((std::is_same<decltype(std::llrint((long double)0)), long long>::value), "");1299 static_assert((std::is_same<decltype(std::llrintf(0)), long long>::value), "");1300 static_assert((std::is_same<decltype(std::llrintl(0)), long long>::value), "");1301 static_assert((std::is_same<decltype(llrint(Ambiguous())), Ambiguous>::value), "");1302 assert(std::llrint(1) == 1LL);1303}1304 1305void test_llround()1306{1307 static_assert((std::is_same<decltype(std::llround((float)0)), long long>::value), "");1308 static_assert((std::is_same<decltype(std::llround((bool)0)), long long>::value), "");1309 static_assert((std::is_same<decltype(std::llround((unsigned short)0)), long long>::value), "");1310 static_assert((std::is_same<decltype(std::llround((int)0)), long long>::value), "");1311 static_assert((std::is_same<decltype(std::llround((unsigned int)0)), long long>::value), "");1312 static_assert((std::is_same<decltype(std::llround((long)0)), long long>::value), "");1313 static_assert((std::is_same<decltype(std::llround((unsigned long)0)), long long>::value), "");1314 static_assert((std::is_same<decltype(std::llround((long long)0)), long long>::value), "");1315 static_assert((std::is_same<decltype(std::llround((unsigned long long)0)), long long>::value), "");1316 static_assert((std::is_same<decltype(std::llround((double)0)), long long>::value), "");1317 static_assert((std::is_same<decltype(std::llround((long double)0)), long long>::value), "");1318 static_assert((std::is_same<decltype(std::llroundf(0)), long long>::value), "");1319 static_assert((std::is_same<decltype(std::llroundl(0)), long long>::value), "");1320 static_assert((std::is_same<decltype(llround(Ambiguous())), Ambiguous>::value), "");1321 assert(std::llround(1) == 1LL);1322}1323 1324void test_log1p()1325{1326 static_assert((std::is_same<decltype(std::log1p((float)0)), float>::value), "");1327 static_assert((std::is_same<decltype(std::log1p((bool)0)), double>::value), "");1328 static_assert((std::is_same<decltype(std::log1p((unsigned short)0)), double>::value), "");1329 static_assert((std::is_same<decltype(std::log1p((int)0)), double>::value), "");1330 static_assert((std::is_same<decltype(std::log1p((unsigned int)0)), double>::value), "");1331 static_assert((std::is_same<decltype(std::log1p((long)0)), double>::value), "");1332 static_assert((std::is_same<decltype(std::log1p((unsigned long)0)), double>::value), "");1333 static_assert((std::is_same<decltype(std::log1p((long long)0)), double>::value), "");1334 static_assert((std::is_same<decltype(std::log1p((unsigned long long)0)), double>::value), "");1335 static_assert((std::is_same<decltype(std::log1p((double)0)), double>::value), "");1336 static_assert((std::is_same<decltype(std::log1p((long double)0)), long double>::value), "");1337 static_assert((std::is_same<decltype(std::log1pf(0)), float>::value), "");1338 static_assert((std::is_same<decltype(std::log1pl(0)), long double>::value), "");1339 static_assert((std::is_same<decltype(log1p(Ambiguous())), Ambiguous>::value), "");1340 assert(std::log1p(0) == 0);1341}1342 1343void test_log2()1344{1345 static_assert((std::is_same<decltype(std::log2((float)0)), float>::value), "");1346 static_assert((std::is_same<decltype(std::log2((bool)0)), double>::value), "");1347 static_assert((std::is_same<decltype(std::log2((unsigned short)0)), double>::value), "");1348 static_assert((std::is_same<decltype(std::log2((int)0)), double>::value), "");1349 static_assert((std::is_same<decltype(std::log2((unsigned int)0)), double>::value), "");1350 static_assert((std::is_same<decltype(std::log2((long)0)), double>::value), "");1351 static_assert((std::is_same<decltype(std::log2((unsigned long)0)), double>::value), "");1352 static_assert((std::is_same<decltype(std::log2((long long)0)), double>::value), "");1353 static_assert((std::is_same<decltype(std::log2((unsigned long long)0)), double>::value), "");1354 static_assert((std::is_same<decltype(std::log2((double)0)), double>::value), "");1355 static_assert((std::is_same<decltype(std::log2((long double)0)), long double>::value), "");1356 static_assert((std::is_same<decltype(std::log2f(0)), float>::value), "");1357 static_assert((std::is_same<decltype(std::log2l(0)), long double>::value), "");1358 static_assert((std::is_same<decltype(log2(Ambiguous())), Ambiguous>::value), "");1359 assert(std::log2(1) == 0);1360}1361 1362void test_logb()1363{1364 static_assert((std::is_same<decltype(std::logb((float)0)), float>::value), "");1365 static_assert((std::is_same<decltype(std::logb((bool)0)), double>::value), "");1366 static_assert((std::is_same<decltype(std::logb((unsigned short)0)), double>::value), "");1367 static_assert((std::is_same<decltype(std::logb((int)0)), double>::value), "");1368 static_assert((std::is_same<decltype(std::logb((unsigned int)0)), double>::value), "");1369 static_assert((std::is_same<decltype(std::logb((long)0)), double>::value), "");1370 static_assert((std::is_same<decltype(std::logb((unsigned long)0)), double>::value), "");1371 static_assert((std::is_same<decltype(std::logb((long long)0)), double>::value), "");1372 static_assert((std::is_same<decltype(std::logb((unsigned long long)0)), double>::value), "");1373 static_assert((std::is_same<decltype(std::logb((double)0)), double>::value), "");1374 static_assert((std::is_same<decltype(std::logb((long double)0)), long double>::value), "");1375 static_assert((std::is_same<decltype(std::logbf(0)), float>::value), "");1376 static_assert((std::is_same<decltype(std::logbl(0)), long double>::value), "");1377 static_assert((std::is_same<decltype(logb(Ambiguous())), Ambiguous>::value), "");1378 assert(std::logb(1) == 0);1379}1380 1381void test_lrint()1382{1383 static_assert((std::is_same<decltype(std::lrint((float)0)), long>::value), "");1384 static_assert((std::is_same<decltype(std::lrint((bool)0)), long>::value), "");1385 static_assert((std::is_same<decltype(std::lrint((unsigned short)0)), long>::value), "");1386 static_assert((std::is_same<decltype(std::lrint((int)0)), long>::value), "");1387 static_assert((std::is_same<decltype(std::lrint((unsigned int)0)), long>::value), "");1388 static_assert((std::is_same<decltype(std::lrint((long)0)), long>::value), "");1389 static_assert((std::is_same<decltype(std::lrint((unsigned long)0)), long>::value), "");1390 static_assert((std::is_same<decltype(std::lrint((long long)0)), long>::value), "");1391 static_assert((std::is_same<decltype(std::lrint((unsigned long long)0)), long>::value), "");1392 static_assert((std::is_same<decltype(std::lrint((double)0)), long>::value), "");1393 static_assert((std::is_same<decltype(std::lrint((long double)0)), long>::value), "");1394 static_assert((std::is_same<decltype(std::lrintf(0)), long>::value), "");1395 static_assert((std::is_same<decltype(std::lrintl(0)), long>::value), "");1396 static_assert((std::is_same<decltype(lrint(Ambiguous())), Ambiguous>::value), "");1397 assert(std::lrint(1) == 1L);1398}1399 1400void test_lround()1401{1402 static_assert((std::is_same<decltype(std::lround((float)0)), long>::value), "");1403 static_assert((std::is_same<decltype(std::lround((bool)0)), long>::value), "");1404 static_assert((std::is_same<decltype(std::lround((unsigned short)0)), long>::value), "");1405 static_assert((std::is_same<decltype(std::lround((int)0)), long>::value), "");1406 static_assert((std::is_same<decltype(std::lround((unsigned int)0)), long>::value), "");1407 static_assert((std::is_same<decltype(std::lround((long)0)), long>::value), "");1408 static_assert((std::is_same<decltype(std::lround((unsigned long)0)), long>::value), "");1409 static_assert((std::is_same<decltype(std::lround((long long)0)), long>::value), "");1410 static_assert((std::is_same<decltype(std::lround((unsigned long long)0)), long>::value), "");1411 static_assert((std::is_same<decltype(std::lround((double)0)), long>::value), "");1412 static_assert((std::is_same<decltype(std::lround((long double)0)), long>::value), "");1413 static_assert((std::is_same<decltype(std::lroundf(0)), long>::value), "");1414 static_assert((std::is_same<decltype(std::lroundl(0)), long>::value), "");1415 static_assert((std::is_same<decltype(lround(Ambiguous())), Ambiguous>::value), "");1416 assert(std::lround(1) == 1L);1417}1418 1419void test_nan()1420{1421 static_assert((std::is_same<decltype(std::nan("")), double>::value), "");1422 static_assert((std::is_same<decltype(std::nanf("")), float>::value), "");1423 static_assert((std::is_same<decltype(std::nanl("")), long double>::value), "");1424}1425 1426void test_nearbyint()1427{1428 static_assert((std::is_same<decltype(std::nearbyint((float)0)), float>::value), "");1429 static_assert((std::is_same<decltype(std::nearbyint((bool)0)), double>::value), "");1430 static_assert((std::is_same<decltype(std::nearbyint((unsigned short)0)), double>::value), "");1431 static_assert((std::is_same<decltype(std::nearbyint((int)0)), double>::value), "");1432 static_assert((std::is_same<decltype(std::nearbyint((unsigned int)0)), double>::value), "");1433 static_assert((std::is_same<decltype(std::nearbyint((long)0)), double>::value), "");1434 static_assert((std::is_same<decltype(std::nearbyint((unsigned long)0)), double>::value), "");1435 static_assert((std::is_same<decltype(std::nearbyint((long long)0)), double>::value), "");1436 static_assert((std::is_same<decltype(std::nearbyint((unsigned long long)0)), double>::value), "");1437 static_assert((std::is_same<decltype(std::nearbyint((double)0)), double>::value), "");1438 static_assert((std::is_same<decltype(std::nearbyint((long double)0)), long double>::value), "");1439 static_assert((std::is_same<decltype(std::nearbyintf(0)), float>::value), "");1440 static_assert((std::is_same<decltype(std::nearbyintl(0)), long double>::value), "");1441 static_assert((std::is_same<decltype(nearbyint(Ambiguous())), Ambiguous>::value), "");1442 assert(std::nearbyint(1) == 1);1443}1444 1445void test_nextafter()1446{1447 static_assert((std::is_same<decltype(std::nextafter((float)0, (float)0)), float>::value), "");1448 static_assert((std::is_same<decltype(std::nextafter((bool)0, (float)0)), double>::value), "");1449 static_assert((std::is_same<decltype(std::nextafter((unsigned short)0, (double)0)), double>::value), "");1450 static_assert((std::is_same<decltype(std::nextafter((int)0, (long double)0)), long double>::value), "");1451 static_assert((std::is_same<decltype(std::nextafter((float)0, (unsigned int)0)), double>::value), "");1452 static_assert((std::is_same<decltype(std::nextafter((double)0, (long)0)), double>::value), "");1453 static_assert((std::is_same<decltype(std::nextafter((long double)0, (unsigned long)0)), long double>::value), "");1454 static_assert((std::is_same<decltype(std::nextafter((int)0, (long long)0)), double>::value), "");1455 static_assert((std::is_same<decltype(std::nextafter((int)0, (unsigned long long)0)), double>::value), "");1456 static_assert((std::is_same<decltype(std::nextafter((double)0, (double)0)), double>::value), "");1457 static_assert((std::is_same<decltype(std::nextafter((long double)0, (long double)0)), long double>::value), "");1458 static_assert((std::is_same<decltype(std::nextafter((float)0, (double)0)), double>::value), "");1459 static_assert((std::is_same<decltype(std::nextafter((float)0, (long double)0)), long double>::value), "");1460 static_assert((std::is_same<decltype(std::nextafter((double)0, (long double)0)), long double>::value), "");1461 static_assert((std::is_same<decltype(std::nextafterf(0,0)), float>::value), "");1462 static_assert((std::is_same<decltype(std::nextafterl(0,0)), long double>::value), "");1463 static_assert((std::is_same<decltype(std::nextafter((int)0, (int)0)), double>::value), "");1464 static_assert((std::is_same<decltype(nextafter(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1465 assert(std::nextafter(0,1) == hexfloat<double>(0x1, 0, -1074));1466}1467 1468void test_nexttoward()1469{1470 static_assert((std::is_same<decltype(std::nexttoward((float)0, (long double)0)), float>::value), "");1471 static_assert((std::is_same<decltype(std::nexttoward((bool)0, (long double)0)), double>::value), "");1472 static_assert((std::is_same<decltype(std::nexttoward((unsigned short)0, (long double)0)), double>::value), "");1473 static_assert((std::is_same<decltype(std::nexttoward((int)0, (long double)0)), double>::value), "");1474 static_assert((std::is_same<decltype(std::nexttoward((unsigned int)0, (long double)0)), double>::value), "");1475 static_assert((std::is_same<decltype(std::nexttoward((long)0, (long double)0)), double>::value), "");1476 static_assert((std::is_same<decltype(std::nexttoward((unsigned long)0, (long double)0)), double>::value), "");1477 static_assert((std::is_same<decltype(std::nexttoward((long long)0, (long double)0)), double>::value), "");1478 static_assert((std::is_same<decltype(std::nexttoward((unsigned long long)0, (long double)0)), double>::value), "");1479 static_assert((std::is_same<decltype(std::nexttoward((double)0, (long double)0)), double>::value), "");1480 static_assert((std::is_same<decltype(std::nexttoward((long double)0, (long double)0)), long double>::value), "");1481 static_assert((std::is_same<decltype(std::nexttowardf(0, (long double)0)), float>::value), "");1482 static_assert((std::is_same<decltype(std::nexttowardl(0, (long double)0)), long double>::value), "");1483 static_assert((std::is_same<decltype(nexttoward(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1484 assert(std::nexttoward(0, 1) == hexfloat<double>(0x1, 0, -1074));1485}1486 1487void test_remainder()1488{1489 static_assert((std::is_same<decltype(std::remainder((float)0, (float)0)), float>::value), "");1490 static_assert((std::is_same<decltype(std::remainder((bool)0, (float)0)), double>::value), "");1491 static_assert((std::is_same<decltype(std::remainder((unsigned short)0, (double)0)), double>::value), "");1492 static_assert((std::is_same<decltype(std::remainder((int)0, (long double)0)), long double>::value), "");1493 static_assert((std::is_same<decltype(std::remainder((float)0, (unsigned int)0)), double>::value), "");1494 static_assert((std::is_same<decltype(std::remainder((double)0, (long)0)), double>::value), "");1495 static_assert((std::is_same<decltype(std::remainder((long double)0, (unsigned long)0)), long double>::value), "");1496 static_assert((std::is_same<decltype(std::remainder((int)0, (long long)0)), double>::value), "");1497 static_assert((std::is_same<decltype(std::remainder((int)0, (unsigned long long)0)), double>::value), "");1498 static_assert((std::is_same<decltype(std::remainder((double)0, (double)0)), double>::value), "");1499 static_assert((std::is_same<decltype(std::remainder((long double)0, (long double)0)), long double>::value), "");1500 static_assert((std::is_same<decltype(std::remainder((float)0, (double)0)), double>::value), "");1501 static_assert((std::is_same<decltype(std::remainder((float)0, (long double)0)), long double>::value), "");1502 static_assert((std::is_same<decltype(std::remainder((double)0, (long double)0)), long double>::value), "");1503 static_assert((std::is_same<decltype(std::remainderf(0,0)), float>::value), "");1504 static_assert((std::is_same<decltype(std::remainderl(0,0)), long double>::value), "");1505 static_assert((std::is_same<decltype(std::remainder((int)0, (int)0)), double>::value), "");1506 static_assert((std::is_same<decltype(remainder(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1507 assert(std::remainder(0.5,1) == 0.5);1508}1509 1510void test_remquo()1511{1512 int ip;1513 static_assert((std::is_same<decltype(std::remquo((float)0, (float)0, &ip)), float>::value), "");1514 static_assert((std::is_same<decltype(std::remquo((bool)0, (float)0, &ip)), double>::value), "");1515 static_assert((std::is_same<decltype(std::remquo((unsigned short)0, (double)0, &ip)), double>::value), "");1516 static_assert((std::is_same<decltype(std::remquo((int)0, (long double)0, &ip)), long double>::value), "");1517 static_assert((std::is_same<decltype(std::remquo((float)0, (unsigned int)0, &ip)), double>::value), "");1518 static_assert((std::is_same<decltype(std::remquo((double)0, (long)0, &ip)), double>::value), "");1519 static_assert((std::is_same<decltype(std::remquo((long double)0, (unsigned long)0, &ip)), long double>::value), "");1520 static_assert((std::is_same<decltype(std::remquo((int)0, (long long)0, &ip)), double>::value), "");1521 static_assert((std::is_same<decltype(std::remquo((int)0, (unsigned long long)0, &ip)), double>::value), "");1522 static_assert((std::is_same<decltype(std::remquo((double)0, (double)0, &ip)), double>::value), "");1523 static_assert((std::is_same<decltype(std::remquo((long double)0, (long double)0, &ip)), long double>::value), "");1524 static_assert((std::is_same<decltype(std::remquo((float)0, (double)0, &ip)), double>::value), "");1525 static_assert((std::is_same<decltype(std::remquo((float)0, (long double)0, &ip)), long double>::value), "");1526 static_assert((std::is_same<decltype(std::remquo((double)0, (long double)0, &ip)), long double>::value), "");1527 static_assert((std::is_same<decltype(std::remquof(0,0, &ip)), float>::value), "");1528 static_assert((std::is_same<decltype(std::remquol(0,0, &ip)), long double>::value), "");1529 static_assert((std::is_same<decltype(std::remquo((int)0, (int)0, &ip)), double>::value), "");1530 static_assert((std::is_same<decltype(remquo(Ambiguous(), Ambiguous(), &ip)), Ambiguous>::value), "");1531 assert(std::remquo(0.5,1, &ip) == 0.5);1532}1533 1534void test_rint()1535{1536 static_assert((std::is_same<decltype(std::rint((float)0)), float>::value), "");1537 static_assert((std::is_same<decltype(std::rint((bool)0)), double>::value), "");1538 static_assert((std::is_same<decltype(std::rint((unsigned short)0)), double>::value), "");1539 static_assert((std::is_same<decltype(std::rint((int)0)), double>::value), "");1540 static_assert((std::is_same<decltype(std::rint((unsigned int)0)), double>::value), "");1541 static_assert((std::is_same<decltype(std::rint((long)0)), double>::value), "");1542 static_assert((std::is_same<decltype(std::rint((unsigned long)0)), double>::value), "");1543 static_assert((std::is_same<decltype(std::rint((long long)0)), double>::value), "");1544 static_assert((std::is_same<decltype(std::rint((unsigned long long)0)), double>::value), "");1545 static_assert((std::is_same<decltype(std::rint((double)0)), double>::value), "");1546 static_assert((std::is_same<decltype(std::rint((long double)0)), long double>::value), "");1547 static_assert((std::is_same<decltype(std::rintf(0)), float>::value), "");1548 static_assert((std::is_same<decltype(std::rintl(0)), long double>::value), "");1549 static_assert((std::is_same<decltype(rint(Ambiguous())), Ambiguous>::value), "");1550 assert(std::rint(1) == 1);1551}1552 1553void test_round()1554{1555 static_assert((std::is_same<decltype(std::round((float)0)), float>::value), "");1556 static_assert((std::is_same<decltype(std::round((bool)0)), double>::value), "");1557 static_assert((std::is_same<decltype(std::round((unsigned short)0)), double>::value), "");1558 static_assert((std::is_same<decltype(std::round((int)0)), double>::value), "");1559 static_assert((std::is_same<decltype(std::round((unsigned int)0)), double>::value), "");1560 static_assert((std::is_same<decltype(std::round((long)0)), double>::value), "");1561 static_assert((std::is_same<decltype(std::round((unsigned long)0)), double>::value), "");1562 static_assert((std::is_same<decltype(std::round((long long)0)), double>::value), "");1563 static_assert((std::is_same<decltype(std::round((unsigned long long)0)), double>::value), "");1564 static_assert((std::is_same<decltype(std::round((double)0)), double>::value), "");1565 static_assert((std::is_same<decltype(std::round((long double)0)), long double>::value), "");1566 static_assert((std::is_same<decltype(std::roundf(0)), float>::value), "");1567 static_assert((std::is_same<decltype(std::roundl(0)), long double>::value), "");1568 static_assert((std::is_same<decltype(round(Ambiguous())), Ambiguous>::value), "");1569 assert(std::round(1) == 1);1570}1571 1572void test_scalbln()1573{1574 static_assert((std::is_same<decltype(std::scalbln((float)0, (long)0)), float>::value), "");1575 static_assert((std::is_same<decltype(std::scalbln((bool)0, (long)0)), double>::value), "");1576 static_assert((std::is_same<decltype(std::scalbln((unsigned short)0, (long)0)), double>::value), "");1577 static_assert((std::is_same<decltype(std::scalbln((int)0, (long)0)), double>::value), "");1578 static_assert((std::is_same<decltype(std::scalbln((unsigned int)0, (long)0)), double>::value), "");1579 static_assert((std::is_same<decltype(std::scalbln((long)0, (long)0)), double>::value), "");1580 static_assert((std::is_same<decltype(std::scalbln((unsigned long)0, (long)0)), double>::value), "");1581 static_assert((std::is_same<decltype(std::scalbln((long long)0, (long)0)), double>::value), "");1582 static_assert((std::is_same<decltype(std::scalbln((unsigned long long)0, (long)0)), double>::value), "");1583 static_assert((std::is_same<decltype(std::scalbln((double)0, (long)0)), double>::value), "");1584 static_assert((std::is_same<decltype(std::scalbln((long double)0, (long)0)), long double>::value), "");1585 static_assert((std::is_same<decltype(std::scalblnf(0, (long)0)), float>::value), "");1586 static_assert((std::is_same<decltype(std::scalblnl(0, (long)0)), long double>::value), "");1587 static_assert((std::is_same<decltype(scalbln(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1588 assert(std::scalbln(1, 1) == 2);1589}1590 1591void test_scalbn()1592{1593 static_assert((std::is_same<decltype(std::scalbn((float)0, (int)0)), float>::value), "");1594 static_assert((std::is_same<decltype(std::scalbn((bool)0, (int)0)), double>::value), "");1595 static_assert((std::is_same<decltype(std::scalbn((unsigned short)0, (int)0)), double>::value), "");1596 static_assert((std::is_same<decltype(std::scalbn((int)0, (int)0)), double>::value), "");1597 static_assert((std::is_same<decltype(std::scalbn((unsigned int)0, (int)0)), double>::value), "");1598 static_assert((std::is_same<decltype(std::scalbn((long)0, (int)0)), double>::value), "");1599 static_assert((std::is_same<decltype(std::scalbn((unsigned long)0, (int)0)), double>::value), "");1600 static_assert((std::is_same<decltype(std::scalbn((long long)0, (int)0)), double>::value), "");1601 static_assert((std::is_same<decltype(std::scalbn((unsigned long long)0, (int)0)), double>::value), "");1602 static_assert((std::is_same<decltype(std::scalbn((double)0, (int)0)), double>::value), "");1603 static_assert((std::is_same<decltype(std::scalbn((long double)0, (int)0)), long double>::value), "");1604 static_assert((std::is_same<decltype(std::scalbnf(0, (int)0)), float>::value), "");1605 static_assert((std::is_same<decltype(std::scalbnl(0, (int)0)), long double>::value), "");1606 static_assert((std::is_same<decltype(scalbn(Ambiguous(), Ambiguous())), Ambiguous>::value), "");1607 assert(std::scalbn(1, 1) == 2);1608}1609 1610void test_tgamma()1611{1612 static_assert((std::is_same<decltype(std::tgamma((float)0)), float>::value), "");1613 static_assert((std::is_same<decltype(std::tgamma((bool)0)), double>::value), "");1614 static_assert((std::is_same<decltype(std::tgamma((unsigned short)0)), double>::value), "");1615 static_assert((std::is_same<decltype(std::tgamma((int)0)), double>::value), "");1616 static_assert((std::is_same<decltype(std::tgamma((unsigned int)0)), double>::value), "");1617 static_assert((std::is_same<decltype(std::tgamma((long)0)), double>::value), "");1618 static_assert((std::is_same<decltype(std::tgamma((unsigned long)0)), double>::value), "");1619 static_assert((std::is_same<decltype(std::tgamma((long long)0)), double>::value), "");1620 static_assert((std::is_same<decltype(std::tgamma((unsigned long long)0)), double>::value), "");1621 static_assert((std::is_same<decltype(std::tgamma((double)0)), double>::value), "");1622 static_assert((std::is_same<decltype(std::tgamma((long double)0)), long double>::value), "");1623 static_assert((std::is_same<decltype(std::tgammaf(0)), float>::value), "");1624 static_assert((std::is_same<decltype(std::tgammal(0)), long double>::value), "");1625 static_assert((std::is_same<decltype(tgamma(Ambiguous())), Ambiguous>::value), "");1626 assert(std::tgamma(1) == 1);1627}1628 1629void test_trunc()1630{1631 static_assert((std::is_same<decltype(std::trunc((float)0)), float>::value), "");1632 static_assert((std::is_same<decltype(std::trunc((bool)0)), double>::value), "");1633 static_assert((std::is_same<decltype(std::trunc((unsigned short)0)), double>::value), "");1634 static_assert((std::is_same<decltype(std::trunc((int)0)), double>::value), "");1635 static_assert((std::is_same<decltype(std::trunc((unsigned int)0)), double>::value), "");1636 static_assert((std::is_same<decltype(std::trunc((long)0)), double>::value), "");1637 static_assert((std::is_same<decltype(std::trunc((unsigned long)0)), double>::value), "");1638 static_assert((std::is_same<decltype(std::trunc((long long)0)), double>::value), "");1639 static_assert((std::is_same<decltype(std::trunc((unsigned long long)0)), double>::value), "");1640 static_assert((std::is_same<decltype(std::trunc((double)0)), double>::value), "");1641 static_assert((std::is_same<decltype(std::trunc((long double)0)), long double>::value), "");1642 static_assert((std::is_same<decltype(std::truncf(0)), float>::value), "");1643 static_assert((std::is_same<decltype(std::truncl(0)), long double>::value), "");1644 static_assert((std::is_same<decltype(trunc(Ambiguous())), Ambiguous>::value), "");1645 assert(std::trunc(1) == 1);1646}1647 1648int main(int, char**)1649{1650 test_abs();1651 test_acos();1652 test_asin();1653 test_atan();1654 test_atan2();1655 test_ceil();1656 test_cos();1657 test_cosh();1658 test_exp();1659 test_fabs();1660 test_floor();1661 test_fmod();1662 test_frexp();1663 test_ldexp();1664 test_log();1665 test_log10();1666 test_modf();1667 test_pow();1668 test_sin();1669 test_sinh();1670 test_sqrt();1671 test_tan();1672 test_tanh();1673 test_signbit();1674 test_fpclassify();1675 test_isfinite();1676 test_isnormal();1677 test_isgreater();1678 test_isgreaterequal();1679 test_isinf();1680 test_isless();1681 test_islessequal();1682 test_islessgreater();1683 test_isnan();1684 test_isunordered();1685 test_acosh();1686 test_asinh();1687 test_atanh();1688 test_cbrt();1689 test_copysign();1690 test_erf();1691 test_erfc();1692 test_exp2();1693 test_expm1();1694 test_fdim();1695 test_fma();1696 test_fmax();1697 test_fmin();1698 test_hypot();1699 test_ilogb();1700 test_lerp();1701 test_lgamma();1702 test_llrint();1703 test_llround();1704 test_log1p();1705 test_log2();1706 test_logb();1707 test_lrint();1708 test_lround();1709 test_nan();1710 test_nearbyint();1711 test_nextafter();1712 test_nexttoward();1713 test_remainder();1714 test_remquo();1715 test_rint();1716 test_round();1717 test_scalbln();1718 test_scalbn();1719 test_tgamma();1720 test_trunc();1721 1722 return 0;1723}1724