我想知道为什么双精度和单精度数有时相等而有时不相同。例如,当我有以下内容时,他们并不相同:
import numpy as np
x=np.float64(1./3.)
y=np.float32(1./3.)
但以下是相同的:
x=np.float64(3.)
y=np.float32(3.)
我理解为什么第一组x和y不相等但我不太清楚为什么第二组相等。
答案 0 :(得分:1)
这个答案假设single是IEEE 754 32位二进制浮点数,double是相应的64位类型。
任何可以在单个中精确表示的值也可以完全表示为double。这是3.0的情况。最接近的单个和最接近的双重值都精确为3,并且相等。
如果一个数字不能精确地表示在一个数字中,那么double可能是一个更近似的并且与单个数字不同。这是1.0 / 3.0的情况。最接近的单曲是0.3333333432674407958984375。最接近的双倍是0.333333333333333314829616256247390992939472198486328125。
single和double都是二进制浮点数。数字不能精确表达,除非它等于A/(2**B)
形式的一小部分,其中A是整数,B是自然数," **"代表指数。终止小数但不终止二进制分数的0.1和0.2等数字的行为类似于1 / 3.0。例如,最接近0.1的单是0.100000001490116119384765625,最接近的双是0.1000000000000000055511151231257827021181583404541015625
答案 1 :(得分:1)
想象一下,你必须用数量有限的数字代表基数10的1/3。
有2位数字(让我们调用这个单精度),它将是0.33
4位数(双精度)为0.3333
所以两个近似值并不相等。
现在将其转换为基数为2的1/5。您还需要无限数量的位(二进制数字) - 它是0.001100110011 ......
具有24位有效位数(IEEE 754单精度)和53位有效位数(双精度),两个浮点近似值将不同。
相同的1/3 ...
如果数字可以在没有单精度近似的情况下精确表示,那么两个表示都是相等的。
这是一个小于25位的分子(没有尾随零),分母是2的幂。(但在分子和分母中都没有太高的指数......)。
例如1/2 3/2 5/2 ... 1/4 3/4 5/4等...将具有相同的表示。
2 ^ 24 + 1赢得了相同的代表性
但是2 ^ 60会。
还有其他情况,表示将不精确但近似将是相同的:
2 ^ 54 + 1将具有相同的浮点数和双近似值
例如,1 + 2 ^ -60也是如此。