Я получаю разные результаты при выполнении того, что, по моему мнению, является одним и тем же вычислением. Я предполагаю, что это проблема преобразования типов.C Арифметический разный вывод
Я вытягиваю значение температуры от hardware sensor via I2C
. datasheet
говорит уравнение для выполнения преобразования заключается в следующем:
(((14_bit_ADC_value)/16382) * 165) - 40)
значение АЦП два байта хранится в двух символов, а некоторые смещение должно произойти, чтобы получить 14 байт как таковой:
((((rawtemp[2] << 6) | (rawtemp[3] >> 2)/16382) * 165) - 40);
проблема:
- Если я нарушу эти операции она работает.
- Если я объединю их в одну строку, это не удастся.
Мой код:
#include <stdio.h>
int main()
{
char rawtemp[4];
rawtemp[2] = 0x61; //example captured value
rawtemp[3] = 0x40; //example captured value
//method 1
float test = 0;
test = (rawtemp[2] << 6) | (rawtemp[3] >> 2);
test = test/16382;
test = test * 165;
test = test - 40;
printf("test1: %f C\r\n", test); //This works.
//method 2
test = (((rawtemp[2] << 6) | (rawtemp[3] >> 2)/16382) * 165) - 40;
printf("test2: %f C\r\n", test); //This does not work.
return 0;
}
Выход:
$ ./k
test1: 22.688316 C
test2: 1024280.000000 C
Почему второй способ вывести значение температуры не получится?
Просто догадка, кто-то, вероятно, может дать лучший ответ и доказать это, но, возможно деление имеет преимущество по побитовому ИЛИ? Попробуйте добавить круглые скобки. ** РЕДАКТИРОВАТЬ **: см. Ниже комментарий (и). – Arc676
'/' является перегруженным оператором, поведение которого сильно отличается в зависимости от того, есть ли у вас целые числа или операнды с плавающей запятой. Убедитесь, что это не проблема. –
@UlrichEckhardt «перегруженный оператор» на языке программирования ** C **! Слово «перегрузка» не используется нигде в индексе K & R. – Jameson