python - float 随机(?!)精度怪癖

标签 python

<分区>

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

python 版本:

Python 2.7.2 (default, Jul 20 2011, 02:32:18) [GCC 4.2.1 (LLVM, Emscripten 1.5, Empythoned)] on linux2

于: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? 

最佳答案

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

对于 float ,我们将它们分为两部分进行存储。指数和小数。如果我们的小数是 .75,指数是 2,我们会得到 .75 * 102 = 7.5。小数存储为 2 的负幂。所以我们有 2-1, 2-2。 2-3。等。这些等于.5 , .25 , .125

有些数字无法存储,因为它们确实需要无限位来表示,例如 0.1,而其他数字(例如 3.1415)需要的位数比 CPU 为 float 提供的位数多(24 位是 32 位 float 的标准,但算法各不相同) .

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

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

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

在 Python 中,decimal 库也很有用。

关于python - float 随机(?!)精度怪癖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17696406/

相关文章:

python - 有没有办法将 np.where() 与列列表一起使用?

python - 如何查看生成到 django 模板变量中的异常?

python - 使用字符串和(填充的)数字格式化字符串

python - 覆盖 : Which test touched this line?

Python Pandas : add list to df of different len

c# - 免费的密码学库

python - 水平绘制具有层次结构的 networkx 图并操纵箭头的长度

python - 我的 Python 中的二分搜索功能不起作用

python - 尝试在 Python 中使用 Pandas 删除逗号和美元符号

python - Django 静态文件未在 Azure 上提供