【问题标题】:C: How to perform accurate floating-point operations? [closed]C:如何进行精确的浮点运算? [关闭]
【发布时间】:2016-11-22 17:47:21
【问题描述】:

我很清楚0.1+0.2 != 0.3 因为精度错误。但是我需要它等于 0.3。

我的解决方案是:

  • 声明一个返回正确doubleadd函数。
  • 在此函数中,将两个数字相加,然后四舍五入到第 13 位。

这适用于 0.49999999999999994 和 0.30000000000000004。

我将如何实现这样的舍入函数?还有其他方法吗?

【问题讨论】:

  • 什么是“正确的double”?你知道0.3 并不存在,对吧?
  • 正确的double 在这种情况下应该是0.3 的值,所以add(0.1, 0.2) == 0.3 是真的。
  • 为什么你认为double 能够准确地代表0.3
  • 没有办法用doubles 表示0.3,所以不,这是不可能的。您可以做的是找到另一种表示它的方式。定点、字符串表示等...

标签: c floating-point floating-accuracy


【解决方案1】:

从小数部分 0.1 和 0.2 转换为双精度的那一刻起就存在问题,得到 0.1000000000000000055511151231257827021181583404541015625 和 0.20000000000000001110223023162515609082068两者都略大于小数部分。最接近它们总和的双倍,0.3000000000000000444089209850062616169452667236328125,是从 0.3 开始的下一个双倍。最接近 0.3 的双精度值更小,0.299999999999999988897769753748434595763683319091796875

如果您需要精确的十进制算术,而不仅仅是非常非常接近,您需要使用十进制算术类型,而不是双精度。

【讨论】:

  • 但是不能四舍五入?例如,0.3000000000000000444 将四舍五入为 0.3000000000000000000,然后将其转换为 0.29999999999999998889。这样不行吗?
  • 你不能四舍五入到 0.3000000000000000000,因为它不存在。
  • 哦,好吧,我终于明白其他 cmets 试图告诉我什么了。然后我将把我的号码存储在 BCD 中。
猜你喜欢
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多