浮点输出格式产生奇怪的值

时间:2013-11-18 13:26:50

标签: c floating-point format

行:
我发现这是a dupe question

对于我的回答to this question,我测试了如果我将浮点数传递给printf会发生什么情况,并将其打印为十六进制值。
我使用的代码就是这样:

int main()
{
    float i = 12.2;
    printf("%x == %f\n", i, i);
    return 0;
}

结果有点令人惊讶,至少可以说:

60000000 == 26815622268991053043690768862555225929794561970930945383754133458631904088629457662404735694345936594619420127195201411004744101710347755649498829446709248.000000

现在这不太可能,我想。如果我将格式字符串的顺序切换为"%f == %x\n",则浮动显示良好(12.200000)。
现在这引起了我的兴趣。所以我做了一些实验

printf("%f == %x == %f\n", i, i, i);

向我透露,在使用%f 后,%x格式失败。所以我试过了:

printf("%f == %x == %f\n", 12.2, i, 12.2);

让我更加抓我的面条:

12.200000 == 60000000 == 190359837254612272720121546180914982603183590679420528733621571728996711854558612668142684377801318191569131534073063745617380878171517108433746379972393615159806611654135195336789983232.000000

而且,在你问:

之前
printf("%f == %x == %f\n", 12.2f, i, 12.2f);

的产率:

12.200000 == 60000000 == 26815622268991053043690768862555225929794561970930945383754133458631904088629457662404735694345936594619420127195201411004744101710347755649498829446709248.000000

当我在上面发布的语句之前或之后打印printf("%f\n", i)时,输出就像我预期的那样。

有谁知道这里发生了什么?

2 个答案:

答案 0 :(得分:6)

您的计划的行为未定义。错误的转换说明符调用undefined behavior

答案 1 :(得分:2)

%x格式适用于整数,而不是浮点数。要以十六进制格式打印浮点数,请使用%a。要以十六进制打印浮点数(或其他任意对象)的原始字节,这是我猜你真正想要的,你必须使用一个联合:

union {
  float f;
  unsigned int i;
} u;
u.f = 1.2;
printf("%x", u.i);

memcpy从float到int的字节然后printf为int。

或者你可以欺骗并使用*(int *)&some_float