如何控制双精度计算以避免 C++ 中的舍入误差linux x86_64?
在linux x86_64 上的C++ 代码中,我需要双精度计算(+ 或-)。
26.100000000000001 - 26 + 0.10000000000000001
我得到:
0.20000000000000143
我想得到 0.2。
这里,显示格式不导入,计算结果将用于一些if-else分支条件。所以,我只希望 if-else 条件比较小数点后的 4 位数字。
似乎有舍入错误?
如何将计算精度限制为小数点后4位?
我不想调用任何函数以避免开销。
由于转换开销,我不想使用 stringstream。
还有更好的想法吗?
谢谢
In a C++ code on linux x86_64, I need to double precision computing (+ or -).
26.100000000000001 - 26 + 0.10000000000000001
I got:
0.20000000000000143
I want to get 0.2.
here, the display format is not import, the computing results will be used for some if-else branch conditions. So, I only want the if-else conditions compare the 4 digits after the decimal digit.
It seems a rounding error ?
How to restrict the computing precision to 4 digits after decimal point ?
I do not want to call any functions in order to avoid overhead.
I do not want to use stringstream due to transformation overhead.
Any better ideas ?
thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
计算精度很好。这是您要控制的显示精度。如果使用
,则可以使用set precision()
来完成此操作;如果使用<,则可以使用
。"%.4f"
之类的格式化程序来完成此操作;stdio.h>由于您将结果显示为十进制,因此您已经在调用函数了!
PS
0.1
无法用float
、double
或任何二进制尾数格式。它分解为(1/2) * (1/5)
,十进制1/5
是二进制中无限重复的数字序列。PPS 去看看 GMP。这可能是你最好的希望。
The computing precision is fine. It's the display precision you're trying to control. You can do that with
setprecision()
if using<iostream>
or a formatter like"%.4f"
if using<stdio.h>
.You are already calling functions since you are displaying the result as decimal!
P.S.
0.1
cannot be exactly represented by afloat
,double
, or any binary-mantissa format. It factors into(1/2) * (1/5)
, and decimal1/5
is an infinitely-repeating digit sequence in binary.P.P.S. Go look at GMP. It might be your best hope.
如果您只想打印它,可以使用 printf("%10.4lf")。当然,您可以将精度更改为您想要的任何值。
If you just want to print it it, you can use printf("%10.4lf"). You can alter the precision to anything you want, of course.
如果您只对小数点后四位的相等感兴趣,请将所有内容乘以 10,000 并使用整数算术。 (乘以 10,000 后可能需要四舍五入。)
If you are only interested in equality up to four decimal places, multiply everything by 10,000 and use integer arithmetic. (You might need to round after multiplying by 10,000.)