十六进制浮点常数

Yak*_*kov 2 c floating-point printf hex

在下面的C程序中,演示了十六进制浮点常量的用法

double d;
d = 2;
 printf("Ex 1: 2 in hex: %a\n\n",d);

 d = 256;
 printf("Ex 2: 2^8 in hex: %a\n\n",d);

 d = 0.015625; //= 2^-6
 printf("Ex 3: 2^-6 in hex: %a\n\n",d);

 d = 0.857421875;
 printf("Ex 4: 0.857421875 in hex: %a\n\n",d);
Run Code Online (Sandbox Code Playgroud)

结果是:

Ex 1: 2 in hex: 0x1p+1

Ex 2: 2^8 in hex: 0x1p+8

Ex 3: 2^-6 in hex: 0x1p-6

Ex 4: 0.857421875 in hex: 0x1.b7p-1
Run Code Online (Sandbox Code Playgroud)

我不明白如何得到前4的结果?

Ale*_*nze 6

浮点数中的尾数通常用大于或等于1但小于2的数字表示.在所有示例中,它恰好等于1,但最后一个.

那么,你最后一个怎么办?将0.857421875重新表示为0.857421875*2/2,即1.71484375*2 -1.现在,你想要十六进制的尾数.Double在尾数中具有53位(包括隐含的1),因此在那些52(53)位中的1.71484375实际上表示为等于1.71484375*2 52 = 7722969673498624 = 0x1B700000000000的整数.所以,你有它,0x1.b7p-1.