【问题标题】:Understanding machine precision based on bit representation基于位表示理解机器精度
【发布时间】:2013-09-02 10:44:58
【问题描述】:

我想了解这是如何计算的:

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

【问题讨论】:

  • 什么是浮点基数?数字是否标准化?如果既是二进制又是规范化的,那么表示是否使用非存储的前导一位?最大和最小的指数是多少?知道 5 位存储是不够的。它可能是 [-15,16]、[-16,15] 和 [-15, 15] 中的任何一个,具有为无穷大和 NaN 保留的值。
  • 另外,20 位是全有效位(有前导位)还是减少有效位(没有前导位)?

标签: math floating-point decimal precision bit


【解决方案1】:

假设您使用的是 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。

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

【讨论】:

    【解决方案2】:

    获得想法的一种方法是测试程序何时归零。你可以在 python 中编写这段代码。

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

    尝试使用不同的 N 值。当打印输出的最低 N 为零时,它会告诉您有多少位用于有效位。 print语句是为了保证程序真的把数字看成零,而不是只显示零。

    【讨论】:

    • 您的意思是在将a 设置为a = 1.0-2**(-N) 之后打印a-1 吗?在任何情况下,这都没有帮助。 OP 询问使用非标准浮点格式的假设情况,并且假设格式的有效位数中的位数是已知的。
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 2015-04-02
    • 2013-02-05
    • 2011-09-26
    • 2011-03-24
    • 1970-01-01
    • 2011-12-21
    • 2014-12-10
    相关资源
    最近更新 更多