2017-01-09 7 views
-2

Я написал следующий код:C Программирование - Anomaly поведение в то время цикла для состояния поплавковой

#include <stdio.h> 

int main() 
{ 
    float x = 1.1; 
    printf("%s\n", "Hello!"); 
    while (x == 1.1) 
    { 
    printf("%s\n", "Hey there!"); 
    printf("%f\n", x); 
    x = x - 0.1; 
    } 
    printf("%s\n", "Bye!"); 
    return 0; 
} 

Однако выход был (который я предполагаю, что не ожидал):

[email protected]:/mnt/d/Codes/LetUsC$ gcc C04Ag.c 
[email protected]:/mnt/d/Codes/LetUsC$ ./a.out 
Hello! 
Bye! 

Чтобы проверить, он принимает условие плавания или нет, я написал этот код:

#include <stdio.h> 

int main() 
{ 
    float x = 1.1; 
    printf("%s\n", "Hello!"); 
    while (x >= 1.0) 
    { 
    printf("%s\n", "Hey there!"); 
    printf("%f\n", x); 
    x = x - 0.1; 
    } 
    printf("%s\n", "Bye!"); 
    return 0; 
} 

И я получил результат, как я ожидал.

[email protected]:/mnt/d/Codes/LetUsC$ gcc C04Ag.c 
[email protected]:/mnt/d/Codes/LetUsC$ ./a.out 
Hello! 
Hey there! 
1.100000 
Hey there! 
1.000000 
Bye! 

Итак, мой вопрос, , что я делаю неправильно в первом коде?

UPDTATE: Только что выяснил, как исправить эту ошибку. Добавив условие то время как, как это: while (x == 1.1f)

+1

@kaylum: Спасибо! Просто понял, что случилось. Просто добавили условие, подобное этому: 'while (x == 1.1f)' – aps120797

+2

ну, нет. проблема заключается в сравнении значений с плавающей запятой для равенства. поплавки всегда приблизительны, поэтому проверки равенства часто терпят неудачу. – Jasen

ответ

1

1.1 не является значением float, это значение double.

Когда вы пишете float x = 1.1;, компилятор вводит неявный листинг: float x = (float)1.1;.

Когда вы пишете x == 1.1, компилятор вставляет другой неявный листинг: (double)x == 1.1.

Итак, вы действительно проверяете, является ли значение 1.1 по-прежнему одинаковым после литья его до float и обратно до double - то есть верно ли (double)(float)1.1 == 1.1.

(double)(float)1.1 == 1.1 не является истинным из-за ошибки округления с плавающей точкой. По крайней мере, на моей платформе:

  • 1.1 фактически 1.100000000000000088817841970012523233890533447265625
  • (double)(float)1.1 фактически 1.10000002384185791015625

и как вы можете видеть, что эти два числа не совпадают.

+0

Спасибо! Просто понял, что случилось. Просто добавили условие следующим образом: 'while (x == 1.1f)' – aps120797

 Смежные вопросы

  • Нет связанных вопросов^_^