2013-09-20 4 views
2
#include <stdio.h> 

int main() { 
    float a = 0.7; 
    int c; 
    c = a < 0.7; 
    printf("%d", c); 
} 

Выходной результат 1, хотя он печатает 0 для всех случаев, за исключением 0,7,7,7 и 0,9, почему это так ??? Кроме того, оно должно быть равно 0, так как приоритет оператора «<» больше, чем «=» операторКакая разница в выходе для значений float?

+10

Я думаю, что это время снова. Обязательная ссылка: [Что должен знать каждый компьютерный ученый о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – ppeterka

+0

@ ppeterka66 Таким образом, 0.7 <0.7 должен быть правдой? Я не трогал C в течение многих лет, но это одно смешное поведение. –

+0

Вы пишете 0.7, но он может хранить только 0,699999 или 0,7000001 в поплавке. Потому что он не может быть точно представлен. –

ответ

13

0,7 не может быть представлено так же, как значение float, поэтому a сохраняет некоторое приближение к ней. Здесь получается, что буква 0.7 имеет тип double, поэтому для его представления используется более точная аппроксимация 0,7. Это приближение может отличаться от менее точного в любом направлении.

Для исправления используйте переменную double или float литерал 0.7f.

+1

+1 Так легко упустить ... Так много боли вызвало ... – ppeterka

0

В основном вы имеете дело с тем, что 0.1 является повторяющимся десятичным числом в двоичном формате. Так что вещи, которые выглядят красивыми и чистыми, как литералы (то есть 0.7) не могут быть представлены точно. В сочетании с этим вы смешиваете типы, поскольку буква 0.7 - это double.

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