【问题标题】:Numpy float64 vs Python floatNumpy float64 vs Python float
【发布时间】:2020-08-03 02:09:17
【问题描述】:

我正在与 Pandas read_csv 函数中的一些浮点问题作斗争。在我的调查中,我发现了这一点:

In [15]: a = 5.9975

In [16]: a
Out[16]: 5.9975

In [17]: np.float64(a)
Out[17]: 5.9974999999999996

为什么 Python 的内置 float 和 Python 的 np.float64 类型会给出不同的结果?我以为他们都是 C++ 双打?

【问题讨论】:

  • 另请注意,Pandas read_csv 函数采用了自己的超快速字符串到浮点数的转换,该转换正确舍入。因此,在导出一个值并重新读取它之后,恢复的值最终可能与原始值相差 1 或 2 ulps。

标签: python numpy floating-point


【解决方案1】:
>>> numpy.float64(5.9975).hex()
'0x1.7fd70a3d70a3dp+2'
>>> (5.9975).hex()
'0x1.7fd70a3d70a3dp+2'

它们是相同的数字。不同的是他们的表现; Python 原生类型使用“合理”的表示,而 NumPy 类型使用准确的表示。

【讨论】:

  • 表示,您是指打印到屏幕上的方式?
  • 通过__repr__() 方法或其C级等效方法,是的。
  • 真正的准确表示实际上是 5.99749999999999960920149533194489777088165283203125,这是您在评估浮点文字 5.9975 时获得的 64 位浮点的确切十进制值。跨度>
  • @MarkAmery 浮点 64 可以达到的最大精度接近 10-16(最后一位的单位 (ULP),请参阅 en.wikipedia.org/wiki/Floating-point_arithmetic),因此精确十进制值的想法具有显着更多浮点数超过 16 位具有误导性。
  • @JonathanNappee:每个数字 binary64 表示实际上都有一个精确的十进制等价物。当我们认为给定的 binary64 值表示一个不太精确的十进制值时,就会出现问题。
猜你喜欢
  • 2018-09-23
  • 1970-01-01
  • 2019-09-22
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多