【问题标题】:float point arithmetic in pythonpython中的浮点运算
【发布时间】:2021-02-02 15:50:20
【问题描述】:
>>> .1+.1+.1+.1 ==.4
True
>>> .1+.1+.1 ==.3
False
>>> 

以上是python解释器的输出。我了解
浮点运算是使用基数 2 完成的,并以二进制形式存储在
因此计算结果的差异类似于上述结果。
现在我发现 .4 = .011(0011) [() 里面的数字无限重复这是一个二进制
这个分数的表示] 因为这不能精确地存储一个近似值
将被存储。
相似度 0.3 = .01(0011)
所以 0.4 和 0.3 都不能完全在内部存储。
但是,python 首先返回 True 而第二个返回 False 的原因是什么
因为两者无法比较
_______________________________________________________________________________
我做了一些研究,发现以下内容:
>>> Decimal(.4)
Decimal('0.40000000000000002220446049250313080847263336181640625')
>>> Decimal(.1+.1+.1+.1)
Decimal('0.40000000000000002220446049250313080847263336181640625')
>>> Decimal(.1+.1+.1)
Decimal('0.3000000000000000444089209850062616169452667236328125')
>>> Decimal(.3)
Decimal('0.299999999999999988897769753748434595763683319091796875')
>>> Decimal(.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

这可能解释了为什么添加会以它们的方式发生
假设 Decimal 给出了存储在下面的数字的确切输出

【问题讨论】:

  • 您似乎已经回答了您自己的问题...或者您还有其他问题吗?
  • 是的;仅仅因为没有一个单独的值是精确的,并不意味着它们不能产生等效的近似值。
  • 这能回答你的问题吗? Is floating point math broken?

标签: python python-3.x floating-point decimal


【解决方案1】:

但是python首先返回True,第二个返回False的原因是什么? 因为两者无法比较

浮点数绝对可以比较是否相等。仅当您期望通过近似计算 保持精确相等时,才会出现问题。但是浮点相等比较的语义是完全定义好的。

当您在程序中写入0.1 时,它会四舍五入到最接近的 IEEE 754 binary64 浮点数,即实数 0.1000000000000000055511151231257827021181583404541015625,或 0x1.999-416 进制表示法中的 0x1.999999999999ap'p-4部分表示 × 2⁻⁴)。每个(正常)二进制 64 浮点数都是 ±2ⁿ × (1 + ?/2⁵³) 形式的实数,其中? 和? 是整数,−1022 ≤ ? ≤ 1023 和 0 ≤ ?

在补充一点,在浮点运算以本身三次,确切的结果0.3000000000000000166533453693773481063544750213623046875四舍五入为0.3000000000000000444089209850062616169452667236328125或0x1.3333333333334p-2(因为有可用的只有53位的精度),但是当编写0.3 ,你会得到 0.299999999999999988897769753748434595763683319091796875 或 0x1.3333333333333p-2 稍微接近 0.3。

然而,四次0.1000000000000000055511151231257827021181583404541015625或0x1.999999999999ap-4是0.4000000000000000222044604925031308084726333618164062500或0x1.999999999999ap-2,这也是最接近浮点数到0.4,因此是当你写0.4在程序中你会得到什么。因此,当您编写 4*0.1 时,结果与您编写 0.4 时的结果完全相同浮点数。

现在,你写的不是4*0.1——而是你写的.1 + .1 + .1 + .1。但事实证明,在二进制浮点算术中有一个定理x + x + x + x——即 fl(fl(fl(? + ?) + ?) + ?)——在不四舍五入的情况下总是准确地得出 4?(除非它溢出),尽管 x + x + x 或 fl(fl(? + ?) + ?) = fl(3?) 可能被四舍五入并且不完全等于 3?。 (注意 fl(? + ?) = fl(2?) 总是等于 2?,再次忽略溢出,因为这只是调整指数的问题。)

碰巧添加第四项造成的任何舍入错误都会抵消添加第三项可能导致的任何舍入错误!

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 2018-06-23
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2014-01-24
    • 2012-03-19
    相关资源
    最近更新 更多