双精度和单精度浮点数?

double precision and single precision floating point numbers?

我想知道为什么双精度数和单精度数有时相等有时不相等。例如,当我有以下内容时,它们不相等:

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 就是这种情况。最接近的 single 和最接近的 double 的值都恰好为 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的single是0.100000001490116119384765625,最接近double的是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 也是如此。