Не могу понять, почему этот код работает, но это не

Я сделал простой скетч на аурдуино, у меня есть этот код, и он не работает:

#define voltageInput A0
int qntR;
float mr;
float qr;
float Distanza;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(voltageInput,INPUT);
  mr=(130-20)/float(1023-205);
  qr=20-mr*205;
  Serial.print(mr,4);
}

void loop() {
  // put your main code here, to run repeatedly:
  qntR=analogRead(voltageInput);
  Distanza=mr*qntR+qr;
  Serial.print("Distanza: ");
  Serial.print(Distanza);
  Serial.print(" cm");
  Serial.println("");
}

И у меня есть этот код:

#define voltageInput A0
int qntR;
float mr;
float qr;
float Distanza;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(voltageInput,INPUT);
  mr=(130-20)/(1023-205);
  qr=20-mr*205;
  Serial.print(mr,4);
}

void loop() {
  // put your main code here, to run repeatedly:
  qntR=analogRead(voltageInput);
  Distanza=mr*qntR+qr;
  Serial.print("Distanza: ");
  Serial.print(Distanza);
  Serial.print(" cm");
  Serial.println("");
}

В котором я удалил float из mr=(130-20)/float(1023-205);, и если я удалю float, код остановится работает (mr всегда равен 0), почему?

, 👍0

Обсуждение

Что это не работает? Пожалуйста, включите последовательный вывод, @Sim Son

он говорит, что mr всегда равен 0, @user12258338


1 ответ


Лучший ответ:

3

Ваша проблема в том, что вы занимаетесь целочисленными вычислениями.

mr = (130-20)/(1023-205)

уменьшается до:

mr = 110/818

Что обычно соответствует:

mr = 0.135

Но поскольку все эти числа являются целыми числами, результат является целым числом и усекается до десятичной точки, что означает, что присваивается mr:

mr = 0

Вы можете принудительно использовать математику с плавающей запятой, включив десятичную точку в одно из чисел или добавив суффикс f:

mr = (130-20)/(1023-205.0)

или

mr = (130-20)/(1023-205f)

Или привести часть суммы к типу с плавающей запятой, как это делает другой ваш код.

,

но почему, я уже говорил, что mr — переменная с плавающей запятой, @user12258338

Поскольку у вас есть только числа, вычисления выполняет препроцессор, а не компилятор. Компилятор просто получает число 0., @Majenko

так что, если я делаю математику с целыми числами, препроцессор усекает число в целое число?, @user12258338

Если у вас есть только буквальные числа, да., @Majenko

Выражение (130-20)/(1023-205) содержит только целые числа, поэтому оно оценивается в целочисленной арифметике и преобразуется в число с плавающей запятой только для того, чтобы сделать возможным присваивание mr. В этом случае компилятор оценил его, поскольку все константы известны во время компиляции, но он получил бы тот же результат, если бы некоторые элементы были целочисленными переменными и должны были оцениваться во время выполнения., @JRobert

@Majenko большое спасибо!, @user12258338

@JRobert большое спасибо!, @user12258338