John D. Cook в статье [1] сравнивает списки функций в заголовочном файле math.h языка C четырех версий: ISO (ANSI) pre-1999 ("старый" ISO, стандарт до 1999 года), ISO post-1999 (ISO C99, начиная с 1999 года), POSIX и Microsoft Visual Studio (MSVC). Самый маленький список функций в стандарте ISO до 1999 года. Все другие списки полностью содержат поддержку оригинального стандарта ISO.
Последние стандарты POSIX и ISO в сущности идентичны. Различие только в том, что стандарт POSIX требует функции Бесселя первого рода j0, j1 и jn, и функции Бесселя второго рода y0, y1 и yn.
Microsoft поддерживает старый стандарт ISO и вышеупомянутые функции Бесселя. Также Microsoft поддерживает некоторые функции, добавленные в стандарт ISO в 1999. Microsoft дала имена этим новым функциям, как и в стандарте ISO, но с префиксом подчеркивания. Есть небольшое исключение из этого правила - функция Microsoft, соответствующая ISO-функции fpclassify, получила имя _fpclass вместо _fpclassify.
Поддержка реализации функций в различных библиотеках показана в таблице ниже.
Функция |
POSIX |
Старый ISO |
ISO C99 |
MSVC |
Примечания |
acos |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
acosh |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(1) |
asin |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
asinh |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(1) |
atan |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
atan2 |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
atanh |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(1) |
cbrt |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
ceil |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
copysign |
ЕСТЬ |
нет |
ЕСТЬ |
ЕСТЬ |
_copysign |
cos |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
cosh |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
erf |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(2) |
erfc |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
exp |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
exp2 |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
expm1 |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(2) |
fabs |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
fdim |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
floor |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
fma |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
fmax |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
fmin |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
fmod |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
fpclassify |
ЕСТЬ |
нет |
ЕСТЬ |
ЕСТЬ |
_fpclass |
frexp |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
hypot |
ЕСТЬ |
нет |
ЕСТЬ |
ЕСТЬ |
_hypot |
ilogb |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
isfinite |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(3) |
isgreater |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
isgreaterequal |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
isinf |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
isless |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
islessequal |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
islessgreater |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
isnan |
ЕСТЬ |
нет |
ЕСТЬ |
ЕСТЬ |
_isnan |
isnormal |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
isunordered |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
j0 |
ЕСТЬ |
нет |
нет |
ЕСТЬ |
_j0 |
j1 |
ЕСТЬ |
нет |
нет |
ЕСТЬ |
_j1 |
jn |
ЕСТЬ |
нет |
нет |
ЕСТЬ |
_jn |
ldexp |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
lgamma |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(2) |
llrint |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
llround |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
log |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
log10 |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
log1p |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(2) |
log2 |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
logb |
ЕСТЬ |
нет |
ЕСТЬ |
ЕСТЬ |
_logb |
lrint |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
lround |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
modf |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
nan |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
nearbyint |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
nextafter |
ЕСТЬ |
нет |
ЕСТЬ |
ЕСТЬ |
_nextafter |
nexttoward |
нет |
нет |
ЕСТЬ |
нет |
|
pow |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
remainder |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
remquo |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
rint |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
round |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
scalbln |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
scalbn |
нет |
нет |
ЕСТЬ |
нет |
|
signbit |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
sin |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
sinh |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
sqrt |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
tan |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
tanh |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
ЕСТЬ |
|
tgamma |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
(2) |
trunc |
ЕСТЬ |
нет |
ЕСТЬ |
нет |
|
y0 |
ЕСТЬ |
нет |
нет |
ЕСТЬ |
_y0 |
y1 |
ЕСТЬ |
нет |
нет |
ЕСТЬ |
_y1 |
yn |
ЕСТЬ |
нет |
нет |
ЕСТЬ |
_yn |
Примечания:
(1) Обратные гиперболические функции могут быть приведены к более знакомым функциям.
asinh(x) = log(x + sqrt(x2 + 1)) acosh(x) = log(x + sqrt(x2 – 1)) atanh(x) = (log(1+x) – log(1-x))/2
(2) Имеется автономный код [2] для следующих функций: erf, expm1, log1p, lgamma, tgamma.
(3) Вы можете проверить, равно ли число NaN самому себе. Выражение (x == x) вернет true только если x не NaN (см. [3]).
[Ссылки]
1. Math.h in POSIX, ISO, and Visual Studio site:johndcook.com. 2. Stand-alone code for numerical computing site:johndcook.com. 3. IEEE floating-point exceptions in C++ site:johndcook.com. |