c# - C# 和 C/C++ 中二进制到浮点数转换的区别
问题描述
在 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 的幂都有一个有限长度的十进制表示,所以每个浮点数也是如此)。
“我什么时候可以停止打印额外的数字”的标准通常选择为“如果您再次将十进制输出解析为浮点数,当您得到完全相同的值时,您可以停止打印额外的数字”。简而言之:预计输出浮点数“往返”。
如果您解析十进制表示34.844479
和34.84448
,您会发现它们都转换回浮点值0x420b60bf
或01000010000010110110000010111111
。所以这两个字符串都代表相同的浮点数。(来源:在https://www.h-schmidt.net/FloatConverter/IEEE754.html上亲自尝试)
您的问题归结为“为什么不同的运行时库为同一个浮点数打印出不同的值?”,答案是“通常由库决定何时停止打印数字,它们不需要停止至少”。只要您在再次解析时可以得到相同的浮点数,库就完成了它的工作。
如果您想看到完全相同的十进制字符串,您可以使用适当的格式选项来实现。
推荐阅读
- flutter - Flutter X Cloud Firestore
- javascript - 如何在 React 中过滤传入的道具?
- python - 将用户输入数据保存在 kivy 中并存储以供以后使用/分析 python
- javascript - 制作一个 js 小书签,在新窗口中打开网站并使其全屏显示(mac ver)
- html - 如果嵌入另一个标签,Chrome 和 Edge 是否会停止计算容器的预期行为?
- javascript - Node和npm在执行JS文件时抛出错误?
- amazon-web-services - 如何将数组作为环境变量放入 boto3 Lambda 函数
- python - 为本地工作 git 存储库创建一个 requirements.txt,而不用 .py 代码对导入进行 grepping
- javascript - 将类添加到按钮后,我的单击功能不适用于按钮
- java - 为什么我的 Thymeleaf 视图 HTML 文件不显示 Spting 应用程序中的对象列表?