GCC дает неверный ответ с включенной оптимизацией - PullRequest
5 голосов
/ 28 декабря 2010

У меня есть следующая программа на C

double d = 1.4;
int x;
x = d * 10;
printf("\n\n VALUE = %d " ,x);

У меня есть gcc 4.3.3, который поставляется с Ubuntu 9.04

Я получаю ответ как 13 с -O0, но получаю правильный ответ, т.е. 14 с более высоким уровнем оптимизации

Это известная проблема или что-то не так с моим кодом?

Ответы [ 4 ]

9 голосов
/ 28 декабря 2010

Это gcc ошибка # 323 , на самом деле это не ошибка, а деталь реализации.

9 голосов
/ 28 декабря 2010

Вы не можете точно представить 1.4, используя double, значение на самом деле немного запаздывает или немного меньше (см. this ).Таким образом, нет «правильного» ответа - используйте round() вместо косвенного усечения.

4 голосов
/ 28 декабря 2010

При более высоких уровнях оптимизации GCC, вероятно, оптимизирует обе переменные и предварительно вычисляет значение для печати. При отсутствии оптимизации значение d (и, следовательно, значение печати) будет зависеть от представления с плавающей запятой и может не совпадать точно с 1.4. Попробуйте это:

double d = 1.4;
int x;
x = d * 10;
printf("Old = %lf, New = %d\n", d, x);
2 голосов
/ 28 декабря 2010

Что должен знать каждый компьютерный ученый об арифметике с плавающей точкой

Это действительно то, что написано в названии, и это также относится к программистам в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...