我想知道为什么双精度和单精度数字有时相等有时不相等。例如,当我有以下内容时,它们不相等:
import numpy as np
x=np.float64(1./3.)
y=np.float32(1./3.)
但以下条件是相等的:
x=np.float64(3.)
y=np.float32(3.)
我理解为什么第一组 x 和 y 不相等,但我不太确定为什么第二组相等。
此答案假设 single 是 IEEE 754 32 位二进制浮点数,double 是相应的 64 位类型。
任何可以用单精度表示的值也可以用双精度表示。 3.0就是这样。最接近的单数和最接近的双数的值都恰好为 3,并且相等。
如果一个数字无法用单数精确表示,则双数可能是更接近的近似值并且与单数不同。 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
想象一下,您必须用有限的位数来表示以 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 也是如此。
假设两个数A=C4720000和B=42500000是单精度IEEE浮点数;找到A*B。 给我一个简单的解决方案并评价该解决方案