码迷,mamicode.com
首页 > 其他好文 > 详细

fmal (Numerics) – C 中文开发手册

时间:2020-07-09 12:36:22      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:并且   eee   math   section   参考   支持   enc   cep   repr   

[
  • ??C 语言中文开发手册

    fmal (Numerics) - C 中文开发手册

    在头文件<math.h>中定义 ? ?
    float fmaf( float x, float y, float z ); (1) (自C99)
    double fma( double x, double y, double z ); (2) (自 C99)
    long double fmal( long double x, long double y, long double z ); (3) (自C99)
    #define FP_FAST_FMA /* implementation-defined */ (4) (自C99)
    #define FP_FAST_FMAF /* implementation-defined */ (5) (自C99)
    #define FP_FAST_FMAL /* implementation-defined */ (6) (自C99)
    在头文件<tgmath.h>中定义 ? ?
    #define fma( x, y, z ) (7) (自C99)

    1-3)计算(x * y)+ z,就像无限精度一样,只舍入一次以适应结果类型。4-6)如果定义了宏常量FP_FAST_FMAF,FP_FAST_FMA或FP_FAST_FMAL,则相应函数fmaf,fma或fmal的计算速度(除了更精确之外)的计算结果要高于float,double和x * y + z的表达式 长双重论点,分别。 如果定义,这些宏评估为整数1。7)类型泛型宏:如果任何参数的类型为long double,则调用fmal。 否则,如果任何参数具有整数类型或类型为double,则调用fma。 否则,调用fmaf。

    参数

    x, y, z - floating point values

    返回值

    如果成功,则返回(x * y)+ z的值,如同计算为无限精度一样,并舍入一次以适合结果类型(或者,也可以计算为单个三元浮点运算)。如果发生由溢出引起的范围错误,则返回±HUGE_VAL,±HUGE_VALF或±HUGE_VALL。如果发生由于下溢导致的范围错误,则返回正确的值(舍入后)。

    错误处理

    按照math_errhandling中的指定报告错误。如果实现支持IEEE浮点运算(IEC 60559),如果x是零并且y是无限的或者如果x是无限的并且y是零并且z不是NaN,则返回NaN并且引发FE_INVALID如果x是零并且y是无限的或者如果x是无限的并且y是零并且z是NaN,则返回NaN并且可以提升FE_INVALID如果x * y是一个精确的无穷大而z是一个具有相反符号的无穷大,则返回NaN并且引发FE_INVALID如果x或y是NaN,则返回NaN如果z是NaN,并且x * y不是0 * Inf或Inf * 0,则返回NaN(不含FE_INVALID)

    注意

    这种操作通常以硬件实现为融合乘加 CPU指令。如果硬件支持,则应该定义适当的FP_FAST_FMA *宏,但是即使未定义宏,许多实现也会使用CPU指令。POSIX指定值x * y无效且z是NaN的情况为:域错误。由于其无限的中间精度,fma是其他正确舍入的数学运算的常见构建模块,例如sqrt或甚至除CPU之外的分区(例如Itanium)。与所有浮点表达式一样,除非#pragma STDC FP_CONTRACT处于关闭状态,否则表达式(x * y)+ z可能会编译为已融合的多重加法。

    #include <stdio.h>
    #include <math.h>
    #include <float.h>
    #include <fenv.h>
    #pragma STDC FENV_ACCESS ON
    int main(void)
    {
        // demo the difference between fma and built-in operators
        double in = 0.1;
        printf("0.1 double is %.23f (%a)\n", in, in);
        printf("0.1*10 is 1.0000000000000000555112 (0x8.0000000000002p-3),"
               " or 1.0 if rounded to double\n");
        double expr_result = 0.1 * 10 - 1;
        printf("0.1 * 10 - 1 = %g : 1 subtracted after "
               "intermediate rounding to 1.0\n", expr_result);
        double fma_result = fma(0.1, 10, -1);
        printf("fma(0.1, 10, -1) = %g (%a)\n", fma_result, fma_result);
     
        // fma use in double-double arithmetic
        printf("\nin double-double arithmetic, 0.1 * 10 is representable as ");
        double high = 0.1 * 10;
        double low = fma(0.1, 10, -high);
        printf("%g + %g\n\n", high, low);
     
        //error handling
        feclearexcept(FE_ALL_EXCEPT);
        printf("fma(+Inf, 10, -Inf) = %f\n", fma(INFINITY, 10, -INFINITY));
        if(fetestexcept(FE_INVALID)) puts("    FE_INVALID raised");
    }

    可能的输出:

    0.1 double is 0.10000000000000000555112 (0x1.999999999999ap-4)
    0.1*10 is 1.0000000000000000555112 (0x8.0000000000002p-3), or 1.0 if rounded to double
    0.1 * 10 - 1 = 0 : 1 subtracted after intermediate rounding to 1.0
    fma(0.1, 10, -1) = 5.55112e-17 (0x1p-54)
     
    in double-double arithmetic, 0.1 * 10 is representable as 1 + 5.55112e-17
     
    fma(+Inf, 10, -Inf) = -nan
        FE_INVALID raised

    参考

    C11标准(ISO / IEC 9899:2011): 7.12.13.1 fma函数(p:258) 7.25类型通用数学<tgmath.h>(p:373-375) F.10.10.1 fma函数(p:530) C99标准(ISO / IEC 9899:1999): 7.12.13.1 fma函数(p:239) 7.22类型通用数学<tgmath.h>(p:335-337) F.9.10.1 fma函数(p:466)

    扩展内容

    remainderremainderfremainderl (C99)(C99)(C99) 计算浮点除法运算的有符号余数(函数)
    remquoremquofremquol(C99)(C99)(C99) 计算带符号的余数以及除法操作(函数)的最后三位

    | fma的C ++文档 |

  • ??C 语言中文开发手册
    ]
    转载请保留页面地址:https://www.breakyizhan.com/c-3/27335.html

    fmal (Numerics) – C 中文开发手册

    标签:并且   eee   math   section   参考   支持   enc   cep   repr   

    原文地址:https://www.cnblogs.com/breakyizhan/p/13272698.html

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!