将双位模式写为文字

Sta*_*tan 5 c

我有十六进制文字 400D99999999999A,它是 3.7 作为双精度的位模式
我如何在 C 中编写它?我看到了这个关于 float_literal 和 hex 的页面。也许这是显而易见的,我需要睡觉,但我不知道如何将位模式编写为浮点数。我知道它应该让一个人写出更精确的分数,但我不确定如何将位模式转换为文字

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    double d = 0x400D99999999999Ap0;
    printf("%f\n", d); //incorrect
    
    unsigned long l = 0x400D99999999999A;
    memcpy(&d, &l, 8);
    printf("%f\n", d); //correct, 3.7
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*zes 3

您尝试使用的值是 IEEE 位模式。C 不直接支持这一点。要获得所需的位模式,您需要指定尾数(作为普通的十六进制整数)以及 2 的幂指数。

在这种情况下,所需的 IEEE 位模式是400D99999999999A。如果去掉符号位和指数,就剩下D99999999999A. 有一个隐含的前导1位,因此要获得实际的尾数值,需要显式添加该值,给出1D99999999999A。这将尾数表示为没有小数部分的整数。然后需要对其进行缩放,在本例中按 2 的幂指数值 -51 进行缩放。所以所需的常数是:

    double d = 0x1D99999999999Ap-51;
Run Code Online (Sandbox Code Playgroud)

如果将其插入代码中,您将获得所需的位模式400D99999999999A