如何使双精度值的 C++ 和 C# 中的结果相同

How can I make the result to be the same in C++ and C# of double values

本文关键字:结果 C++ 何使 双精度      更新时间:2023-10-16

请注意,我不是在问为什么双精度值会变成另一个精度,而是要问如何使结果相同。

我感谢下面的所有评论和答案,但我没有得到解决问题的方法。

我的问题又来了。

我刚刚在将双精度问题的精度问题从 C++ 重写为 C# 时遇到了一个问题,

我有一种方法可以计算几个双精度值的金融产品的结果,但是当我比较结果时,由于双精度值的精度,我从C++和 C# 程序中得到了不同但相似的结果。

我在C++调试程序时发现,在将值设置为 a 和 b 后double a = 4.9;double b = 5.1;

a和 b 的值更改为,a 为 4.9000000000000004,b 为 5.09999999999999996。 但是在 C# 中,a 仍然是 4.9,b 仍然是 5.1,最后,我得到了-0.062579630921710816(C++ 结果(和-0.062579644244387111(C# 结果(的结果。

我是 C# 和C++的新手,所以是否有任何解决方案可以使计算结果相同,请(我无法更改C++代码(? 或者是否可以使计算结果相同?

这是一个显示问题- 实际值符合您的预期,并且与您的C++代码匹配。尝试此代码以查看存储的近似值1

double a = 4.9; double b = 5.1;
Console.WriteLine(a.ToString("G20"));
Console.WriteLine(b.ToString("G20"));

结果是:

4.9000000000000004

5.099999999999996

请参阅此处以了解有关我为什么使用 G20 以及其他数字格式字符串的更多信息。


1我说近似值,因为计算机只能存储由1/pow(2, n)组成的分数。例如,0.75 是 1/2 + 1/4,因此可以准确地表示。就像我们不能准确地表示 1/3 的基数为 10 一样(我们可能会写 0.3、0.33、0.333、0.3333 等(,你不能用 2 的底数(二进制(表示一些分数,因为它们不能由 2 的幂组成。有关此内容的更多信息,请参阅此问题。

简短的回答,可能是因为编译器优化。

遵循IEEE Float规范将产生完全相同的结果。但是编译器经常做出牺牲正确性以换取速度的决定。将代数重排应用于代码,将多个操作融合在一起,各种优化都会改变结果。

大多数 C 编译器都提供编译器标志,允许您调整允许哪些优化。我不知道 C# 是否提供了任何明确的保证。