/fp:fast与/fp:precise有什么区别,我可能会遇到哪些错误?

3

如果我设置/fp:fast而不是/fp:precise,我可能会遇到哪些错误?我在MSV10下工作。

我对最大位数为8的双精度数执行/、*、+、-运算,例如1.4379294(货币汇率)。


1
你可能想要查看 http://msdn.microsoft.com/en-us/library/aa289157(v=vs.71).aspx - Sebastian Paaske Tørholm
4
不要在货币操作中使用标准浮点数。你几乎肯定想要使用十进制浮点数或定点算术。 - Kerrek SB
1个回答

8
您总是在双精度计算中遇到相同的错误:将结果转换为十进制后您最多只能得到15个有效数字,其余数字都是随机噪声数字。 /fp:fast和/fp:precise之间的区别在于这些噪声数字发生了什么变化。
/fp:precise选项解决了x86 FPU中的问题,它使用80位的精度存储中间结果。如果中间值保留在寄存器中,则可能导致微妙的不同噪声数字值。使用/fp:precise,代码生成器被强制将这些值刷新回内存,将其截断为64位。这很慢,但会产生更一致的噪声。如果您犯了比较浮点数值是否相等的罪行而没有epsilon,则这很重要。
对于大多数会计师来说,这太复杂了,使用以10个手指计算的数学库是常见的解决方案。这通过消除从基数10转换为基数2时生成的数字来解决噪声数字问题。代码将会变慢,远比/fp:precise慢,因为所有计算都是在软件中进行而没有硬件加速。但通常在会计应用程序中不是问题。

很好的答案。您确认如果我使用epsilon来比较两个double,我将不会遇到比我使用/fp:precise更多的问题?因此,由于fp:fast比fp:precise更快,我将看不到任何理由留在fp:precise上。 - Guillaume Paris
是的,我的意思是小数点。因此,根据计算,被视为噪声的第一个数字将不同?这就是你最后的评论的意思吗? - Guillaume Paris
从左边开始数,忽略小数点。噪声从第16个数字开始。如果你的计算正在失去重要数字,例如减去两个几乎相同的数字,那么会更早出现噪声。 - Hans Passant
好的,抱歉我要坚持,但我想确保我理解得很清楚……精度和速度之间的区别只影响第16位数字及其后面的数字吗? - Guillaume Paris
是的,这就是我的答案所说的。 - Hans Passant
在 64 位处理器中,FPU 寄存器仍然是 80 位精度而不是 128 位,这只是一个疑问。 - Guillaume Paris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接