将IEEE 754 Float转换为MIL-STD-1750A Float

时间:2013-01-28 13:23:17

标签: c floating-point type-conversion floating-accuracy

我正在尝试将IEEE 754 32位单精度浮点值(标准c浮点变量)转换为MIL-STD-1750A格式的无符号长变量。我在帖子的底部包含了IEEE 754和MIL-STD-1750A的规范。现在,我在代码转换指数时遇到问题。我也看到转换尾数的问题,但我还没有解决这些问题。我使用上面链接中表3中列出的示例来确认我的程序是否正确转换。其中一些例子对我没有意义。

  1. 这两个例子如何具有相同的指数?

    .5 x 2^0 (0100 0000 0000 0000 0000 0000 0000 0000) 
    -1 x 2^0 (1000 0000 0000 0000 0000 0000 0000 0000)
    

    .5 x 2 ^ 0有一个小数位,-1没有小数位,所以.5 x 2 ^ 0的值应为

    .5 x 2^0 (0100 0000 0000 0000 0000 0000 0000 0010)
    

    正确? (0010而不是0001,因为1750A使用加1偏差)

  2. 最后一个示例如何使用全部32位,第一个位为1,表示负值?

    0.7500001x2^4 (1001 1111 1111 1111 1111 1111 0000 0100)
    
  3. 我可以看到127指数的值应该是7F(0111 1111)但是127指数为负的值呢?它会是81(1000 0001)吗?如果是这样,那是因为这是127的两个补码+1?

  4. 谢谢

    1750ASpecification

2 个答案:

答案 0 :(得分:1)

  

1)这两个例子如何具有相同的指数?

据我了解,符号和尾数有效地定义了[-1.0,1.0]范围内的二进制补码值。

当然,这导致冗余表示(0.125 * 2 1 = 0.25 * 2 0 等)因此,通过禁用尾数选择规范的归一化表示值范围为[-0.5,0.5)。

所以在你的两个例子中,-1.0和0.5都属于“允许的”尾数范围,所以它们都共享相同的指数值。

  

2)最后一个例子如何使用全部32位,第一个位为1,表示负值?

这对我来说不合适;你是如何获得这种表述的?

  

3)具有负127指数的值怎么样?它会是81(1000 0001)吗?

我相信。

答案 1 :(得分:0)

  1. 请记住,分数是“有符号分数”。带符号的值以2的补码格式存储。所以把零视为一个 因此,该数字可写为-0.111111111111111111111(基数2)x 2 ^ 0 ,接近于1(如果我的数学是正确的,则收敛到1.0)

  2. 在最后一个例子中,原始文件中有一个负号(-0.7500001x2 ^ 4)