Math 有没有办法找到使用哪种浮点算法

Math 有没有办法找到使用哪种浮点算法,math,floating-point,binary,ieee-754,Math,Floating Point,Binary,Ieee 754,我有一个二进制数11000000111100000101011011101,它应该有0.0736327171325684的十进制表示 有没有一种聪明的方法可以把二进制值解释为给定的十进制值 一些背景 我有一个二进制文件,其中包含来自fortran的REAL*4数据类型,我相信是FortFran77。 我在网上找到了这个: 实元素有符号位、8位指数和23位分数。f77中的这些实元件符合IEEE标准 但是,尝试应用IEEE标准时,我得到了这个十进制值-6.37774515152,这是不正确的。我一直

我有一个二进制数11000000111100000101011011101,它应该有0.0736327171325684的十进制表示

有没有一种聪明的方法可以把二进制值解释为给定的十进制值

一些背景 我有一个二进制文件,其中包含来自fortran的REAL*4数据类型,我相信是FortFran77。 我在网上找到了这个:

实元素有符号位、8位指数和23位分数。f77中的这些实元件符合IEEE标准

但是,尝试应用IEEE标准时,我得到了这个十进制值-6.37774515152,这是不正确的。我一直在尝试使用大/小endian和64位。我还尝试了二进制数据中的每一个偏移量,以确保我没有看到错误的位置,但我所能得到的最接近的运气仍然是0.011872760951519054,我相信这将远远大于精度误差

更新:如果不清楚,我很抱歉:我没有生成二进制文件的原始fortran代码

一些可能有用的额外信息:

代码大约有20年历史了。 在同一个项目的代码中,我发现有提到IEEE和microsoft二进制格式之间的转换。 我还发现提到REAL*4,根据语言参考,它应该是REAL的别名。 我已经成功地从同一个文件中解码了INTEGER和INTEGER2类型。整数类型是8位整数。INTEGER2类型是一个16位整数,具有较小的端点。这是否暗示真实的*4也是小endian? 正如注释中指出的,上面链接的参考是针对fortran的编译器,我们不能确定生成二进制文件的代码是否使用了相同的编译器。因此,REAL*4类型可能根本没有使用IEEE标准。
这在逆向工程中是一个相当不错的练习。看起来您的号码是以little endian格式存储的,并且是以所谓的Microsoft二进制格式存储的。根据本发明,该格式首先存储8位指数,偏移量为128;然后是1位符号,然后是23位有效位,带有隐式1。如果指数为0,则数字本身表示0。假设二进制点位于整个有效位之前。此格式没有无穷大或NaN值的表示形式,也不支持次正常值

让我们按照这个描述。你的意见是

11000000110011000001011001111101
其中,十六进制表示:

C0 CC 16 7D
从little endian转换,位模式为:

7D 16 CC C0
回到双星,在8-1-23编队中,我们得到:

01111101 0 00101101100110011000000
存储的指数值为0b01111101,十进制为125。该格式的偏差为128;我们的指数值是-3

符号是0,所以是正数

有效位有一个隐式的,并且假设基点在整个有效位之前。所以它是:二进制的0.10010110011000000。对应于:

2^-1 + 2^-4 + 2^-6 + 2^-7 + 2^-9 + 2^-10 + 2^-13 + 2^-14 + 2^-17 + 2^-18
那么,最终值为:

2^-3 * (2^-1 + 2^-4 + 2^-6 + 2^-7 + 2^-9 + 2^-10 + 2^-13 + 2^-14 + 2^-17 + 2^-18)
其数学计算结果为,无任何舍入/截断:

0.07363271713256836

我相信这就是您首先要寻找的价值。

嗯,需要一些重要的细节。是大的还是小的endian?文件是如何创建的,即直接访问还是流访问?这一点很重要,因为您可能有记录标记,这会使读取文件变得复杂。数字0.0736327171325684对于单个精度的数字而言位数过多。尾随的6或7位可能是垃圾。您是否设置了一个实*4注释,Fortran类型无效,但我将变量偏移为0.073。。。。并以B32.32格式打印值?您的语言参考仅是Oracle对特定编译器的参考。请注意,根据数据的年龄,一些未知数据可能来自Fortran编译器使用不同浮点格式的旧计算机。Fortran标准不要求使用IEEE标准,即使它在本世纪非常常见。Fortran语言没有说明REAL*4或默认REAL类型的IEEE-754符合性。您链接的文档引用了一个编译器的实现:如果您没有在该系统上使用该编译器,那么它所说的内容是无用的。在此之前,请向我们详细说明您使用什么Fortran生成数据,我不认为这是Fortran的问题,因此需要删除标记。@VladimirF感谢您对编译器的了解。考虑到我在用IEEE-754测试强制执行整个文件时运气不佳,我相信情况可能就是这样。我用一些额外的信息更新了帖子。@steve我不知道它是大尾端还是小尾端,但我在同一文件中找到了小尾端的其他值,用这些信息更新了帖子。我不知道这个文件是怎么创建的。因为我不知道使用了什么fortran编译器,所以无法将十进制值转换为具有相同格式t的二进制值
他最初生成的文件。非常感谢!这很有效。