规范化浮点

时间:2015-09-23 18:58:12

标签: floating-point normalization

我遇到PLC(可编程逻辑控制器)的问题,它不处理非规范化的浮点。

这是我在PLC的对面的控制器上收到的数字(非规范化)的几个十六进制表示: 0x00004180,0x0000C180,0x00006FA0

对于如何按比例标准化与上述类似的值,有人会如此友好地分享一个小代码示例(C ++ / C#或类似代码)吗?我不能对数字使用任何浮点运算,因为它们在PLC中无法识别,因此仅限HEX / BIN操作。

精确度不是问题。

2 个答案:

答案 0 :(得分:3)

作为问题评论的后续内容,如果您想使用定点算术:

非规范化小于 2 ^ { - 126} 且小数部分没有隐式设置前导位,因此基本上非规范化的浮点数是 0.mantissa * 2 ^ { -126}

您可以在int32_t中获取掩码,然后使您的浮点值等于 int_val * 2 ^ { - 126 - 23} = int_val * 2 ^ { - 149} 。 数字23是因为binary32格式有23位尾数。当然,您可以将整数值和指数值存储在不同的变量中。

答案 1 :(得分:1)

如果你使用符号扩展进行位移,则将非正规数刷新为零的简单无分支方法如下(其中f是浮点数的整数重新解释):

int32_t x = f & 0x7F800000; // mask out sign and mantissa
x += 0x7F700000; // overflows unless exponent is zero; MSB now indicates normalized
x >> 31; // sign-extend the MSB to all bits
f &= x; // flush denormals to zero