c - 求将 16 位无符号整数转换为 double 的函数的逆函数

标签 c integer double type-conversion 16-bit

我有一个函数,它接受 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 位值只能表示有限数量的值,因此我想反函数需要找到可以表示的最接近的 double,然后执行反转换。

有什么简单的方法可以做到这一点吗?

该函数是用 C 编写的,但我将用 Python 实现它。

最佳答案

这是一些验证评论中提出的公式的代码。

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')

关于c - 求将 16 位无符号整数转换为 double 的函数的逆函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39951457/

相关文章:

c - 在 C (linux) 中使用 popen 时出现权限问题

C 函数跳过 do while 循环中的 if 语句并仅执行最后一个 if 语句,但在第二个相同函数中不执行

android - 如何将 R.java 中的 int 值转换为 String

swift - 获取超过 15 位小数的 Swift

java - Android 的浮点到 double 转换

c - C 中的 UDP : Losing first byte when sending data

php - MySQL 如何检查字段中的值是整数还是文本

c中二维数组中整数的连续间隔输入

.net - Decimal.ToDouble Vs CType(x, Double) 什么是推荐/首选

c++ - 为什么用nar-maven编译静态库时要加compiler option/MD?