2015-01-04 2 views
2

Я пытаюсь сделать следующее разделение: 1/16777216, что равно 5.96046448e-8 , но это:Float в C++ меньший диапазон, чем IEEE 754

printf("number: %f \n", 1.0f/16777216.0f);  

ВСЕГДА дает мне 0.00000 вместо ответа я бы ожидать. Я искал диапазоны, потому что я хорошо подумал, что может быть проблемой, что плавать просто для того, чтобы смазать для обработки такого числа, но IEEE 754 заявляет, что это ±1.18×10−38.

Я что-то упустил, и почему результат не ожидаемый?

+2

ОП явно спрашивал о C++. Как в заголовке, так и в тегах. Не знаю, почему это было изменено на C. 'printf' является частью стандартной библиотеки C++. –

ответ

9

При использовании фиксированного форматирования (%f) вы получаете формат с десятичной точкой и до 6 цифр. Поскольку значение, которое вы использовали, округляется до значения меньше 0.000001, представляется целесообразным напечатать 0.000000. Вы можете использовать больше цифр (I думаю, используя %.10f, но я не так хорош в спецификаторах формата <stdio.h>), либо вы измените формат, чтобы использовать либо научную нотацию (%e), либо «лучше» обоих вариантов (%g).

+0

Это решило, спасибо. Я буду отмечать его как ответ, когда смогу (придется ждать 7 минут) – Nerethar

+1

«раунды до значения меньше 0,000000»: это не может быть прав! – TonyK

+1

@TonyK: да, вы правы: в конце должен быть '1'. Я исправлю эту небольшую проблему. –

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