2015-05-12 2 views
-3

I'v врезался в другую аномалию:C++ возвращает 7.45058 вместо 0

float T = 19.0/99.0; 
float moo = (99.0 * T) - 19.0; 

, как и ожидалось, Т = 0,191919, однако «мычание» предназначается, чтобы быть 0, но вместо этого 7,450586. Я могу только предположить, что некоторая форма литья снова требуется где-то.

+0

Попробуйте использовать 'double' вместо' float'! Также хорошо читайте: [что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) –

+2

Я получаю 7.45058e-08, a очень маленький число. Вы, наверное, тоже. – molbdnilo

+2

Вы уверены, что это '7.450586', а не' 7.450586e-008' или какой-либо другой действительно небольшой экспонент? –

ответ

0

Измените свой код на это, и вы получите 0 на мычание

поплавок T = 19,0 ф/99,0 е; float moo = (99.0 f * T) - 19.0 f;

Также стоимость на moo без этого не равна 7.45, это 7.45058e-08, которая почти равна нулю.

+0

Я предполагаю, что это какая-то оптимизация компилятора. На идее я все еще получаю 7.45058e-08 – Vinzenz

+0

Я использую Apple LLVM 6.1 – exs

0

Поскольку любые числа с плавающей запятой представлены в дополнении дополнения 2 в C++, вы обычно получаете приблизительные значения при управлении значениями с плавающей запятой. Таким образом, 7.450586e-008 является точным поведением. Если вам нужна более высокая точность, используйте double.

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