5

我刚开始学习python,偶然发现了一个特殊性

蟒蛇版本:

linux2 上的 Python 2.7.2(默认,2011 年 7 月 20 日,02:32:18)[GCC 4.2.1(LLVM,Emscripten 1.5,Empythoned)]

在:http ://repl.it/languages/Python

与口译员一起工作,分配:

    pi = 3.141 // 3 places decimal precision
    #typing pi  & pressing return puts 3.141
   type(pi)
=> <type 'float'>
    pi = 3.1415
   type(pi)
=> <type 'float'>
    #pi puts 3.1415000000000002

好的浮点精度因不精确而臭名昭著; 但为什么只有 4 点精度才能得到那个“尾巴”?

还:

 pi2 = 3.1415100000000002
 pi == pi2 # pi was assigned 3.1415
 => True
 print(pi2)
 3.14151 # Where's my precision? 
4

1 回答 1

4

整数和浮点数被赋予一定数量的位。对于整数,每个位对应于 2 的幂。第一个数字是 2 0,然后是 2 1、 2 2,依此类推。所以要存储整数5,我们有2 0 + 2 2 = 1 + 4

对于浮点数,我们将它们存储在两部分中。指数和小数。如果我们有 0.75 的小数和 2 的指数,我们做.75 * 10 2 = 7.5。小数存储为 2 的负幂。所以我们有 2 -1 , 2 -2。2 -3 . 等等。这些等同于.5, .25, .125, 等等。

有些数字是不可能存储的,因为它们实际上需要无限位来表示,比如 0.1,而像 3.1415 等其他数字需要比 CPU 为浮点数提供的更多位(24 位是 32 位浮点数的标准,但算法会有所不同)。

比较浮点数的正确方法是定义一个方差,并按照这些思路使用一些东西。

variance = .0001
floatsEqual = lambda f1, f2: f1 - variance <= f2 and f1 + variance >= f2

if (floatsEqual(3.1415, 3.1415 + 1 - 1)):
    pass

在 Python 中,十进制库也很有用。

于 2013-07-17T10:23:35.307 回答