gpt4 book ai didi

c# - 将二进制 32 位 IEEE-754 浮点转换为 .net 中的 Double

转载 作者:太空宇宙 更新时间:2023-11-04 00:26:31 26 4
gpt4 key购买 nike

我正在尝试解析二进制文件 STereoLithography file(.stl)在.net(C#)中,其中包含32位 float (IEEE-754)。

我需要解析这些数字,然后将这些数字存储在 PovRay 脚本中的字符串表示形式,这是一个纯文本文件。

我使用readFloatLE在nodejs中尝试了这个函数返回一个数字( double 值)。

在.net中,我只找到了Bitconverter.ToSingle函数,它读取二进制32位并给我一个 float ,其十进制精度(7)比nodejs解析的要低。

nodejs 解析给出了一个 povray 脚本,其数字如下:-14.203535079956055虽然.net只给了我:-14.2035351

那么,如何在.net中将二进制32位解析为Double以获得更高的精度?

[编辑]

使用 taffer 中的 anwser:将 float 转换为 double,然后使用“round-trip”格式化程序进行字符串表示。

与nodejs输出相比,仍然存在较小的舍入差异,但这些差异在小数点后第13-16位。

最佳答案

您没有失去任何精度。与 JavaScript 不同,默认的 .NET ToString 使用通用数字格式,这可能会截断最后的数字。

但是如果你使用round-trip format specifier你会得到确切的结果:

var d = double.Parse("-14.203535079956055");
Console.WriteLine(d.ToString("R")); // displays -14.203535079956055

编辑

在 JavaScript 中,没有 32 位 float 类型。每个数字都是 double 。因此,即使您使用 readFloatLE 函数,它也会被解析为 32 位的 double 。请参阅下面的 C# 代码,它演示了实际发生的情况:

var d = (double)float.Parse("-14.2035351");
Console.WriteLine(d.ToString("R")); // displays -14.203535079956055

或者更准确地说,如果您从字节缓冲区读取数字:

var d = (double)BitConverter.ToSingle(new byte[] { 174,65,99,193 }, 0);
Console.WriteLine(d.ToString("R")); // displays -14.203535079956055

关于c# - 将二进制 32 位 IEEE-754 浮点转换为 .net 中的 Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42582778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com