可以以某种方式改变变量吗?

Jas*_*ker 9 c++ floating-point cout cpu-registers floating-point-precision

所以我有一个看起来像这样的函数:

float function(){
    float x = SomeValue;
    return x / SomeOtherValue;
}
Run Code Online (Sandbox Code Playgroud)

在某些时候,此函数溢出并返回一个非常大的负值.为了尝试准确地追踪这发生的位置,我添加了一个cout语句,以便函数看起来像这样:

float function(){
    float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}
Run Code Online (Sandbox Code Playgroud)

它工作了!当然,我通过使用双重完全解决了这个问题.但我很好奇为什么这个功能在我做的时候能正常工作.这是典型的,还是我错过了其他地方的错误?

(如果有任何帮助,浮点数中存储的值只是一个整数值,而不是一个特别大的值.我只是把它放在一个浮点数中以避免转换.)

Rob*_*ker 18

欢迎来到漂浮的浮点世界.您得到的答案可能取决于您编译代码的浮点模型.

这是因为IEEE规范与运行代码的硬件之间存在差异.您的CPU可能有80位浮点寄存器,可用于保存32位浮点值.这意味着当值保持在寄存器中时,精度远远高于强制存储器地址(也称为"归位"寄存器).

当你将值传递给cout时,编译器必须将浮点写入内存,这会导致精度丢失和WRT溢出情况的有趣行为.

请参阅有关VC++ 浮点交换机的MSDN文档.您可以尝试使用/ fp:strict进行编译,看看会发生什么.