【问题标题】:What is the string representation of the IEEE 1xxx floating point format, and how do I output it?IEEE 1xxx 浮点格式的字符串表示形式是什么,如何输出?
【发布时间】:2012-08-20 08:44:47
【问题描述】:

我正在尝试以 VRML 2.0 使用的格式从 c# 输出浮点数。

根据the vrml spec,这是

IEEE 1xxx 浮点中的双精度浮点数 格式(见 2.[IEEE])。

[IEEE]:ISO/IEC 9899:1990 编程语言——C。 http://www.iso.ch/isob/switch-engine-cate.pl?searchtype=refnumber&KEYWORDS=9899 (死链接)

  • 此格式的正确字符串表示形式是什么?我很难找到参考。我找到了一些关于二进制表示的解释,但没有找到关于字符串表示的解释。
  • 如何按照这种格式配置 NumberFormatInfo 或 CultureInfo?

澄清:

我想生成一个 vrml 文件,我需要知道如何保证

var myCultureInfo = CultureInfo.InvariantCulture;
myCultureInfo.NumberFormat = ....
StringWriter sw = new StringWriter(MyCultureInfo)
sw.Write(myDouble);

将根据 vrml 规范生成一个 100% 的数字。

【问题讨论】:

  • 您的意思是,在 VRML 中正确的字符串表示是什么?因为 AFAIK IEEE 标准定义了二进制表示,但同一数字可能有多个字符串表示(例如 12.3412,34+12.341.234E+1)。
  • 是的,我想生成一个 VRML 文件,我需要知道如何根据规范格式化我的数字。由于 VRML 是纯文本格式,我需要将我的数字转换为字符串

标签: c# floating-point cultureinfo vrml iformatprovider


【解决方案1】:

我在某处看到 VRML 使用与 ISO C 相同的浮点数格式。甚至您提到的 VRML 规范页面也暗示了这一点:

SFFloat 字段指定一个单精度浮点数。 MFFloat 指定零个或多个单精度浮点数。 SFFloat 和 MFFloat 以 IEEE 1xxx 浮点格式写入 VRML 文件(请参阅2.[IEEE])。

注意该超链接指向的位置:指向 ISO C 的参考书目条目。

因此,如果您只是禁用任何特定于文化的格式(例如特殊小数点、分隔三个数字块的字符等),您应该获得正确的格式。您可以通过使用“不变文化”来做到这一点:

double number = …;
string numberEncoding = number.ToString(CultureInfo.InvariantCulture.NumberFormat);

如果你想控制数字的输出格式,另见Standard Numeric Format Strings,例如

  • 科学格式:

    number.ToString("E", CultureInfo.InvariantCulture.NumberFormat)
    
  • 对于往返格式:

    number.ToString("R", CultureInfo.InvariantCulture.NumberFormat)
    

……等等。

P.S.:如果您不太相信不变的文化将是完全正确的匹配,您总是可以创建自己的 NumberFormatInfo 实例:

var vrmlNumberFormat = new NumberFormatInfo { NumberDecimalSeparator = ".", … };
string numberEncoding = number.ToString(vrmlNumberFormat);

【讨论】:

  • 我这样做了,但我完全不清楚这是否会导致与 VRML 100% 兼容的数字表示。特别是我担心允许的最大位数或用于非常小的数字的指数格式会有所不同
  • @HugoRune:如果您可以在 VRML 标准中验证 VRML 确实使用与 ISO C 相同的格式来指定浮点数,那么我相信 .NET 不变文化将满足您的需求。
  • 是的,但这正是我无法验证的部分:)
  • @HugoRune:更新了我答案的开头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2010-11-05
  • 2012-10-27
  • 2012-06-11
  • 2018-01-10
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多