python - 如何避免浮点错误?

标签 python python-3.x floating-point floating-point-precision

我试图编写一个近似平方根的函数(我知道有数学模块......我想自己做),但我被浮点运算搞砸了。如何避免这种情况?

def sqrt(num):
    root = 0.0
    while root * root < num:
        root += 0.01
    return root

使用它有以下结果:

>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998

我意识到我可以只使用 round(),但我希望能够做到这一点非常准确。我希望能够计算出 6 或 7 位数字。如果我四舍五入,那将是不可能的。我想了解如何在 Python 中正确处理浮点计算。

最佳答案

这实际上与 Python 无关 - 在任何使用硬件的二进制浮点运算的语言中,您都会看到相同的行为。第一 read the docs .

读完之后,您会更好地理解您在代码中添加了百分之一。这正是您要添加的内容:

>>> from decimal import Decimal
>>> Decimal(.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')

该字符串显示二进制浮点的精确十进制值(C 中的“ double ”)逼近精确十进制值 0.01。你真正添加的东西比 1/100 大一点。

控制 float 值误差是一个叫做“数值分析”的领域,是一个非常庞大和复杂的话题。只要您对 float 只是十进制值的近似值感到震惊,请使用 decimal 模块。这将为您消除一个“浅层”问题的世界。例如,对您的函数进行以下小修改:

from decimal import Decimal as D

def sqrt(num):
    root = D(0)
    while root * root < num:
        root += D("0.01")
    return root

然后:

>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')

这并不是真的更准确,但在简单的示例中可能不会那么令人惊讶,因为现在它正好增加了百分之一。

另一种方法是坚持 float 并添加一些 可以精确表示为二进制 float 的内容:I/2**J 形式的值。例如,不要添加 0.01,而是添加 0.125 (1/8) 或 0.0625 (1/16)。

然后查找计算平方根的“牛顿法”;-)

关于python - 如何避免浮点错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473770/

相关文章:

gzip - 临时解压缩文件的最佳(最 "pythonic")方法

python - 我的背景图片没有完全展开或显示为完整尺寸。 html部分中的背景图片有问题

python - 导入MsgPackSerializer时导入错误

python - Pytube 库 - 尝试访问视频数据时收到 "pytube.exceptions.RegexMatchError: regex pattern"错误

c# - 计算 double 最后一位 (ULP) 的单位

python - pyramid_who (repoze.who) 是对 Pyramid 进行身份验证的首选方式吗?

python - 打开 .ipynb 文件时如何修复 "Distutils was imported before Setuptools"?

python - 将向量放入矩阵+变换中

c++ - 如何处理 float 溢出?

math - 为什么浮点运算在添加小数时不能给出准确的结果?