有关IEEE 754的问题,64位双?

请看一下以下内容:

在此处输入图像描述

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

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

非常感谢。

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

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

 #include  #include  int main() { union { double d; unsigned long long ull; } u; u.ull = 0x3fd5555555555555L; printf("%.55f\n", ud); return EXIT_SUCCESS; } 

http://codepad.org/kSithgZQ

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

知道真实是否可以精确表示为IEEE 754 double的关键是计算实数的二进制表示并用科学计数法写出(例如,对于0.5625,b1.001×2 -1 )。 如果除了尾随零之外的小数点右边的二进制数字的数量小于或等于52并且指数减去1在-1022和+1023之间(包括端值),那么该数字完全可表示的。

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

  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 不能完全代表。

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

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