从 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 浮动操作?