c - 在 C 中以高精度将 4 个字节转换为 32 位浮点数?
问题描述
我有 4 个字节,其值为 unsigned char 是:63 129 71 174。
假设将其转换为浮点数时,应变为1.0099999904632568。
但是,我得到的只是 1.01,这对于我正在做的事情来说还不够精确。
我使用了 memcpy 或 uninion 等流行方法,但无济于事,这让我相信……这是 C 语言中的某种限制吗?
如果是这样,最佳解决方案是什么?谢谢。
编辑:对不起这个不好的例子。我应该为我的情况选择一个更好的。考虑这 4 个字节:0 1 229 13。
它很小,真的很小。但是,它是 4 个字节,所以它仍然代表一个浮点数。但是,C 只会返回 0。我在小数点后加上 16 个数字,但它不起作用。
那么为什么,以及如何使用这样的数字呢?
编辑2:对不起。我的朋友搞砸了。她给了我 4 字节的序列,并说它是 32 位浮点数,但结果是 32 但无符号整数。这几乎把我整个下午都搞砸了。真的很抱歉打扰。
我想这里的结论是:不要总是相信你的朋友。
解决方案
使用memcpy()
确实是要走的路。
#include <stdio.h>
#include <string.h>
int main(void)
{
const unsigned char raw1[] = { 174, 71, 129, 63 };
const unsigned char raw2[] = { 0, 1, 229, 13 };
float x, y;
memcpy(&x, raw1, sizeof x);
memcpy(&y, raw2, sizeof y);
printf("%.6f\n", x);
printf("%g\n", y);
return 0;
}
这打印出来1.010000
,我认为期望从float
. 请注意,我交换了字节的顺序,在我认为的小端系统(ideone.com)上进行了测试。
对于%g
第二个数字,它会打印1.41135e-30
.
推荐阅读
- r - 将曲线拟合到 gdistance 的 accCost
- flutter - 在 Flutter 中更改 TextFormField 中的文本
- sql - 在结果中将不均匀和不相关的行合并在一起,缺失值为 null
- sql - 从两个不同的 JSON 列中选择导致 n^2 行而不是 n
- svg - SVG中有多少个参数可以有一个相对的椭圆弧?
- android - 获取实际值后获取空值
- kdb - 获取大型 tplog 文件的子集,而无需在 kdb 的内存中加载完整的 tplog 文件
- php - 如何访问 http://localhost/wordpress/wp-admin/install.php?
- r - 删除包含包含特定字母的字符的向量中的位置
- c# - 客户端未在 C# 客户端-服务器应用程序中接收数据