双精度和单精度浮点数?

问题描述:

我想知道为什么双精度和单精度数有时相等,有时不相等。因为当我下面举个例子,他们是不相等的:双精度和单精度浮点数?

import numpy as np 

x=np.float64(1./3.) 
y=np.float32(1./3.) 

但以下是平等的:

x=np.float64(3.) 
y=np.float32(3.) 

我明白为什么第一套X和Y是不相等的,但我不是很肯定为什么第二套是平等的。

这个答案假定单个是IEEE 754 32位二进制浮点,double是相应的64位类型。

任何可以准确表示为单个值的值也可以精确地表示为双精度值。 3.0的情况就是这样。最接近的单个和最接近的两个都具有恰好3的值,并且是相等的。

如果一个数字不能准确地表示在一个单一的,双重可能是一个更接近的近似和不同于单一。这是1.0/3.0的情况。最接近的一个是0.3333333432674407958984375。最接近的两倍是0.333333333333333314829616256247390992939472198486328125。

单和双是二进制浮点。除非等于表格A/(2**B)的一部分,否则不能正确表示数字,其中A是整数,B是自然数,“**”表示指数。诸如终止小数部分但不终止二进制部分的数字(如0.1和0.2)表现得像1/3.0。例如,与0.1最接近的单数是0.100000001490116119384765625,最接近的两倍是0.1000000000000000055511151231257827021181583404541015625

+0

第一个不等式对于像0.2这样的数字实际上是成立的。如果我有x = np.float64(0.2)和y = np.float32(0.2),当我做x == y它会打印出False。是不是0.2在一个单一的? – MSB

+0

@MSB我已在回答中回复了您的评论。 –

想象一下,您必须用有限的位数表示基数10中的1/3。

有了2个位数(我们称之为单精度),这将是0.33
随着4位(双精度),这将是0.3333
因此,两者近似是不相等的。

现在转这在基地2代表1/5还需要位无限多的(二进制位) - 这是0.001100110011 ....

随着24位有效位数(IEEE 754单精度)和53 bits significant(双精度),两个浮点近似值将会不同。

同样为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。