我有一个函数,它接受一个16位无符号整数值并将其转换为double。数据来自温度传感器(MCP9808),该函数将其转换为摄氏度。
该功能定义如下:
double convert_tempc(uint16_t data) {
double temp = data & 0x0FFF;
temp /= 16.0;
if (data & 0x1000) temp -= 256;
return temp;
}
我的问题是,如何执行这一系列操作的反转?
我需要一个函数来查找此传感器产生的16位值,从而产生以摄氏度为单位的给定温度。
由于16位值只能表示有限数量的值,我想逆函数需要找到可以表示的最近的双精度,然后执行逆转换。
有没有简单的方法可以做到这一点?
该函数是用C语言编写的,但我将用Python实现它。
答案 0 :(得分:1)
以下是一些验证评论中提出的公式的代码。
def u16_to_float(data):
temp = data & 0x0FFF
temp /= 16.0
if data & 0x1000:
temp -= 256
return temp
def float_to_u16(temp):
return int(temp * 16) & 0x1FFF
# test
for data in range(0x2000):
temp = u16_to_float(data)
u = float_to_u16(temp)
assert u == data, (data, temp, u)
print('Ok')