对于给定的精度,float32 将给出与 float64 相同结果的最大值是多少?
For a given precision, what is the maximum value for which a float32 will give the same result as a float64?
使用 numpy,我试图了解可以从 float64 向下转换为 float32 且精度损失小于或等于 0.001 的最大值是多少。
由于网上找不到简单的解释,所以赶紧想出这段代码来测试一下:
result = {}
for j in range(1,1000):
for i in range (1, 1_000_000):
num = i + j/1000
x=np.array([num],dtype=np.float32)
y=np.array([num],dtype=np.float64)
if abs(x[0]-y[0]) > 0.001:
result[j] = i
break
根据结果,似乎任何小于 32768 的正值都可以安全地从 float64 向下转换为 float32,精度损失可以接受(给定 <=0.001 的标准)
这是正确的吗?
有人可以解释一下背后的数学原理吗?
非常感谢
假设 IEEE 754 表示,float32
has a 24-bit significand precision, while float64
具有 53 位有效数字精度(“非正规”数字除外)。
为了表示绝对误差最大为0.001的数字,二进制小数点右边至少需要9位,这意味着数字四舍五入到最接近的1/512的倍数,因此最大表示误差为 1/1024 = 0.0009765625 < 0.001.
一共24位有效位,小数点右边9位,小数点左边还有15位,可以表示小于215[=的所有整数26=] = 32768,正如你实验确定的那样。
但是,有一些数字高于这个阈值,误差仍然小于 0.001。正如 Eric Postpischil 在他的评论中指出的那样,所有 float64
值都在 32768.0 和 32768.001 之间(最大正好是 32768+137438953/237),其中 float32
转换四舍五入到恰好 32768.0,满足您的精度要求。当然,任何恰好可以在 float32
中表示的数字都不会出现表示错误。
使用 numpy,我试图了解可以从 float64 向下转换为 float32 且精度损失小于或等于 0.001 的最大值是多少。
由于网上找不到简单的解释,所以赶紧想出这段代码来测试一下:
result = {}
for j in range(1,1000):
for i in range (1, 1_000_000):
num = i + j/1000
x=np.array([num],dtype=np.float32)
y=np.array([num],dtype=np.float64)
if abs(x[0]-y[0]) > 0.001:
result[j] = i
break
根据结果,似乎任何小于 32768 的正值都可以安全地从 float64 向下转换为 float32,精度损失可以接受(给定 <=0.001 的标准)
这是正确的吗? 有人可以解释一下背后的数学原理吗?
非常感谢
假设 IEEE 754 表示,float32
has a 24-bit significand precision, while float64
具有 53 位有效数字精度(“非正规”数字除外)。
为了表示绝对误差最大为0.001的数字,二进制小数点右边至少需要9位,这意味着数字四舍五入到最接近的1/512的倍数,因此最大表示误差为 1/1024 = 0.0009765625 < 0.001.
一共24位有效位,小数点右边9位,小数点左边还有15位,可以表示小于215[=的所有整数26=] = 32768,正如你实验确定的那样。
但是,有一些数字高于这个阈值,误差仍然小于 0.001。正如 Eric Postpischil 在他的评论中指出的那样,所有 float64
值都在 32768.0 和 32768.001 之间(最大正好是 32768+137438953/237),其中 float32
转换四舍五入到恰好 32768.0,满足您的精度要求。当然,任何恰好可以在 float32
中表示的数字都不会出现表示错误。