我在看英特尔处理器手册,卷2A,第3.266-3.268页,它指出FADD操作可能会产生#U(下溢)异常。
原因是结果将很小,无法在DST中正确表示。

我想知道使用本机数据类型(浮点, double ,长 double )在C++上是否可能发生加法下溢,或者数据类型的语言包装是否使加法操作在下溢方面很安全。

最佳答案

如果添加彼此非常接近的正数和负数,产生denormal,那么将设​​置下溢标志(如果未屏蔽下溢异常)。链接到英特尔文章denormals and underflow

示例代码(使用Microsoft编译器):

    double a,b,c;
    a =  2.2250738585072019e-308;
    b = -2.2250738585072014e-308;
    c = a + b;   /* c is denormal */
    printf("%28.16le %016llx\n", a, a);
    printf("%28.16le %016llx\n", b, b);
    printf("%28.16le %016llx\n", c, c);
    if ( std::fpclassify( c ) == FP_SUBNORMAL ) printf("c is DENORMAL");

要启用(取消屏蔽)下溢异常(Microsoft编译器):
    short fcw; /* floating point control word - 16 bit */
    /* enable underflow exception */
    __asm{
        fnstcw  fcw
        and     fcw,0ffefh
        fldcw   fcw
    }

关于c++ - 是否有可能使C++中的浮点加法下溢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30912183/

10-11 15:29