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

float function(){
    float x = SomeValue;
    return x / SomeOtherValue;
}

在某一点,这个功能的溢出和回返的一个很大的负值。试试追究竟在哪里,这是发生了,我增加了一个诉讼的发言使得功能看起来是这样的:

float function(){
    float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

和它的工作!当然,我解决了这个问题完全通过使用双重。但我很好奇为什么功能正常工作时我couted。这是典型的、或可能有一个错误在其他地方,我的失踪?

(如果它是任何帮助,值存在浮体仅仅是一个整数值,而不是一个特别大的一个。我只是把它放在一个漂浮,以避免铸造。)

有帮助吗?

解决方案

欢迎来到美妙的世界浮点。答案你可能将取决于浮点模型的编码。

发生这种情况的原因之间的差IEEE规格和硬件代码被上运行。你的CPU可能有80位浮点登记册,获得用来举行的32位的浮动价值。这意味着有更精密而值保持在一个登记册过时,它是被迫的存储地址(也称为'归属'的register)。

当你传递的价值状编译器必须写的浮点存储器,并且这种结果失去了精密和有趣的行为考溢流的情况。

见MSDN文件VC++ 浮点开关.你可以尝试编制与/fp:严格,看看会发生什么情况。

其他提示

印刷一个值的诉讼不应该改变的价值放慢参数以任何方式在所有。

然而,我们看到了类似的行为,增加调试声明导致变化的价值。在这些情况下,可能是这个人以及我的猜测是,其他发言引起编译器的优化表现方式不同,所以产生不同的代码功能。

增加的状况的声明意味着vaue的x是直接使用。没有它的优化可以消除的变量,因此改变了计算,并因此改变的答案。

此外,它始终是一个好主意,宣布不可改变的变量使用 const:

float function(){
    const float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

除其他事项外,这将防止无意中穿你的变量的功能,可以修改它们通过非const 参考文献。

诉讼原因引用的变量,这往往会导致编译器,来迫使它蔓延至堆。

因为这是一个浮动,这可能导致其价值被截断从双重或长期的双表示它通常会有的。

叫任何功能(非内联),需要一个指针或参照x应该最终引起相同的行为,但如果编译器后会变得更加聪明和学习的内联它,你将可以同样拧:)

我不认为该诉讼具有任何影响的变量,这个问题将必须在其他地方。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top