c# - C# 和 C/C++ 中二进制到 float 转换的区别

标签 c# c++ c .net

在 C/C++ 和 C# 中转换二进制数时,我们会通过四舍五入得到 2 个不同的结果。 例如 - 让我们以 1000010000010110110000010111111 为例,在 C# 中 - 我们将得到 34.84448 而我们将得到 34.844479,为什么会有这种微小的差异? 在 C# 中转换:

float f = System.BitConverter.ToSingle(bytearray,0);
//bytearray is an array that contains our binary number

在 C++ 中:

int a = 1108041919; //The number that is being represented
float f = *(float *)&a;

最佳答案

有很多方法可以明确以十进制表示相同的浮点值。例如,您可以在精确输出后添加任意多个零(请注意,由于 2 的每个幂都有有限长度的十进制表示,所以每个 float 也是如此)。

“我什么时候可以停止打印额外数字”的标准通常选择为“如果您将十进制输出解析为再次漂浮”。简而言之:预计输出一个 float “往返”。

如果您解析十进制表示 34.84447934.84448,您会发现它们都转换回浮点值 0x420b60bf01000010000010110110000010111111。所以这两个字符串代表相同的 float 。(来源:自己尝试 https://www.h-schmidt.net/FloatConverter/IEEE754.html)

你的问题归结为“为什么不同的运行时库为同一个 float 打印出不同的值?”,答案是“通常由库决定何时停止打印数字,它们不是要求至少停止”。只要您在再次解析时能得到相同的 float ,库就完成了它的工作。

如果您想查看完全相同的十进制字符串,您可以使用适当的格式设置选项来实现。

关于c# - C# 和 C/C++ 中二进制到 float 转换的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220510/

相关文章:

c++ - 将一行二维数组分配给一维数组

c++ - gcc reverse_iterator 比较运算符丢失了吗?

c - 为什么 `gcc -Q -march=corei7-avx --help=target` 是谎言?

c# - 如何将 Blazor WebAssembly 连接到数据库

c# - 将行号添加到以 Release模式部署的 ASP.NET 网站的堆栈跟踪

c# - 奇怪的析构函数行为,调用两次,但第一次跳过代码执行

c++ - CORBA/OMG C++11 语言映射

c - 如何用 git 处理这个补丁问题?

无法理解为什么队列函数程序第一次工作但之后不按预期工作

c# - 将文本列排序为数字列WPF MVVM