c - 为什么我的浮点值打印不正确?
问题描述
我正在尝试打印出浮点值 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
解决方案
这些将十六进制数字的浮点表示分配给浮点数。
相反,请执行以下操作:
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);
}
推荐阅读
- mysql - Kubernetes Job can't reach service right away
- apache-spark - The value of spark.network.timeout must be no less than the value of spark.executor.heartbeatInterval
- r - 长到宽格式,但没有条件
- c++ - 从控制台 C++ 读取一行
- perl - 清理 Perl 脚本不应删除符号链接到的目录
- c - C中的数组边界
- excel - 如何确定某个区域的单元格中是否存在形状?
- java - SimpleXML 从特定元素获取内部 XML
- function - Python中的一个简单数学对我来说很难
- python - 是否有可能从我的井字游戏中导出四连线?