printf и FLT_MAX 2
От: Muffinman Польша  
Дата: 21.02.04 02:59
Оценка:
Обещанный второй вопрос.

Первый — здесь:

http://rsdn.ru/Forum/?mid=546589

--
ПК

FLT_MAX из limits.h большооооооой... Но если вместо нулей после "." в нем дать какие-нибудь цифры то придется чуть ли не в три раза уменьшить это число, чтобы цифры эти не округлялись до нуля.

Ведь это число представляемо в формате p*(base^y), где p — число, состоящее из максимум 24 цифр, a base = 2 (если верить моему float.h и если я все правильно понимаю).

То есть представить целое число как нечто помноженное на степень двойки проще чем дробное? Всегда, во всех случаях? Или это все как-то хитрее?

Ну я понимаю если бы base было равно 10, а FLT_MAX тогда было бы равно 9999.... тогда ясно — любое целое представимо как целое*(10^y) например и тогда понятно почему для
представления дробных нам нужно как бы "больше места" и почему большее
целое "влазит" в float, а если мы это целое сделаем дробным то уже не
факт что оно влезет... То есть проблема будет скажем если число содержит столько же "целых" знаков сколько FLT_MAX и один "дробный". Или два "дробных" — тогда проблема будет и если "целых" знаков на один меньше... И т.д.

Но ведь тут мы имеем умножение на степень двойки а не десятки! Почему же тогда целые цифры рядом FLT_MAX (снизу) отображаются так как должны, а вот дробные должны быть уже ГОРАЗДО меньше FLT_MAX...

FLT_MAX — 1112.1 выходит равно:

340282346638528859811704183484516925440.000000
3.402823e+38

То есть столько же сколько FLT_MAX.

Причем не только в печати в вычислениях также:

Нечто такое:
float min = FLT_MIN;
float max = FLT_MAX;
float max_sub = FLT_MAX — 1112.1;

float testing = max_sub — FLT_MAX;
float testing2 = max — FLT_MAX;

printf("%f\n", testing);
printf("%f\n", testing2);

Два раза напечатает ноль...

Вопросы:
1. Правильно ли я вовсе понимаю, что FLT_MAX — это наибольшее дробное число типа float, числа до которого можно вместить в float независимо от кол-ва знаков после запятой (до какого-то предела конечно). Или это сложнее? А если сложнее то как?
2. Почему целые числа поменьше FLT_MAX в типе float отображаются без проблем, а вот чтобы отобразить дробные нужно уже в три (точно не помню во сколько, но в много) раз уменьшить FLT_MAX... Что такое тогда FLT_MAX и что все это значит?

Спасибо!
Sergei
Re: printf и FLT_MAX 2
От: LaptevVV Россия  
Дата: 21.02.04 10:25
Оценка:
Здравствуйте, Muffinman, Вы писали:

M>Вопросы:

M>1. Правильно ли я вовсе понимаю, что FLT_MAX — это наибольшее дробное число типа float, числа до которого можно вместить в float независимо от кол-ва знаков после запятой (до какого-то предела конечно). Или это сложнее? А если сложнее то как?
M>2. Почему целые числа поменьше FLT_MAX в типе float отображаются без проблем, а вот чтобы отобразить дробные нужно уже в три (точно не помню во сколько, но в много) раз уменьшить FLT_MAX... Что такое тогда FLT_MAX и что все это значит?

Проблема в размере мантиссы. Для float длина мантиссы, если мне не изменяет память — 23или 24 разряда.А размер порядка 8 бит. Соответственно получается, что значащих ДЕСЯТИЧНЫХ цифр значитеольно меньше, чем 38.
long Double позволяет 19-20 десятичных значащих цифр иметь. Если надо больше — надо прогшраммировать класс для работы с длинными числами.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: printf и FLT_MAX 2
От: Muffinman Польша  
Дата: 21.02.04 17:52
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Muffinman, Вы писали:


M>>Вопросы:

M>>1. Правильно ли я вовсе понимаю, что FLT_MAX — это наибольшее дробное число типа float, числа до которого можно вместить в float независимо от кол-ва знаков после запятой (до какого-то предела конечно). Или это сложнее? А если сложнее то как?
M>>2. Почему целые числа поменьше FLT_MAX в типе float отображаются без проблем, а вот чтобы отобразить дробные нужно уже в три (точно не помню во сколько, но в много) раз уменьшить FLT_MAX... Что такое тогда FLT_MAX и что все это значит?

LVV>Проблема в размере мантиссы. Для float длина мантиссы, если мне не изменяет память — 23или 24 разряда.А размер порядка 8 бит. Соответственно получается, что значащих ДЕСЯТИЧНЫХ цифр значитеольно меньше, чем 38.

А почему FLT_MAX такой большой? Что эта констатнта вообще значит? Получается, что в тип float влазит огромное число, если только оно целое. Так должно быть? Я просто чего-то не понимаю и нужно еще почитать о floating-point числах? Или где-то допускаю фатальную ошибку?

LVV>long Double позволяет 19-20 десятичных значащих цифр иметь. Если надо больше — надо прогшраммировать класс для работы с длинными числами.

Тоже — напечатав LDBL_MAX то увидит... мм... очень большое число. Но такие большие числа влазят в этот тип только если они целые. хотя бы один знак после запятой и — надо уже очень сильно это число уменьшать...

Что вззаправду значат константы из float.h для действительных чисел? И потом — они же signed. То есть в float влазит от -FLT_MAX до FLT_MAX? Или все иначе?

Простите за может глупые вопросы, я искал об этом в нете, нашел например нечто такое:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
с чем и ознакомился поверхностно, но вопросы о float.h все равно остались
Sergei
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.