【发布时间】:2010-08-26 23:41:29
【问题描述】:
我们正在将 C++ 数学库转换为 C#。该库混合使用浮点数和双精度数(有时在它们之间进行转换),我们正在尝试做同样的事情,以便在 C# 中获得与在 C++ 中完全相同的结果,但事实证明即使不是不可能也非常困难.
我认为问题是以下一项或多项,但我不是专家:
将浮点数转换为双精度浮点数和双精度浮点数会导致不可预测的结果,并且在 C++ 和 C# 中的处理方式不同
C++ 和 C# 处理浮点精度的方式不同,它们不能互相模仿
.NET 中有一个设置可以让它像 C++ 一样运行,但我找不到它(两者都是 32 位)
有人可以向我解释可能存在的问题,或者将我链接到 Microsoft 的一些权威文档,我可以用来帮助解释情况和差异的原因吗?
编辑
我们正在使用 VC6 和 .NET4.0
由于保密协议的原因,我无法给出计算示例,但我可以显示一些数字来表示差异......它们本身可能非常无用:
8.085004000000000 (C#) vs.
8.084980000000000 (C++)
8.848165000000000 (C#) vs.
8.848170000000000 (C++)
0.015263214111328 (C#) vs.
0.015263900756836 (C++)
应该注意,这些数字包括复合问题。这些是计算的结果。
【问题讨论】:
-
你能提供一个具体的例子来说明你有不同的结果吗?
-
我认为这更多地与硬件有关而不是语言(尽管我可能是错的)。浮点寄存器大于内存位置(在英特尔上)。因此,如果在寄存器中评估整个表达式,您会得到一个结果,而如果将临时值存储在内存中,您将失去一些精度并获得稍微不同的结果。此外,C++ 编译器可能使用通用浮点运算,而 .NET JIT 编译器可能能够利用一组对体系结构更具体和准确的指令。
-
@Martin 谢谢。那么,是预计 100% 准确,还是预计两者之间存在差异?
-
浮点运算没有任何事情是 100% 准确的。
标签: c# c++ floating-point double