fma, fmaf, fmal – расчет выражения a*b+c.
Синтаксис:
#include < math.h >
double fma (double a, double b, double c);
float fmaf (float a, float b, float c);
long double fmal (long double a, long double b, long double c);
Аргументы:
a – первый множитель.
b – второй множитель.
c – слагаемое.
Возвращаемое значение:
Результат расчета выражения a*b+c, если расчет завершился успешно.
nan, если:
- один из множителей NAN,
- результат произведения a*b бесконечноть или минус бесконечность, а аргумент, с - бесконечность с противоположным знаком,
- один из множителей (a или b) бесконечность, а другой ноль.
inf, если:
- один из аргументов бесконечность,
- результат произведения a*b бесконечноть, а аргумент с- конечное число или бесконечность того же знака.
Описание:
При расчет a*b+c обычным способом в начале рассчитывается значение произведения a*b и округляется результат. Затем к округленному результату произведения прибавляется аргумент c и результат вновь округляется.
При расчете выражения a*b+c с помощью функций fma, fmaf, fmal округление производится один раз, в конце расчета выражения, т.е. сложение производится с более точным внутренним представлением произведения. Тем самым увеличивается точность расчета выражения.
Функции fma, fmaf, fmal отличаются точностью аргументов и возвращаемого значения
Так аргументы и возвращаемое значение функции fma являются числами с плавающей точкой двойной точности (тип double, точность не менее десяти значащих десятичных цифр, разрядность - 64).
Аргументы и возвращаемое значение функции fmaf являются числами с плавающей точкой (тип float, точность не менее шести значащих десятичных цифр, разрядность - 32).
Аргументы и возвращаемое значение функции fmal являются числами с плавающей точкой повышенной точности (тип long double, точность не менее десяти значащих десятичных цифр, разрядность - 80).
Пример:
В примере рассчитывается выражение 123.562*45.8023+1294.4527 с помощью функций fma, fmaf, fmal и результат выводится на консоль. Обратите внимание на точность полученных результатов в зависимости от типа используемой функции.
#include < stdio.h > //Для printf
#include < math.h > //Для fma, fmaf, fmal
int main (void)
{
//Расчет и вывод результата работы функции fdim
printf (“Аргументы: a = 123.562, b = 45.8023, c = 1294.4527\n”);
printf (“Результаты:\n”);
printf (“fmaf : %.10f\n”,fmaf (123.562, 45.8023, 1294.4527) );
printf (“fma : %.10f\n”,fma (123.562, 45.8023, 1294.4527) );
printf (“fmal : %.10Lf\n”,fmal (123.562, 45.8023, 1294.4527) );
return 0;
}
| |
Результат:
Аргументы: a = 123.562, b = 45.8023, c = 1294.4527
Результаты:
fmaf: 6953.8763274058
fma: 6953.8764926000
fmal: 6953.8764926000
|
Смотри так же:
Аналогичных функций нет.
|