2016-10-10 11 views
-1

16 비트 부호없는 정수 값을 취하여이를 double로 변환하는 함수가 있습니다. 데이터는 온도 센서 (MCP9808)에서 가져오고이 함수는 섭씨 온도로 변환합니다.16 비트 부호없는 정수를 double로 변환하는 함수의 역함을 찾기

double convert_tempc(uint16_t data) { 
    double temp = data & 0x0FFF; 
    temp /= 16.0; 
    if (data & 0x1000) temp -= 256; 
    return temp; 
} 

내 질문은, 어떻게 이러한 일련의 동작의 역을 수행 할 수있다 : 다음과 같이

기능은 정의?

이 센서로 생성 된 16 비트 값을 찾기 위해 주어진 온도를 섭씨로 나타내는 함수가 필요합니다.

16 비트 값은 한정된 수의 값만 나타낼 수 있기 때문에 역함수를 표현할 수있는 가장 가까운 double을 찾아서 역변환해야한다고 생각합니다.

이 작업을 수행하는 간단한 방법이 있습니까?

이 함수는 C로 작성되었지만 파이썬으로 구현할 예정입니다.

+0

"이 함수는 C로 작성되었지만 파이썬으로 구현할 것입니다." 글쎄, 행운을 빈다. 그런 다음 그렇게해라. 그리고 만약 당신이 그것에 특별한 문제가 있다면 다시 물어 보라. 16 비트 정수는 여전히 정수이며 최대 값이 제한되어 있습니다. 질문이 뭐야? – MisterMiyagi

+0

함수를 파이썬으로 변환하는 것에 대해 묻지 않고 있습니다. 기능상의 역행렬을 수행하는 일련의 연산을 찾는 것에 대해 묻고 있습니다 (두 배를 취하고, uint16_t를 내뱉습니다). 나는 파이썬으로 c를 변환하는 것에 대해 걱정하지 않는다. – marco

+0

연산자를 바꾸는 것을 의미합니까? '- ='는'+ ='에 대응하고,'/ ='는'* ='에 대응합니다; 비트 연산은 범위를 검사하지만 손실이 많은 방식이므로 정확한 결과를 얻을 수 없습니다. 기본적으로 연산자를 다른 방법으로 적용하면됩니다. 'int (temp * 16) & 0xFFFF'가해야합니다. – MisterMiyagi

답변

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