首页 > 解决方案 > 在 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 但无符号整数。这几乎把我整个下午都搞砸了。真的很抱歉打扰。

我想这里的结论是:不要总是相信你的朋友。

标签: cfloating-pointbyteprecision

解决方案


使用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.


推荐阅读