Заголовок
<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
, который вызывает одну из следующих функций:
-
-
float
вариант
XXXf
-
double
вариант
XXX
-
long
double
вариант
XXXl
-
-
float
вариант
cXXXf
-
double
вариант
cXXX
-
long
double
вариант
cXXXl
Исключением из вышеуказанного правила является макрос
fabs
(см. таблицу ниже).
Функция для вызова определяется следующим образом:
-
Если любой из аргументов для обобщённых параметров является мнимым, поведение специфицируется на каждой странице справочника по функциям индивидуально (в частности,
sin
,
cos
,
tan
,
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
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме заголовка таблицы "fabs", который является названием математической функции в C++ и не подлежит переводу согласно требованиям. Все остальные элементы представляют собой HTML-теги, атрибуты и имена функций C++ внутри тегов `
`, которые также не должны переводиться.
|
экспонента
|
expf
|
exp
|
expl
|
cexpf
|
cexp
|
cexpl
|
|
логарифм
|
logf
|
log
|
logl
|
clogf
|
clog
|
clogl
|
|
pow
|
powf
|
pow
|
powl
|
cpowf
|
cpow
|
cpowl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме заголовка "pow", который является названием математической функции в C++ и не подлежит переводу согласно требованиям. Все остальные элементы представляют собой HTML-теги, атрибуты и имена функций C++ внутри тегов `
`, которые должны сохраняться в оригинальном виде.
|
sqrt
|
sqrtf
|
sqrt
|
sqrtl
|
csqrtf
|
csqrt
|
csqrtl
|
**Примечание:** В данном HTML-фрагменте не содержится переводимого текста, кроме заголовка "sqrt" в элементе `
`, который является математическим термином (квадратный корень) и согласно инструкциям не подлежит переводу. Все остальные элементы содержат либо HTML-теги, либо C++ идентификаторы функций внутри тегов `
`, которые также не должны переводиться.
|
|
синус
|
sinf
|
sin
|
sinl
|
csinf
|
csin
|
csinl
|
|
косинус
|
cosf
|
cos
|
cosl
|
ccosf
|
ccos
|
ccosl
|
|
тангенс
|
tanf
|
tan
|
tanl
|
ctanf
|
ctan
|
ctanl
|
|
арксинус
|
asinf
|
asin
|
asinl
|
casinf
|
casin
|
casinl
|
|
acos
|
acosf
|
acos
|
acosl
|
cacosf
|
cacos
|
cacosl
|
**Примечание:** В данном фрагменте HTML все текстовые элементы являются названиями математических функций C++ (`acos`, `acosf`, `acosl`, `cacosf`, `cacos`, `cacosl`), которые согласно требованиям не подлежат переводу. HTML-теги и атрибуты также сохранены в оригинальном виде.
|
арктангенс
|
atanf
|
atan
|
atanl
|
catanf
|
catan
|
catanl
|
|
sinh
|
sinhf
|
sinh
|
sinhl
|
csinhf
|
csinh
|
csinhl
|
**Объяснение перевода:**
- HTML-теги и атрибуты сохранены без изменений
- Текст внутри тегов `
` (C++ функции) не переведен
- Заголовок "sinh" не переведен, так как это математическая функция в C++
- Все ссылки и структура таблицы сохранены в оригинальном формате
|
cosh
|
coshf
|
cosh
|
coshl
|
ccoshf
|
ccosh
|
ccoshl
|
**Примечание:** В данном фрагменте HTML все текстовые элементы являются названиями математических функций C++ (`cosh`, `coshf`, `coshl`, `ccosh`, `ccoshf`, `ccoshl`), которые согласно требованиям не подлежат переводу. HTML-теги и атрибуты также сохранены в оригинальном виде.
|
tanh
|
tanhf
|
tanh
|
tanhl
|
ctanhf
|
ctanh
|
ctanhl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме заголовка "tanh", который является математической функцией (гиперболический тангенс) и относится к C++ специфическим терминам, поэтому не переводится согласно требованиям. Все остальные элементы - это HTML-теги, атрибуты и названия функций C++, которые должны оставаться без изменений.
|
asinh
|
asinhf
|
asinh
|
asinhl
|
casinhf
|
casinh
|
casinhl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, так как:
- `asinh` и другие названия функций являются C++ специфическими терминами, которые не подлежат переводу
- Весь остальной текст находится внутри HTML тегов и атрибутов
- Все названия функций заключены в теги `
`, которые сохраняются без изменений
Структура таблицы и все ссылки полностью сохранены в оригинальном формате.
|
acosh
|
acoshf
|
acosh
|
acoshl
|
cacoshf
|
cacosh
|
cacoshl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, так как:
- `acosh`, `acoshf`, `acoshl`, `cacoshf`, `cacosh`, `cacoshl` - это названия математических функций C++, которые не подлежат переводу
- Весь остальной текст заключен в HTML-теги или является атрибутами
- Согласно инструкциям, HTML-теги, атрибуты и текст внутри `
` тегов не переводятся
|
atanh
|
atanhf
|
atanh
|
atanhl
|
catanhf
|
catanh
|
catanhl
|
**Примечание:** В данном фрагменте HTML отсутствует переводимый текст, кроме заголовка "atanh", который является названием математической функции и не подлежит переводу согласно требованиям (C++ специфичные термины не переводятся). Все остальные элементы представляют собой HTML-теги, атрибуты и названия функций внутри тегов `
`, которые должны сохраняться в оригинальном виде.
Функции только для вещественных чисел
Для всех функций, не имеющих комплексных аналогов, за исключением
modf
, существует обобщённый макрос
XXX
, который вызывает любую из варианций вещественной функции:
-
float
вариант
XXXf
-
double
вариант
XXX
-
long
double
вариант
XXXl
Функция для вызова определяется следующим образом:
-
Если любой из аргументов для обобщенных параметров является
long
double
, то вызывается вариант с
long
double
. В противном случае, если любой из аргументов для обобщенных параметров является
double
, то вызывается вариант с
double
. В противном случае вызывается вариант с
float
.
Универсальный тип
макрос
|
Варианты вещественных
функций
|
|
|
float
|
double
|
long
double
|
|
atan2
|
atan2f
|
atan2
|
atan2l
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме названия функции `atan2`, которое является стандартным математическим термином в C++ и не подлежит переводу согласно требованиям. Все остальные элементы представляют собой HTML-теги, атрибуты и имена функций C++, которые должны сохраняться в оригинальном виде.
|
cbrt
|
cbrtf
|
cbrt
|
cbrtl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода, кроме термина "cbrt", который является C++ специфическим термином (функция вычисления кубического корня) и не подлежит переводу согласно вашим требованиям. Все остальные элементы - это HTML-теги, атрибуты и содержимое тегов `
` (которые содержат имена функций C++), которые должны оставаться без изменений.
|
ceil
|
ceilf
|
ceil
|
ceill
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме термина "ceil", который является стандартной математической функцией округления вверх в C++ и не подлежит переводу согласно требованиям. Все остальные элементы представляют собой HTML-теги, атрибуты и имена функций C++, которые должны оставаться без изменений.
|
copysign
|
copysignf
|
copysign
|
copysignl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык, кроме заголовка таблицы "copysign", который является названием математической функции C++ и не подлежит переводу согласно требованиям. Все остальные элементы - это HTML-теги, атрибуты и имена функций C++ внутри тегов `
`, которые также не должны переводиться.
|
функция ошибок
|
erff
|
erf
|
erfl
|
|
erfc
|
erfcf
|
erfc
|
erfcl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык, так как:
- Все содержимое внутри тегов `
`, `
` и атрибута `title` представляет собой имена математических функций C++ (`erfc`, `erfcf`, `erfcl`)
- Согласно инструкциям, C++ специфические термины и текст внутри тегов `
`/`
` не переводятся
- HTML теги и атрибуты сохранены в оригинальном виде
|
|
exp2
|
exp2f
|
exp2
|
exp2l
|
|
expm1
|
expm1f
|
expm1
|
expm1l
|
**Объяснение:**
- HTML-теги и атрибуты сохранены без изменений
- Текст внутри тегов `
` (C++ функции) не переведен
- Заголовок "expm1" не переведен, так как это C++ специфический термин
- Форматирование и структура таблицы полностью сохранены
|
fdim
|
fdimf
|
fdim
|
fdiml
|
**Примечание:** В данном случае переводить нечего, так как:
- `fdim` - это название математической функции C++ (не подлежит переводу)
- Все остальные элементы (`fdimf`, `fdiml`) - это варианты той же функции для разных типов данных
- Весь текст находится внутри HTML-тегов и представляет собой технические термины C++
- Согласно инструкциям, HTML-теги, атрибуты и C++ специфические термины не переводятся
|
floor
|
floorf
|
floor
|
floorl
|
**Перевод:**
|
округление вниз
|
floorf
|
floor
|
floorl
|
**Примечания:**
- HTML-теги и атрибуты сохранены без изменений
- Текст внутри тегов `
` (C++ функции) не переведен
- Термин "floor" переведен как "округление вниз" - стандартный математический термин в русскоязычной документации
- Сохранено оригинальное форматирование и структура таблицы
|
fma
|
fmaf
|
fma
|
fmal
|
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык, кроме заголовка таблицы "fma", который является названием математической функции C++ и не подлежит переводу согласно требованиям. Все остальные элементы представляют собой HTML-теги, атрибуты и имена функций C++ внутри тегов `
`, которые должны сохраняться в оригинальном виде.
|
fmax
|
fmaxf
|
fmax
|
fmaxl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме заголовка "fmax", который является названием математической функции в C++ и не подлежит переводу согласно требованиям. Все HTML-теги, атрибуты и текст внутри тегов `
` (которые эквивалентны `
`) сохранены в оригинальном виде.
|
fmin
|
fminf
|
fmin
|
fminl
|
**Объяснение перевода:**
- HTML-теги и атрибуты сохранены без изменений
- Текст внутри тегов `
` (C++ функции `fminf`, `fmin`, `fminl`) не переведен
- Термин "fmin" в заголовке не переведен, так как это C++ специфичный термин (функция для нахождения минимального значения)
- Сохранена оригинальная структура и форматирование таблицы
|
fmod
|
fmodf
|
fmod
|
fmodl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык, кроме названия функции `fmod`, которое является стандартным термином C++ и не подлежит переводу согласно вашим требованиям. Все остальные элементы - это HTML-теги, атрибуты и имена функций C++, которые должны оставаться без изменений.
|
frexp
|
frexpf
|
frexp
|
frexpl
|
|
hypot
|
hypotf
|
hypot
|
hypotl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода, кроме термина "hypot", который является C++ специфическим термином (функция вычисления гипотенузы) и не подлежит переводу согласно инструкциям. Все остальные элементы - это HTML-теги, атрибуты и имена функций C++ (`hypotf`, `hypot`, `hypotl`), которые должны сохраняться в оригинале.
|
ilogb
|
ilogbf
|
ilogb
|
ilogbl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме названия функции `ilogb`, которая является C++ специфическим термином и не подлежит переводу согласно требованиям. Весь остальной текст представляет собой HTML-теги, атрибуты и содержимое тегов `
`, которые содержат имена математических функций и также не переводятся.
|
ldexp
|
ldexpf
|
ldexp
|
ldexpl
|
**Объяснение перевода:**
- HTML-теги и атрибуты сохранены без изменений
- Текст внутри тегов `
` (ldexpf, ldexp, ldexpl) не переведен, так как это имена функций C++
- Заголовок "ldexp" также оставлен без перевода как термин C++
- Структура таблицы и форматирование полностью сохранены
|
lgamma
|
lgammaf
|
lgamma
|
lgammal
|
**Объяснение перевода:**
- HTML теги и атрибуты (`
`, `
|
`, `
|
`, `
`, `
`) остались без изменений
- Текст внутри тегов `
` (C++ функции `lgammaf`, `lgamma`, `lgammal`) не переводился
- Заголовок `lgamma` не переводился, так как это C++ специфический термин
- Форматирование и структура HTML полностью сохранены
|
|
llrint
|
llrintf
|
llrint
|
llrintl
|
**Объяснение перевода:**
- HTML-теги и атрибуты сохранены без изменений
- Текст внутри тегов `
` (C++ функции) не переведен
- Заголовок `llrint` не переведен, так как это C++ специфический термин
- Форматирование и структура таблицы полностью сохранены
|
llround
|
llroundf
|
llround
|
llroundl
|
**Примечание:** В данном фрагменте нет текста для перевода, требующего локализации на русский язык. Все элементы являются:
- HTML-тегами и атрибутами (сохранены без изменений)
- Именами функций C++ (`llround`, `llroundf`, `llroundl`) - не подлежат переводу
- Техническими ссылками и путями
Если бы в содержимом были поясняющие тексты или описания на английском, они были бы переведены на русский с сохранением всех указанных требований.
|
log10
|
log10f
|
log10
|
log10l
|
**Примечание:** В данном случае весь текст, требующий перевода, состоит из математической функции `log10`, которая является стандартным C++ термином и не подлежит переводу согласно вашим требованиям. HTML-разметка и содержимое тегов `
` сохранены без изменений.
|
log1p
|
log1pf
|
log1p
|
log1pl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме названия функции `log1p`, которое является стандартным математическим термином в C++ и не подлежит переводу согласно требованиям. Все остальные элементы представляют собой HTML-теги, атрибуты и имена функций, которые должны оставаться без изменений.
|
log2
|
log2f
|
log2
|
log2l
|
**Примечание:** В данном случае весь текст, требующий перевода, состоит только из термина "log2" в заголовке таблицы. Поскольку это C++ специфический термин (функция логарифма по основанию 2), он не переводится согласно вашим требованиям. Остальной текст внутри тегов `
` также является названиями функций C++ и не подлежит переводу.
|
logb
|
logbf
|
logb
|
logbl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме названия функции `logb`, которая является C++ специфическим термином и не подлежит переводу согласно требованиям. Все HTML теги, атрибуты и содержимое тегов `
` (которые содержат имена функций) сохранены в оригинальном виде.
|
lrint
|
lrintf
|
lrint
|
lrintl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода, кроме названий функций C++ (`lrint`, `lrintf`, `lrintl`), которые согласно инструкциям не подлежат переводу. Весь остальной контент состоит из HTML-тегов и атрибутов, которые должны сохраняться в оригинальном виде.
|
lround
|
lroundf
|
lround
|
lroundl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме названия функции `lround`, которая является термином языка C++ и не подлежит переводу согласно вашим требованиям. Все остальные элементы - это HTML-теги, атрибуты и названия функций C++ внутри тегов `
`, которые должны оставаться без изменений.
|
nearbyint
|
nearbyintf
|
nearbyint
|
nearbyintl
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме заголовка таблицы "nearbyint", который является названием математической функции C++ и не подлежит переводу согласно требованиям. Все остальные элементы - это HTML-теги, атрибуты и имена функций C++ внутри тегов `
`, которые должны сохраняться в оригинальном виде.
|
nextafter
|
nextafterf
|
nextafter
|
nextafterl
|
**Примечание:** В данном фрагменте HTML все текстовые элементы уже являются техническими терминами C++ (`nextafter`, `nextafterf`, `nextafterl`), которые согласно инструкциям не подлежат переводу. HTML-теги и атрибуты также сохранены в оригинальном виде.
|
nexttoward
|
nexttowardf
|
nexttoward
|
nexttowardl
|
**Примечание:** В данном фрагменте HTML все текстовые элементы уже являются C++ специфичными терминами (именами функций), которые согласно инструкции не подлежат переводу. HTML теги, атрибуты и содержимое тегов `
` сохранены в оригинальном виде.
|
остаток
|
remainderf
|
remainder
|
remainderl
|
|
remquo
|
remquof
|
remquo
|
remquol
|
|
rint
|
rintf
|
rint
|
rintl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода, требующего локализации на русский язык. Все элементы содержат только:
- HTML-теги и атрибуты (которые не подлежат переводу)
- Имена математических функций C++ (`rint`, `rintf`, `rintl`), которые являются стандартными терминами языка и не переводятся
- Технические ссылки и заголовки, которые сохраняются в оригинальном виде
Структура и форматирование полностью сохранены в соответствии с требованиями.
|
округление
|
roundf
|
round
|
roundl
|
|
scalbln
|
scalblnf
|
scalbln
|
scalblnl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык, кроме названия функции `scalbln`, которое является C++ специфическим термином и не подлежит переводу согласно вашим требованиям. Все остальные элементы - это HTML-теги, атрибуты и названия функций внутри тегов `
`, которые должны сохраняться в оригинальном виде.
|
scalbn
|
scalbnf
|
scalbn
|
scalbnl
|
**Примечание:** В данном фрагменте HTML нет текста для перевода на русский язык, кроме названия функции `scalbn`, которое является C++ специфическим термином и не подлежит переводу согласно вашим требованиям. Весь остальной контент состоит из HTML-тегов, атрибутов и содержимого тегов `
` (которые содержат имена функций C++), которые должны оставаться без изменений.
|
tgamma
|
tgammaf
|
tgamma
|
tgammal
|
**Примечание:** В данном фрагменте HTML не содержится переводимого текста, кроме названия функции `tgamma`, которое является C++ специфическим термином и не подлежит переводу согласно требованиям. Весь остальной контент состоит из HTML-тегов, атрибутов и названий функций внутри тегов `
`, которые должны сохраняться в оригинальном виде.
|
trunc
|
truncf
|
trunc
|
truncl
|
Функции только для комплексных чисел
Для всех функций работы с комплексными числами, у которых нет вещественных аналогов, существует обобщённый макрос
cXXX
, который вызывает любую из вариантов комплексной функции:
Функция для вызова определяется следующим образом:
-
Если любой из аргументов для обобщенных параметров является вещественным, комплексным или мнимым, то вызывается соответствующая комплексная функция.
Пример
#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
Ссылки
-
Стандарт C23 (ISO/IEC 9899:2024):
-
-
7.25 Обобщенная математика типов <tgmath.h> (стр.: TBD)
-
Стандарт 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)