如何使双精度值的 C++ 和 C# 中的结果相同
How can I make the result to be the same in C++ and C# of double values
请注意,我不是在问为什么双精度值会变成另一个精度,而是要问如何使结果相同。
我感谢下面的所有评论和答案,但我没有得到解决问题的方法。
我的问题又来了。
我刚刚在将双精度问题的精度问题从 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.90000000000000045.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# 是否提供了任何明确的保证。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- 尝试将字符串/字符转换为整数会产生意外结果