我有一个问题,PLC (可编程逻辑控制器),它不处理非规范化浮点。
下面是我从PLC的oposite端从控制器收到的数字的几个十六进制表示: 0x00004180,0x0000C180,0x00006FA0
有谁愿意分享一个小型代码示例(C++/C#或类似代码),说明如何将类似于上述值的值按位规范化?我不能对数字使用任何浮动操作,因为它们在PLC中不被识别,因此只有HEX/BIN操作。
精确性不是问题。
发布于 2015-09-23 19:38:45
作为问题评论的后续,如果您想使用不动点算法:
非正态化小于2^{-126},且分数部分没有隐式集合前导位,因此基本上一个非规范化浮点数是0.0.mantissa* 2^{-126}
您可以在int32_t中获取掩码,然后使浮点值等于int_val * 2^{-126 - 23} = int_val * 2^{-149}。数字23是因为binary32格式有23位尾数。当然,您可以将整数值和指数值存储在不同的变量中。
发布于 2015-09-26 19:08:01
如果您有符号扩展的位移位,那么一种简单的、无分支的将取消正态数到零的方法如下(其中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 zerohttps://stackoverflow.com/questions/32747413
复制相似问题