Проблема сравнения float

yah
Offline
Зарегистрирован: 09.11.2013
01void setup()
02{
03 Serial.begin(9600);
04 
05    float azimuth = 0;
06    float course = 180;
07     
08    float a = sin((azimuth - course)*PI/180.0);
09    Serial.print(a); Serial.print(" - ");
10    Serial.print(azimuth); Serial.print("/"); Serial.print(course);
11    Serial.print(" - ");
12    
13     if (azimuth == course){
14       Serial.println("m");
15     } else if (a <= 0.0){
16      Serial.println("r");
17     }else{
18      Serial.println("l");
19     }
20  
21   
22}
23  
24void loop() {}

Должно выдавать "r" а выдает "l". В чем дело?

maksim
Offline
Зарегистрирован: 12.02.2012

И не должно, и не обязано...

01void setup()
02{
03  Serial.begin(9600);
04 
05  float azimuth = 0;
06  float course = 180;
07 
08  float a = sin((azimuth - course)*PI/180.0);
09  Serial.print(a, 10);
10  Serial.print(" - ");
11  Serial.print(azimuth, 10);
12  Serial.print("/");
13  Serial.print(course, 10);
14  Serial.print(" - ");
15 
16  if (azimuth == course){
17    Serial.println("m");
18  }
19  else if (a <= 0.0){
20    Serial.println("r");
21  }
22  else{
23    Serial.println("l");
24  }
25}
26 
27void loop() {}

 

yah
Offline
Зарегистрирован: 09.11.2013

непонимаю ,что особого изменилось

maksim
Offline
Зарегистрирован: 12.02.2012

Ну так а вы код то залили? посмотрели что в монитор выводит??? Если нет, то можете дальше не понимать...

yah
Offline
Зарегистрирован: 09.11.2013

maksim пишет:

Ну так а вы код то залили? посмотрели что в монитор выводит??? Если нет, то можете дальше не понимать...

 

залили посмотрели, не дураки как никак. В монитор выводит все тоже

10.00 - 0.00/180.00 - l

только нулей больше

maksim
Offline
Зарегистрирован: 12.02.2012

Ну раз не дураки залейте еще раз, и заливайте до тех пор пока не получите это:

0.0000000874 - 0.0000000000/180.0000000000 - l

А после подумайте почему 0.0000000874 не равно и не меньше нуля.

maksim
Offline
Зарегистрирован: 12.02.2012

 

19else if (a <= 0.0000001){

 

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Я думаю вам нужно диапазон значений указывать при сравнении - потому что float может никогда не быть равно другому float - потому что у него есть небольшой допуск(разброс) у аппаратной части есть шаг дискретизации.

ites
Offline
Зарегистрирован: 26.12.2013
1if (azimuth == course)

для float значений должно записываться как

1if (abs(azimuth - course) < 0.000001)

где 0.000001 -- желаемая точность сравнения, допустимая погрешность.