Неверные результаты при делении
- Войдите на сайт для отправки комментариев
Вс, 28/09/2014 - 10:16
Здравствуйте. Подскажите, пожалуйста, где я прокололся?
Использую Arduino Uno R3, LCD HD44780
Arduino неправильно все считает!
Есть обычный пример:
double Hotangle=45.0,ColdAngle=45.0;
if(Ratio<1.00)
{
ColdAngle=HotAngle * Ratio;
lcd.clear();
lcd.print(HotAngle);
lcd.setCursor(7, 0);
lcd.print(Ratio);
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ratio=");
lcd.setCursor(6, 0);
lcd.setCursor(11, 0);
lcd.print(HotAngle);
lcd.setCursor(0, 1);
lcd.print(ColdAngle);
Serial.println(ColdAngle);
}
Так вот, Ratio выше вычисляется и равняется 0.67 (и на дисплей и в монитор выводится как результат 0.67, проверял на калькуляторе) Должно быть 45*0,67 = 30.15, у меня же все время выходит результат 30.00. Если я напишу: ColdAngle=HotAngle * 0.67 то результат получается как раз 30.15, но при выводе значения на дисплей Ratio и так равняется 0.67. К тому же, если я запишу вот так:
if(Ratio<1.00)
{
Ratio=0.67;
ColdAngle=HotAngle * Ratio;
lcd.print(Ratio);
}
то результат будет равен тоже 30.15. Но опять же Ratio и так уже равно 0.67.
Подскажите, пожалуйста, в чем может быть проблема.
Прошу прощения, всю ночь не спал:
"Неверные результаты при умножении"
Фокусы компилятора, оно считает, что Ratio имеет тип int. Объявите в начале Ratio явным образом, или напишите в ифе Ratio <1.01
double Ratio=0.0;
Вычисление Ratio:
Ratio=(60-40)/(40-10);
Ratio=0.67;
ColdAngle=HotAngle * Ratio;
ColdAngle=45*0.67=30.15
Но у меня по прежнему результат равен 30.00, даже после изменения условия на 1.01
Весь код покажите.
#include <IRremote.h> #include <LiquidCrystal.h> #include <Servo.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int RECV_PIN = 7; IRrecv irrecv(RECV_PIN); int res=-1,x=0; float HotTemp=60.0,ColdTemp=10.0,HotAngle=45.0,ColdAngle=45.0; int OutTemp=0; double Ratio=0.0; String param=""; //Servo myservo; decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver pinMode(9, OUTPUT); analogWrite(9, 50); lcd.begin(16, 2); //myservo.attach(10); lcd.print("Vvedite Temp"); } void loop() { delay(700); if (irrecv.decode(&results)) { if(results.value>100) results.value-=2048; res=results.value; if(res!=24) { param+=res; lcd.setCursor(0, 1); lcd.print(param); } else { if(param.toInt()>HotTemp) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Temp must be<Ht"); param=""; delay(2000); lcd.clear(); lcd.print("Vvedite Temp"); } else { OutTemp=param.toInt(); Ratio=(HotTemp-OutTemp)/(OutTemp-ColdTemp); lcd.clear(); lcd.print("Ratio="); lcd.setCursor(6, 0); lcd.print(Ratio); x=1; Serial.println(Ratio); delay(2000); } } if(x==1) { if(Ratio>1.00) { HotAngle=ColdAngle / Ratio; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ratio="); lcd.setCursor(6, 0); lcd.print(Ratio); lcd.setCursor(11, 0); lcd.print(HotAngle); lcd.setCursor(0, 1); lcd.print(ColdAngle); Serial.println(HotAngle); x=2; } if(Ratio<1.00) { ColdAngle=HotAngle * Ratio; lcd.clear(); lcd.print(HotAngle); lcd.setCursor(7, 0); lcd.print(Ratio); delay(2000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ratio="); lcd.setCursor(6, 0); lcd.print(Ratio); lcd.setCursor(11, 0); lcd.print(HotAngle); lcd.setCursor(0, 1); lcd.print(ColdAngle); x=2; } } if(results.value==19) { lcd.clear(); lcd.setCursor(0, 0); } } irrecv.resume(); }Ввожу постоянно значение 40.
Ratio=(60-40)/(40-10)=20/30=0.67
Во всех выводах значения переменной (lcd.print, Serial.println) Ratio = 0.67 Тоесть считает правильно, но при операции: ColdAngle=HotAngle * Ratio; почему то расчет идет не верный, хотя при выводе значения каждой переменной, результат верный.
Может стоит попробовать тип данных float ? Может его компилятор нормально обрабатывает.
вычисления принудительно проводя с типом float
Может стоит попробовать тип данных float ? Может его компилятор нормально обрабатывает.
вычисления принудительно проводя с типом float
Объявил все как float, результат тот же
Как такое вообще может быть?) Уже голова лопается, весь день на это потратил и не могу понять в чем проблема. Если ввожу вместо сорока - 44, то уравнение приобретает вид: Ratio=(60-44)/(44-10)=16/34=0.47
0.47 считает правильно, но опять при вычислении ColdAngle=HotAngle * Ratio; (ColdAngle=45*0.47) ошибка в результате: ответ по факту 21.15, ответ в переменной: 21.18
надо будет написать прогу калькулятор для проверки. Еще не проверял как микроконтроллер работает с дробными значениями.
Создал новый скетч для проверки и записал все следующим образом:
Тут все тоже самое. Ratio=30.00
Что делать?
Если изменить вывод на
то что покажет?
Если изменить вывод на
то что покажет?
http://www.cyberforum.ru/cpp-beginners/thread63109.html ?
Так чем все закончилось ?
Хотите чтобы умножалось округленное число, так округлите его сначала как положено до нужного числа знаков.
Убийца - мосфет, ну или ДОСААФ. Мы все прекрасно знаем что даже взрослые процессоры с длинными цифрами после запятой имеет определенные трудности. Кто не верит - в гугль.