我在特定供应商的产品中使用自定义编程小程序,该产品使用类似c语言来执行某些算术功能。因此,我对如何获取数据有一些非常古怪的限制,以及我可以做些什么来处理它。因此,我有一个奇怪的场景,我需要将Mil Std 1750A Float转换为IEEE754 Float 我将Sign位作为无符号整数,23位小数作为无符号整数,8位指数作为无符号整数。我没有能力用他们的语言做任何按位数学或十六进制。所以我必须尝试将这些元素转换为IEEE 754中的等效值。一旦我创建了IEEE 754 Exponent and Fraction的相应无符号整数值,那么我有办法将它们连接在一起以形成一个4字节的数组(对于32位数字)。我知道实现这个是一种非常奇怪的方式,但是我必须这样做才有非常具体的原因。
任何人都可以帮我吗?
谢谢!
答案 0 :(得分:2)
好吧,如果您知道平台上float和integer的确切按位表示,那么这可能是可能的:
int result = [fraction];
result -= [explicit_MSB_for_normalised_float];
result += [exponent]*[pow(2,exponent_offset_in_float)];
result += [sign]*[pow(2,sign_offset_in_float)];
在这种情况下,您不需要按位操作,因为添加是相同的,只要您添加的数字永远不会设置相同的位。你可以用乘法代替换档(从来没有想过我会这么说!)
这个故障的地方是非正规的。您必须删除明确的MSB(否则它会与指数混在一起),但是如果您转换的数字没有设置MSB会怎样?
无论如何,最后你必须解决严格的混淆问题,才能将你的结果传递给frankenfloat。
答案 1 :(得分:1)
您必须将MIL-STD-1750a浮点数转换为IEEE浮点数,并且对带符号位,指数位和小数位部分使用无符号整数?在开始之前,重要的是要了解军事标准规范和IEEE之间的具体区别。 MIL-STD 1750a是固定的16位系统,用于快速计算小数。如果您必须自己收集值,此图表应该会有所帮助。
如果在1750a缓冲区中的那些位置还没有隔离的值,则需要收集它们。因此,正如您在上面所说的,我们将需要通过加法来应用掩码,或者通过乘法来应用按位运算来收集有符号位,23位小数字段和8位指数字段。
由于与IEEE相比,Mil-Spec缓冲区内的参数方向发生了变化,我们还必须在收集分数和指数缓冲区分区时进行相应的计划。
如果有了这些值,我们要做的就是进行一些卫生和数据计算。
然后应存储所有这三个隔离分区,并用于查找最终转换后的浮点值的“尾数”和“指数”字段。
会在C代码帮助中看到一些示例吗?这是否可以帮助您更接近解决方案,如果不能,我可以获取更多背景信息吗?