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

yah
Offline
Зарегистрирован: 09.11.2013
void setup() 
{ 
 Serial.begin(9600);

    float azimuth = 0;
    float course = 180;
    
    float a = sin((azimuth - course)*PI/180.0);
    Serial.print(a); Serial.print(" - ");
    Serial.print(azimuth); Serial.print("/"); Serial.print(course);
    Serial.print(" - ");
   
     if (azimuth == course){
       Serial.println("m");
     } else if (a <= 0.0){
      Serial.println("r");
     }else{
      Serial.println("l");
     }
 
  
} 
 
void loop() {}

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

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

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

void setup() 
{ 
  Serial.begin(9600);

  float azimuth = 0;
  float course = 180;

  float a = sin((azimuth - course)*PI/180.0);
  Serial.print(a, 10); 
  Serial.print(" - ");
  Serial.print(azimuth, 10); 
  Serial.print("/"); 
  Serial.print(course, 10); 
  Serial.print(" - ");

  if (azimuth == course){
    Serial.println("m");
  } 
  else if (a <= 0.0){
    Serial.println("r");
  }
  else{
    Serial.println("l");
  }
} 

void loop() {}

 

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

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

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

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

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

maksim пишет:

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

 

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

0.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

 

else if (a <= 0.0000001){

 

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

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

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

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

if (abs(azimuth - course) < 0.000001)

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