0

我有一些行为奇怪的代码,似乎是对两个双精度值相加的结果进行四舍五入。这导致我的代码出现问题。

不幸的是,我无法解决这个问题,因为我的单元测试环境工作正常(不是四舍五入)而且我的应用程序不正常(四舍五入)。

在我的测试环境中:

a = -3.7468700408935547
b = 525218.0
c = b + a
c = 525214.25312995911

在我的应用程序中:

a = -3.7468700408935547
b = 525218.0
c = b + a
c = 525214.25

这可能是什么原因造成的?项目配置?(我正在使用视觉工作室,顺便说一句)

编辑(来自评论)
我正在使用 Visual Studio 调试器单步执行相同的代码,所以它是完全相同的一段代码。

我有更多代码,但我将问题缩小到那个特定的总和。

每个值的二进制表示是:

测试环境:

System.BitConverter.ToString(System.BitConverter.GetBytes(a))   "00-00-00-00-97-F9-0D-C0"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(b))   "00-00-00-00-44-07-20-41"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(c))   "00-40-9A-81-3C-07-20-41"   string

内部应用:

System.BitConverter.ToString(System.BitConverter.GetBytes(a))   "00-00-00-00-97-F9-0D-C0"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(b))   "00-00-00-00-44-07-20-41"   string
System.BitConverter.ToString(System.BitConverter.GetBytes(c))   "00-00-00-80-3C-07-20-41"   string

编辑2:

正如Alexei Levenkov指出的那样,这个问题是由更改 FPU 配置的库引起的。

对于任何好奇这对我意味着什么的人:我能够通过对我的输入值做出一些假设并进行一些先发制人的值四舍五入,从而使我的计算保持一致,从而减轻了我的特定代码段的这个问题。

4

2 回答 2

1

如果需要精确度(如财务计算所需),请使用小数。

编辑 见:

于 2012-10-30T16:45:02.980 回答
1

您的应用程序可能对 FPU 的配置做了一些奇怪的事情。即使用一些随机库进行数学重新配置精度......

Direct3d 可能是可疑的,请参见例如Pow implementation for double

于 2012-10-30T17:28:39.983 回答