Тип-общие математические функции
Заголовок <tgmath.h> содержит заголовки <math.h> и <complex.h> и определяет несколько тип-общих макросов, которые определяют, какую действительную или, применительно, комплексную функцию вызывать, в зависимости от типов аргументов.
Для каждого макроса параметры, соответствующие реально-типу в функции math.h без суффикса, являются double известными как параметры обобщения (например, оба параметра pow являются параметрами обобщения, но только первый параметр scalbn является параметром обобщения).
Когда используется макрос <tgmath.h>, типы аргументов, переданных параметрам обобщения, определяют, какая функция выбирается макросом, как описано ниже. Если типы аргументов не совместимы с типами параметров выбранной функции, поведение является неопределённым (например, если комплексный аргумент передаётся в макрос действительной-только функции <tgmath.h>: float complex fc; ceil(fc); или double complex dc; double d; fmax(dc, d); являются примерами неопределённого поведения).
Примечание: тип-общие макросы были реализованы способом, определяемым реализацией в C99, но ключевое слово C11 _Generic позволяет реализовать эти макросы портируемым способом.
Комплексные/действительные тип-общие макросы
Для всех функций, которые имеют как действительные, так и комплексные аналоги, существует тип-общий макрос XXX, который вызывает одну из:
- действительную функцию:
- вариант
floatXXXf - вариант
doubleXXX - вариант
long doubleXXXl - комплексную функцию:
- вариант
floatcXXXf - вариант
doublecXXX - вариант
long doublecXXXl
Исключением из вышеприведенного правила является макрос fabs (см. таблицу ниже).
Функция, которую нужно вызвать, определяется следующим образом:
- Если любой из аргументов для параметров обобщения является мнимым, поведение определяется на каждой странице ссылок на функцию индивидуально (в частности,
sin,cos,tag,cosh,sinh,tanh,asin,atan,asinh, иatanhвызывают действительные функции, типы возвращаемых значенийsin,tan,sinh,tanh,asin,atan,asinh, иatanh— мнимые, а типы возвращаемых значенийcosиcosh— действительные). - Если любой из аргументов для параметров обобщения является комплексным, то вызывается комплексная функция, в противном случае вызывается действительная функция.
- Если любой из аргументов для параметров обобщения является
long double, то вызывается вариантlong double. В противном случае, если любой из параметров являетсяdoubleили целым числом, то вызывается вариантdouble. В противном случае, вызывается вариантfloat.
Тип-общие макросы приведены ниже:
| Тип-обобщённый макрос | Вещественные функции варианты | Комплексные функции варианты |
||||
|---|---|---|---|---|---|---|
float | double | long double | float | double | long double |
|
| fabs | fabsf | fabs | fabsl | cabsf | cabs | cabsl |
| exp | expf | exp | expl | cexpf | cexp | cexpl |
| log | logf | log | logl | clogf | clog | clogl |
| pow | powf | pow | powl | cpowf | cpow | cpowl |
| sqrt | sqrtf | sqrt | sqrtl | csqrtf | csqrt | csqrtl |
| sin | sinf | sin | sinl | csinf | csin | csinl |
| cos | cosf | cos | cosl | ccosf | ccos | ccosl |
| tan | tanf | tan | tanl | ctanf | ctan | ctanl |
| asin | asinf | asin | asinl | casinf | casin | casinl |
| acos | acosf | acos | acosl | cacosf | cacos | cacosl |
| atan | atanf | atan | atanl | catanf | catan | catanl |
| sinh | sinhf | sinh | sinhl | csinhf | csinh | csinhl |
| cosh | coshf | cosh | coshl | ccoshf | ccosh | ccoshl |
| tanh | tanhf | tanh | tanhl | ctanhf | ctanh | ctanhl |
| asinh | asinhf | asinh | asinhl | casinhf | casinh | casinhl |
| acosh | acoshf | acosh | acoshl | cacoshf | cacosh | cacoshl |
| atanh | atanhf | atanh | atanhl | catanhf | catanh | catanhl |
Функции только для вещественных чисел
Для всех функций, у которых нет комплексных аналогов, за исключением modf, существует тип-обобщённый макрос XXX, который вызывает любой из вариантов вещественной функции:
-
floatвариантXXXf -
doubleвариантXXX -
long doubleвариантXXXl
Функция для вызова определяется следующим образом:
- Если любой из аргументов для обобщённых параметров является
long double, тогда вызываетсяlong doubleвариант. В противном случае, если любой из аргументов для обобщённых параметров являетсяdouble, тогда вызываетсяdoubleвариант. В противном случае, вызываетсяfloatвариант.
Функции только для комплексных чисел
Для всех функций комплексных чисел, не имеющих реальных аналогов, существует тип-генерическая макрос cXXX, который вызывает один из вариантов функции комплексного числа:
Функция, которую нужно вызвать, определяется следующим образом:
- Если любой из аргументов для параметров генерического типа является вещественным, комплексным или мнимым, то вызывается соответствующая функция комплексных чисел.
| Тип-генерический макрос | Варианты функции комплексного числа | ||
|---|---|---|---|
float | double | long double |
|
| carg | cargf | carg | cargl |
| conj | conjf | conj | conjl |
| creal | crealf | creal | creall |
| cimag | cimagf | cimag | cimagl |
| cproj | cprojf | cproj | cprojl |
Пример
#include <stdio.h>
#include <tgmath.h>
int main(void)
{
int i = 2;
printf("sqrt(2) = %f\n", sqrt(i)); // argument type is int, calls sqrt
float f = 0.5;
printf("sin(0.5f) = %f\n", sin(f)); // argument type is float, calls sinf
float complex dc = 1 + 0.5*I;
float complex z = sqrt(dc); // argument type is float complex, calls csqrtf
printf("sqrt(1 + 0.5i) = %f+%fi\n",
creal(z), // argument type is float complex, calls crealf
cimag(z)); // argument type is float complex, calls cimagf
}Вывод:
sqrt(2) = 1.414214 sin(0.5f) = 0.479426 sqrt(1 + 0.5i) = 1.029086+0.242934i
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.25 Тип-генерическая математика <tgmath.h> (с. 272-273)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.25 Тип-генерическая математика <tgmath.h> (с. 373-375)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.22 Тип-генерическая математика <tgmath.h> (с. 335-337)
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/tgmath