我试图了解这是如何计算的:
表示数字的计算机程序如下:总符号 1 位,指数 5 位,尾数 20 位。显然我们需要使用偏差来表示正数和负数。基于此,我将如何计算机器精度和最大可能数量?
我试图了解这是如何计算的:
表示数字的计算机程序如下:总符号 1 位,指数 5 位,尾数 20 位。显然我们需要使用偏差来表示正数和负数。基于此,我将如何计算机器精度和最大可能数量?
获得想法的一种方法是测试程序何时归零。您可以在 python 中使用此代码。
N = 52
a = 1.0-2**(-N);
print "%1.25f" % a
尝试不同的 N 值。当打印输出的最低 N 为零时,它会告诉您有多少位用于有效位。print语句是为了保证程序真的把数字看成零,而不是只显示零。
假设您使用的是 IEEE 标准,则数字表示的公式为:
number = sign*(1+2^(-m)*significand)*2^(exponent-bias)
其中m
是用于存储(整数)有效位(或尾数)的位数,并且bias
等于是用于存储指数的位数2^(e-1) - 1
。e
让我们看看我们能从中得到什么。注意
significand
之间的范围值(在您的情况下:0 到 1048575 之间)。0
2^m - 1
exponent
范围 和 之间0
的值2^e - 1
。但是,这两个极值都是为例外(次正规数、无穷大和 NAN)保留的,称为非标准化数。最后,
(1+2^(-m)*significand)
是 1,最大值是2-2^(-m)
(在您的情况下为 2-2^(-20),大约为 1,999999046)。exponent-bias
是-2^(e-1)+2
(在您的情况下为 -14),最大的是2^(e-1)-1
(在您的情况下:15)。所以事实证明:
2^(-2^(e-1)+2)
(在您的情况下为 2^(-14),大约为 0,000061035)(2-2^(-m))*(2^(2^(e-1)-1))
(在您的情况下为 (2-2^(-20))*(2^15),大约为 65535,96875)。至于“机器精度”,我不确定您的意思,但有人称m+1
(此处为 21)二进制精度,十进制数字的精度为log10(2^(m+1))
,对您而言,这大约是 6.3。
我希望我没有做错什么,我不是这方面的专家。