【问题标题】:Compare `float` and `float64` in python比较python中的`float`和`float64`
【发布时间】:2013-08-07 15:05:32
【问题描述】:

我必须比较两个数字。其中一个来自regulat python 代码,另一个来自numpy。调试器显示它们具有相同的值“29.0”,但第一个类型是float,第二个类型是float64,所以a == ba - b == 0False。我该如何处理?有没有办法 强制一个普通的python变量默认为float64或numpy使用float

更新:最后,所有这些值都来自写入 29.0 的同一个文件,所以我认为数值没有差异。

【问题讨论】:

  • 由于精度错误,通常将任何两个浮点数与a == ba - b == 0 进行比较是一个坏主意。尝试做类似abs(a - b) < 1e-8 之类的事情。
  • 浮点表示和算术不精确(尾数和截断 pb)。设置最大差异的 epsilon(通常为 10e-10)。
  • 虽然通常这些 cmets 似乎是正确的,但我无法想象值 29.0 如果它来自一个可能是 ASCII 格式的文件会出现精度错误。 29.0 可以准确表示。
  • @glglgl 不一定。在二进制中,数字表示为 c × 2ⁿ。如果c=29,n=0,那么,是的,可以准确表示;但在某些浮点表示中,c≤0.5,在这种情况下可能无法准确表示。在我的系统上会出现 float(29.0)==float64(29.0),但这不能保证。
  • @glglgl 此外,OP说调试器说该值为29.0;他没有说价值从何而来。它很容易成为一个计算值,据我们所知,它可能是 29.00000000000001。

标签: python numpy


【解决方案1】:

如果您使用的是 numpy,那么执行 Antonis 建议的最佳方法是使用函数 np.allclose(a, b)。您还可以指定容差(上面的1e-10)。

【讨论】:

    【解决方案2】:

    在任何编程语言中,您都不应该将浮点数与相等性进行比较,因为您永远无法知道它们是否完全相等。相反,您应该测试它们的差异是否小于容差:

    if abs(a - b) < 1e-10
    

    所以这个问题与floatfloat64 之间的区别无关(Python 会自动转换它们),而是与比较浮点数是否相等的基本问题有关。

    另见What's wrong with using == to compare floats in Java?

    【讨论】:

    • 谢谢。看来我加班太多了=)所以我忘记了这个基本的事情
    • 实际上你可以在使用符号数学计算的语言中比较数字和相等
    • 由于某种原因,np.isclose(a, b) 使用的内存比np.abs(a - b) &lt; 1e-10 多得多。
    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多