浮点数运算

Opeartions with floating numbers

几天前,我们在 class 中讨论了浮点数。所以在某些编程语言中有一个表达式需要检查:

0.1 + 0.2 == 0.3

返回 false。但是尝试

100*0.1 + 100*0.2 == 100*0.3 

返回 true

所以,我所知道的是,0.1 不能准确表示 (0.00011001100110011....),这里出现了一些错误。但为什么第二个表达式是真的?为什么乘以 100 有效?

还有一个很好的问题,为什么这个表达式不是 0?操作有技巧吗?

>>> math.exp(6)/10 - math.exp(6)*0.1
-7.105427357601002e-15

例如,大多数编程语言中使用的双精度浮点数集非常粗略地为数字集 +/- m * 2^k,其中 m 是从 2^52 到 2^53 的整数, k 是从大约 -1024 到 +1024 的整数。像 0.1 这样的数字不在那个集合中。任何整数乘以或除以 2 的幂永远不会等于 0.1。

任何浮点计算都会计算出准确的结果,然后将其四舍五入为最接近的浮点数。

当你比较0.1 + 0.2和0.3时,实际上是取最接近0.1的浮点数和最接近0.2的浮点数相加,四舍五入到最接近的浮点数,然后与最接近 0.3 的浮点数进行比较。

两个结果将非常接近。它们是否相等,或者一个结果较小或另一个结果较小,或多或少是巧合。如果您对 100 * 0.1、100 * 0.2 和 100 * 0.3 执行相同的操作,则会发生相同的事情。你最终会得到两个非常接近的数字,它们是否相等,或者一个或另一个更小,或多或少是巧合。

在你的最后一个问题中,第一个表达式除以 10。第二个表达式乘以最接近 0.1 的浮点数。没有等于 0.1 的浮点数,最近的浮点数略大于或小于 0.1。所以结果将非常接近(它们是),但不能保证它们是相同的。