将前IEEE-754 C ++浮点数转换为C#或从C#转换

时间:2010-04-21 20:25:50

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

在.Net之前,在数学协处理器之前,在IEEE-574之前,Microsoft为浮点数定义了一个位模式。旧版本的C ++编译器很乐意使用该定义。

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

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

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

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

至少,我希望有人可以使用旧FP格式的位定义进行回复,因此如果需要,我可以组合一个低级别的位操作算法。

感谢。

2 个答案:

答案 0 :(得分:3)

我跟随JohannesRö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位)。

     

有3个部分:

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

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

  4.   
  5. 除了第二个最高字节的剩余7位中的尾数的第一个设置位之外的所有位,   和其余的字节。并且由于非零数字的最显着位是1,所以它   没有代表。但如果是的话,它将共享标志所在的相同位位置   (这就是我在那里完成实际尾数的原因)。

  6.         

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

答案 1 :(得分:2)

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

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

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