Не могу понять, почему этот код работает, но это не
Я сделал простой скетч на аурдуино, у меня есть этот код, и он не работает:
#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), почему?
@user12258338, 👍0
Обсуждение1 ответ
Лучший ответ:
Ваша проблема в том, что вы занимаетесь целочисленными вычислениями.
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
- Float печатается только 2 десятичных знака после запятой
- Отправка и получение различных типов данных через I2C в Arduino
- Избегайте математических вычислений с плавающей запятой, чтобы ускорить Arduino
- Хранение значений широты и долготы в виде символов с заданной точностью
- Умножение с плавающей запятой Возвращает ovf или -0,0 для небольших целых чисел с плавающей запятой.
- Преобразование Float в int не работает прямо в методе с использованием varargs
- Создть число с плавающей запятой, используя целые числа
- Справка по коду в Arduino (последовательные данные)
Что это не работает? Пожалуйста, включите последовательный вывод, @Sim Son
он говорит, что mr всегда равен 0, @user12258338