如何控制双精度计算以避免 C++ 中的舍入误差linux x86_64?

发布于 2024-12-22 15:00:25 字数 365 浏览 2 评论 0原文

在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

屌丝范 2024-12-29 15:00:25

计算精度很好。这是您要控制的显示精度。如果使用 ,则可以使用 set precision() 来完成此操作;如果使用 <,则可以使用 "%.4f" 之类的格式化程序来完成此操作;stdio.h>

由于您将结果显示为十进制,因此您已经在调用函数了!

PS 0.1 无法用 floatdouble 或任何二进制尾数格式。它分解为(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 a float, double, or any binary-mantissa format. It factors into (1/2) * (1/5), and decimal 1/5 is an infinitely-repeating digit sequence in binary.

P.P.S. Go look at GMP. It might be your best hope.

等风也等你 2024-12-29 15:00:25

如果您只想打印它,可以使用 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.

毁虫ゝ 2024-12-29 15:00:25

如果您只对小数点后四位的相等感兴趣,请将所有内容乘以 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.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文