我在看英特尔处理器手册,卷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/