【问题标题】:Convert pre-IEEE-754 C++ floating-point numbers to/from C#在 C# 之间转换 pre-IEEE-754 C++ 浮点数
【发布时间】:2010-04-21 20:25:50
【问题描述】:

在 .Net 之前,在数学协处理器之前,在 IEEE-574 之前,微软为浮点数定义了一种位模式。旧版本的 C++ 编译器愉快地使用了这个定义。

我正在编写一个需要在文件中读取/写入此类浮点数的 C# 应用程序。如何进行 2 位格式之间的转换?我需要双向的转换方法。

此应用程序将在 PocketPC/WinCE 环境中运行。

更改文件的结构超出了此项目的范围。

是否有 C++ 编译器选项指示它使用旧的 FP 格式?那将是理想的。然后,我可以使用以 null 结尾的文本字符串在 C# 代码和 C++ 代码之间交换数据,而 C++ 方法将是 sprintf 和 atof 函数的简单包装。

至少,我希望有人可以回复旧 FP 格式的位定义,以便我可以在必要时组合一个低级位操作算法。

谢谢。

【问题讨论】:

标签: c# c++ floating-point ieee-754


【解决方案1】:

我从 Johannes Rössel 的 Wikipedia link 中找到了面包屑,发现了一个不难翻译的 Python 实现:http://groups.google.com/group/comp.lang.python/browse_thread/thread/42150ccc20a1d8d5/4aadc71be8aeddbe

这是 Bengt Richter 在该链接中的格式文档:

根据旧的 MASM 5.0 程序员指南,有一个 Microsoft 二进制格式 用于编码实数,包括短(32 位)和长(64 位)。

一共有三个部分:

  1. 最高字节中的偏置 8 位指数(在我们一直使用的小端视图中的最后一个) 它说短数字的偏差是 0x81,长数字的偏差是 0x401,但我不确定它在哪里排列。 我只是通过实验到达那里的。

  2. 第二高字节的高位中的符号位(0 表示 +,1 表示 -)。

  3. 第二高字节的其余7位中除尾数的第一个设置位之外的所有, 和其余的字节。由于非零数的最高位是 1,所以它 没有代表。但如果是,它将共享符号所在的相同位位置 (这就是为什么我把它放在里面来完成实际的尾数)。

MASM 还支持类似于 IEEE 的 10 字节格式。我没有在那个部分看到任何东西 关于 NaN 和 INF。

【讨论】:

    【解决方案2】:

    根据 Johannes 的回答,您可以前往 http://support.microsoft.com/kb/140520 下载从 mbf 到 IEEE 的转换 .dll 的源代码。

    编辑:实际上,这对您没有帮助。但实际的 MBF 格式记录在这里:http://support.microsoft.com/kb/35826

      -------------------------------------------------
     |              |    |                             |
     |8 Bit Exponent|Sign|   55 Bit Mantissa           |
     |              | Bit|                             |
      -------------------------------------------------
    

    【讨论】:

    • 该链接表明源代码确实可用,但它需要旧版本的 C++ 编译器才能正确存储 FP 变量。而且我不能使用 DLL,原因很明显:它应该在 PocketPC/WinCE 平台上运行。
    • Microsoft 链接省略了重要的细节,例如指数的偏差以及尾数顶部是否有隐含的“1”位。
    • @Mark,谁会关心这个? :) 是的,我赞成你的帖子。
    • @Richard:如果您可以访问 MSDN 订阅者下载,您可以获得旧的 MSC 编译器,Visual C++ 1.52 或 2.0,它可能支持相关功能(_fmsbintoieee() 和朋友)。他们甚至可能拥有所提供功能的来源。我不确定它们是否有用,但如果您仍然可以访问它们,可能值得一看。
    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多