基于位表示理解机器精度

时间:2013-08-29 20:32:42

标签: math floating-point decimal precision bit

我试图了解这是如何计算的:

表示数字的计算机程序,如下所示:整体为1位 符号,指数为5位,尾数为20位。显然,我们需要使用偏差来表示正数和负数。基于此,我将如何计算机器精度和最大可能数?

2 个答案:

答案 0 :(得分:0)

获得想法的一种方法是测试程序何时舍入为零。你可以在python中使用这段代码。

N = 52
a = 1.0-2**(-N); 
print "%1.25f" % a

尝试不同的N值。当打印输出给出最低N的零时,它将显示有效位的使用位数。 print语句是为了确保程序真正将数字视为零,而不仅仅显示零。

答案 1 :(得分:0)

假设您使用的是IEEE标准,则表示数字的公式为:

number = sign*(1+2^(-m)*significand)*2^(exponent-bias)

其中m是用于存储(整数)有效数字(或尾数)的位数,bias等于2^(e-1) - 1,其中e是数字用于存储指数的位数。

让我们看看我们可以从中得到什么。注意

  • significand的值介于02^m - 1之间(在您的情况下:0到1048575之间)。
  • exponent的值介于02^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。

我希望我没有弄错,我不是这方面的专家。