Проблема сравнения float
- Войдите на сайт для отправки комментариев
Ср, 08/01/2014 - 15:23
01 | void 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 | |
24 | void loop () {} |
Должно выдавать "r" а выдает "l". В чем дело?
И не должно, и не обязано...
01
void
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
27
void
loop
() {}
непонимаю ,что особого изменилось
Ну так а вы код то залили? посмотрели что в монитор выводит??? Если нет, то можете дальше не понимать...
Ну так а вы код то залили? посмотрели что в монитор выводит??? Если нет, то можете дальше не понимать...
залили посмотрели, не дураки как никак. В монитор выводит все тоже
1
0.00 - 0.00/180.00 - l
только нулей больше
Ну раз не дураки залейте еще раз, и заливайте до тех пор пока не получите это:
0.0000000874 - 0.0000000000/180.0000000000 - l
А после подумайте почему 0.0000000874 не равно и не меньше нуля.
19
else
if
(a <= 0.0000001){
Я думаю вам нужно диапазон значений указывать при сравнении - потому что float может никогда не быть равно другому float - потому что у него есть небольшой допуск(разброс) у аппаратной части есть шаг дискретизации.
1
if
(azimuth == course)
для float значений должно записываться как
1
if
(abs(azimuth - course) < 0.000001)
где 0.000001 -- желаемая точность сравнения, допустимая погрешность.