Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вещественные числа

42K
02 ноября 2010 года
Selja
22 / / 10.11.2009
Недавно решил разобраться с вещественными числами. Сначала обрадовался, легко и просто, но потом впал в ступор и по сей час не могу понять, что, да как. Вобщем, суть вопроса вот в чем:

float = 4byte = 32 bit
31ой бит – для знака
23 – 30 – для степени
0 – 22 – для мантиссы

При этом, все ясно кроме одного, зачем нужны 8 бит для степени?
Если я верно понимаю, то реальное число может быть только в приделах 2^24 т.к. мантисса = 24 бита – 23 +1, который не записывают. Тогда представление числа 2^24 получается легко:
2^24 = 16777215 = 11111111 11111111 11111111
В нормализованном виде это будет смотреться так:
01001011 01111111 11111111 11111111

0 = +
10010110 = 150
150 – 127 = 23
М = 1, 1111111 11111111 11111111

сдвигая запятую на 23 разряда, получаем наше число:
11111111 11111111 11111111 = 16777215

А если число скажем 10 234 567 789 то в мантиссу войдут только 24 старших разряда числа 10 234 567 789, остальные будут рассматриваться как нули, итог – огромная потеря точности. Вопрос, зачем тогда это нужно?

Можно например добавить мантиссе один битик, сняв с показателя степени , тесть, отводить под мантиссу 25 битов, а под показатель степени 7, или 24 и 6. Число без искажений было бы больше.
Вобщем, надеюсь что понятно объяснил что меня волнует. Прошу разъяснить и не ругать :)
349
04 ноября 2010 года
Phantom-84
656 / / 27.10.2005
Степень нужна, чтобы охватить больший диапазон чисел, включая те, что стремятся к нулю. Естественно, чем больше диапазон, тем больше шаг. Суть в том, чтобы иметь максимальный шаг на краях диапазона, но зато минимальный при приближении к нулю.
42K
06 ноября 2010 года
Selja
22 / / 10.11.2009
Был бы очень признателен, если бы вы объяснили более подробно, что, как и зачем. Мои мысли приведённые выше верны?
349
06 ноября 2010 года
Phantom-84
656 / / 27.10.2005
Нет, хотя я особо не вникал в ваши выкладки. Степень может находиться в значительно большем диапазоне. Если я не ошибся, то степень n по коду степени p можно вычислить по формуле n=p-2^(i-1)+2. С учетом того, что коды 0 и 255 не используются для кодирования степени, получаем диапазон степеней -125...128.
42K
06 ноября 2010 года
Selja
22 / / 10.11.2009
Это понятно, суть вопроса в том, можно ли получить точное число, скажем – 10 234 567 789, оно входит в диапазон значений флоат, но представить его не получится. Нельзя же из 32 битов памяти составить число, превышающие 2^32, до единиц точное. А если нельзя, то зачем это нужно.
260
06 ноября 2010 года
Ramon
1.1K / / 16.08.2003
На то оно и арифметика с плавающей запятой.
Зачем? Чтобы считать с определенной точностью.
349
06 ноября 2010 года
Phantom-84
656 / / 27.10.2005
Без вычислений трудно сказать, с какой погрешностью представимо это число. Вполне возможно, что десятки или даже сотни единиц. А для чего все это нужно, я уже говорил. Чтобы охватить большой диапазон чисел. При вычислениях с этим числом или другими числами подобного порядка лучше иметь погрешность в сотни единиц, чем многократное переполнение или насыщение на значительно меньшем диапазоне представления чисел. Повторяю, что при приближении к нулю погрешность представления чисел будет существенно уменьшаться.
42K
07 ноября 2010 года
Selja
22 / / 10.11.2009
Спасибо
42K
07 ноября 2010 года
Selja
22 / / 10.11.2009
Извините за дотошность, просто мучает меня это дело. Я тут с помощью Windows калькулятора посчитал некоторые числа:
1001100010000001110001110001101101 - 10 234 567 789 погрешность 109
1001100010000001110001110000000000 - 10 234 567 680

111111111111111111111111111111111111111111 - 4 398 046 511 103 погрешность 262 143
111111111111111111111111000000000000000000 - 4 398 046 248 960

11111111111111111111111111111111111111111111111111 - 1 125 899 906 842 623 погрешность 67 108 863
11111111111111111111111100000000000000000000000000 - 1 125 899 839 733 760

Если при 1 125 899 906 842 623 отклонение составляет 67 108 863, то при 3,4×E+38 она будет намного больше. А если такой формат существует, то где-то его и используют. Мне бы было очень интересно узнать для каких целей это подходит, сам додуматься не смог. Разве что для определения неких границ, для которых максимальная точность не критична, или для сравнения. Ещё раз извиняюсь за настойчивость.
349
07 ноября 2010 года
Phantom-84
656 / / 27.10.2005
Округли исходное число в большую сторону. Получишь погрешность, равную единице.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог