有关IEEE 754的问题,64位是否加倍?

时间:2011-02-25 02:36:52

标签: c ieee-754

请查看以下内容:

enter image description here

我理解如何将双精度转换为基于IEEE 754的二进制文件。但我不明白该公式的用途。

当我们使用上述公式时,有人可以给我一个例子吗?

非常感谢。

2 个答案:

答案 0 :(得分:7)

以红色突出显示的公式可用于计算当被视为IEEE 754双精度时64位值表示的real number。仅当您想手动计算从二进制到其所代表的基数为10的实数的转换时才有用,例如在验证C库的printf实现的正确性时。

例如,使用0x3fd5555555555555上的公式,发现 x 正好是0.333333333333333314829616256247390992939472198486328125。这是0x3fd5555555555555代表的实数。

#include <stdio.h>
#include <stdlib.h>

int main()
{
  union {
    double d;
    unsigned long long ull;
  } u;

  u.ull = 0x3fd5555555555555L;
  printf("%.55f\n", u.d);

  return EXIT_SUCCESS;
}

http://codepad.org/kSithgZQ

编辑:正如Olof所评论的那样,IEEE 754双精确表示等式中的值 x ,但并非所有实数都可以准确表示。实际上,只有有限数量的实数,如0.5,0.125和0.3333333333333333914829616256247390992939472198486328125 可以完全表示,而绝大多数(uncountably many)包括1 / 3,0.1,0.4和{ {3}} 不是

知道实数是否可以精确表示为IEEE 754 double的关键是计算实数的二进制表示并将其写入π(例如b1.001×2 -1 为0.5625)。如果除了尾随零之外的小数点右边的二进制数字的数量小于或等于52且指数减去1之间的二进制数字在-1022和+1023之间,则数字 表示的。

我们来看几个例子。请注意,手头有一个任意精度的计算器是有帮助的。我将使用scientific notation

  1. 数字1/64为十进制0.015625。要计算其二进制表示,我们可以使用ARIBAS'decode_float函数:

     ==> set_floatprec(double_float).
    -: 64
    
    ==> 1/64.
    -: 0.0156250000000000000
    
    ==> set_printbase(2).
    -: 0y10
    
    ==> decode_float(1/64).
    -: (0y10000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000, 
    -0y1000101)
    
    ==> set_printbase(10).
    -: 10
    
    ==> -0y1000101.
    -: -69
    

    因此科学记数法为1/64 = b0.000001,或b1.0×2 -6

    1/64 可以完全代表。

  2. 十进制数1/10 = 0.1。计算其二进制表示:

    ==> set_printbase(2).
    -: 0y10
    
    ==> decode_float(1/10).
    -: (0y11001100_11001100_11001100_11001100_11001100_11001100_11001100_11001100, 
    -0y1000011)
    
    ==> set_printbase(10).
    -: 10
    
    ==> -0y1000011.
    -: -67
    

    所以1/10 = 0.1 = b0.000 1100 (其中粗体表示重复数字序列),或b1.100 1100 ×2 -4 用科学计数法表示。

    1/10 不能完全可表示。

答案 1 :(得分:2)

公式是将二进制表示转换为数字!

如果要实现浮点单元,则只需要它