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

ipk*_*iss 3 c ieee-754

请看一下以下内容:

在此输入图像描述

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

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

非常感谢.

Dan*_*ien 7

以红色突出显示的公式可用于计算64位值在被视为IEEE 754双精度时所代表的实数.只有当您想手动计算从二进制到它所代表的基数为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;
}
Run Code Online (Sandbox Code Playgroud)

http://codepad.org/kSithgZQ

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

了解真实是否可以精确表示为IEEE 754双精度的关键是计算实数的二进制表示并以科学计数法写出(例如,对于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 不能完全代表.

  • 一个很好的答案!Stackoverflow的许多人似乎都认为浮点值不精确.这只是部分正确:当用于表示二进制空间中的数字时,它们完全且绝对精确,如上例所示.当小数空间映射到二进制上时,我们得到的不精确,如示例所示.更确切地说,它试图映射不精确的十进制值.或许,为了进一步说明,您可以显示精确的十进制值(如0.4)如何映射到二进制,我们有三种情况.+1 (2认同)