【问题标题】:Convert 4 bytes to 32 bit float with high precision in C?在 C 中以高精度将 4 个字节转换为 32 位浮点数?
【发布时间】:2023-03-24 04:33:01
【问题描述】:

我有 4 个字节,比如 unsigned char 的值是:63 129 71 174。

假设转换为float时应该变成1.0099999904632568

但是,我得到的只是 1.01,这对于我正在做的事情来说不够精确。

我使用了 memcpy 或 uninion 等流行方法但无济于事,这让我相信……这是 C 语言中的某种限制吗?

如果是这样,最佳解决方案是什么?谢谢。

编辑:对不起,这个不好的例子。我应该为我的情况选择一个更好的。考虑这 4 个字节:0 1 229 13。

它很小,真的很小。但是,它是 4 个字节,所以它仍然代表 float number。但是,C 只会返回 0。我在小数点后放了 16 个数字,但它不起作用。

那么为什么,以及如何使用这样的数字?

编辑 2:对不起。我的朋友搞砸了。她给了我 4 个字节的序列,并说它是 32 位浮点数,但结果是 32 但无符号整数。这几乎把我整个下午都搞砸了。真的很抱歉打扰。

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

【问题讨论】:

  • 很可能您只是打印输出精度不够。
  • 尝试printf("%.10f", myFloat) 并检查结果。
  • 感谢您的指出。它解决了我一半的问题。然而,另一半,比如一个由 4 个字节表示的数字: 0 1 229 13... 它是一个浮点数,只是一个非常小的浮点数。我该如何使用它?谢谢。
  • 如果你想打印一个很小/很大的float,你可能想用科学计数法打印它,像这样:printf("%.10e\n", myFloat);
  • 对于第二个例子,使用printf("%.50f", myFloat); 产生0.00000000000000000000000000000000000000017400343421

标签: c floating-point byte precision


【解决方案1】:

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

【讨论】:

  • @WeatherVane 它成功恢复了浮动,OP 无法做到这一点。
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多