在C中以高精度将4个字节转换为32位浮点数?

时间:2019-02-26 11:37:46

标签: c floating-point byte precision

我有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位但未签名的int。我整个下午都快被搞砸了。真的很抱歉。

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

1 个答案:

答案 0 :(得分:3)

使用await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None); var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); 确实是可行的方法。

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中获得更高的精度是不合理的。请注意,我交换了字节顺序,并在我认为的小端系统(ideone.com)上进行了测试。

第二个数字为float,它打印%g