从 float32 -> float64 回到 float32,我会失去精度吗?

Posted

技术标签:

【中文标题】从 float32 -> float64 回到 float32,我会失去精度吗?【英文标题】:Can I lose precision going from float32 -> float64 back to float32? 【发布时间】:2012-09-20 16:54:27 【问题描述】:

从 numpy float32 到 python float (float64) 再到 numpy float32 是否有可能丢失任何保真度或精度?

我似乎找不到数据丢失的案例,但我周围的每个人都声称世界将因数据丢失而终结。在继续之前,我只需要找到证明数据丢失的文档/示例即可。

感谢任何为我指明正确方向的帮助。

这是我看到的一个典型用例:

def serialize(val):
    # val is a np.float32
    return val.astype(float)


def deserialize(msg):
    return np.float32(msg)

message = '1.23456789'
outgoing = serialize(message)
incoming = deserialize(message)

【问题讨论】:

如中,转换为双精度,然后立即转换回单精度,中间不做任何操作?我相信你应该得到相同的数字,但你为什么要这样做? 序列化,我们的序列化器将 numpy float32 转换为 python 浮点数,反序列化器将其转换回 numpy float32。 【参考方案1】:

如果 x 是 float32 则 float32(float64(x)) == x

一个例外是如果x = nan 然后nan != nan,虽然nan is nan,因此如果你想捕获所有你可以使用的:

float32(float64(x)) == x or x is nan

.

你应该小心:

float32(1./3)          # 0.33333334
float64(float32(1./3)) # 0.3333333432674408
float64(0.33333334)    # 0.33333333999999998

【讨论】:

谢谢,这就是我的试验的样子。幸运的是,我们正在序列化来自仪器而不是十进制表示的字符串。示例输入为float_val = np.float32('1.2345678901234567890') "float64(float64(x)) is x" 看起来像是一个错字——第一个 float64 应该是 float32 吗? 由于 is 在 Python 中具有独特的技术含义,您可能希望将其更改为 == @user4815162342:除了这使得该声明对 NaN 不正确。 是的,但是底层字节是相同的,这是我关心的,比较 NaN 是我们在编码器层之外做的事情。 np.float32(np.float64(np.float32(np.nan))).tostring() == np.float32(np.nan).tostring() 计算结果为 True

以上是关于从 float32 -> float64 回到 float32,我会失去精度吗?的主要内容,如果未能解决你的问题,请参考以下文章

Go:为啥从 float64 转换为 float32 并返回会导致值发生变化? [复制]

将 numpy 数组类型和值从 Float64 转换为 Float32

如何在 float32 而不是 float64 上强制 python 浮动操作?

如何将数据类型更改为 float64 以便 sklearn 可以处理数据大于 np.float32 的数据帧

为啥 GOlang的float型后面要加32或64?

在JavaScript中如何将ArrayBuffer转换为Float64Array?