c++ - C++ 中的浮点加法是否可能发生下溢?

标签 c++ floating-point

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

我想知道在使用 native 数据类型(float、double、long 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/

相关文章:

c++ - 我是否正确使用了这个 vector ?

c++ - 检查写入寄存器的值是否正确

c++ - 在 const int 上定义,但将值放在已安装的 header 中

C++、GTK+ 和字符串类型

c - float (或 double )到十进制定点整数

java - 什么是与 Math.floorMod() 完全相同但使用 float 而不是整数的方法?

java - 如何从 Java 中的无符号字节中获取 float ?

python - 在 python 中序列化 float32 值并在 C++ 中反序列化它们

C++ 编译错误 : "cast from ' WCHAR *' to ' WORD' loses precision"

floating-point - pytorch 的机器精度是多少,什么时候应该使用 double ?