两个相等值的双倍保证具有相同的位模式吗?

She*_*ker 3 c floating-point bit-manipulation

在C中,是否保证两个值相等的双精度(double1 == double2)具有相同的位模式?

dbu*_*ush 6

没有这样的保证.

例如,在IEEE浮点格式中,存在负0的概念.它比较等于正0但具有不同的表示.

这是一个例子:

#include <stdio.h>

int main()
{
    unsigned long long *px, *py;
    double x = 0.0, y = -0.0;
    px = (unsigned long long *)&x;
    py = (unsigned long long *)&y;

    printf("sizeof(double)=%zu\n",sizeof(double));
    printf("sizeof(unsigned long long)=%zu\n",sizeof(unsigned long long));

    printf("x=%f,y=%f,equal=%d\n",x,y,(x==y));
    printf("x=%016llx,y=%016llx\n",*px,*py);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

sizeof(double)=8
sizeof(unsigned long long)=8
x=0.000000,y=-0.000000,equal=1
x=0000000000000000,y=8000000000000000
Run Code Online (Sandbox Code Playgroud)

编辑:

这是一个不依赖于类型惩罚的修改示例:

#include <stdio.h>

void print_bytes(char *name, void *p, size_t size)
{
    size_t i;
    unsigned char *pdata = p;
    printf("%s =", name);
    for (i=0; i<size; i++) {
        printf(" %02x", pdata[i]);
    }
    printf("\n");
}

int main()
{
    double x = 0.0, y = -0.0;

    printf("x=%f,y=%f,equal=%d\n",x,y,(x==y));
    print_bytes("x", &x, sizeof(x));
    print_bytes("y", &y, sizeof(y));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

x=0.000000,y=-0.000000,equal=1
x = 00 00 00 00 00 00 00 00
y = 00 00 00 00 00 00 00 80
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到两者之间的表示差异.一个有符号位设置而另一个没有.