首页 > 解决方案 > 为什么我的浮点值打印不正确?

问题描述

我正在尝试打印出浮点值 0x40a00000 和 0xc0200000。但是我打印出来的值和根据 IEEE-754 浮点转换器 ( https://www.h-schmidt.net/FloatConverter/IEEE754.html ) 的正确值是完全不同的:

我应该根据 IEEE 转换器得到的值:

0x3F800000 = 5.00
0xBF000000 = -2.50

我在运行时得到的值:

float tmp1 = 0x40a00000;
float tmp2 = 0xc0200000;

printf("tmp1 = %.2f\n", tmp1);
printf("tmp2 = %.2f\n", tmp2);

tmp1 = 1084227584.00
tmp2 = 3223322624.00

出于某种原因,我的 C 代码没有根据 IEEE 标准格式化浮点值的位,而是将它们格式化为带小数点的 int

标签: cfloating-pointprintf

解决方案


这些将十六进制数字的浮点表示分配给浮点数。

相反,请执行以下操作:

int i1 = 0x40a00000;
int i2 = 0xc0200000;
float tmp1, tmp2;
memcpy(&tmp1, &i1, sizeof(int));
memcpy(&tmp2, &i2, sizeof(int));

打印它们:

printf("tmp1 = %.2f\n", tmp1);
printf("tmp2 = %.2f\n", tmp2);

输出:

tmp1 = 5.00
tmp2 = -2.50

完整示例:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int i1 = 0x40a00000;
    int i2 = 0xc0200000;
    float tmp1, tmp2;
    memcpy(&tmp1, &i1, sizeof(int));
    memcpy(&tmp2, &i2, sizeof(int));
    printf("tmp1 = %.2f\n", tmp1);
    printf("tmp2 = %.2f\n", tmp2);
}

推荐阅读