所以我有一个看起来像这样的函数:
float function(){ float x = SomeValue; return x / SomeOtherValue; }
在某些时候,此函数溢出并返回一个非常大的负值.为了尝试准确地追踪这发生的位置,我添加了一个cout语句,以便函数看起来像这样:
float function(){ float x = SomeValue; cout << x; return x / SomeOtherValue; }
它工作了!当然,我通过使用双重完全解决了这个问题.但我很好奇为什么这个功能在我做的时候能正常工作.这是典型的,还是我错过了其他地方的错误?
(如果有任何帮助,浮点数中存储的值只是一个整数值,而不是一个特别大的值.我只是把它放在一个浮点数中以避免转换.)
欢迎来到漂浮的浮点世界.您得到的答案可能取决于您编译代码的浮点模型.
这是因为IEEE规范与运行代码的硬件之间存在差异.您的CPU可能有80位浮点寄存器,可用于保存32位浮点值.这意味着当值保持在寄存器中时,精度远远高于强制存储器地址(也称为"归位"寄存器).
当你将值传递给cout时,编译器必须将浮点写入内存,这会导致精度丢失和WRT溢出情况的有趣行为.
请参阅有关VC++ 浮点交换机的MSDN文档.您可以尝试使用/ fp:strict进行编译,看看会发生什么.