вещественные числа
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. Число без искажений было бы больше.
Вобщем, надеюсь что понятно объяснил что меня волнует. Прошу разъяснить и не ругать :)
Степень нужна, чтобы охватить больший диапазон чисел, включая те, что стремятся к нулю. Естественно, чем больше диапазон, тем больше шаг. Суть в том, чтобы иметь максимальный шаг на краях диапазона, но зато минимальный при приближении к нулю.
Был бы очень признателен, если бы вы объяснили более подробно, что, как и зачем. Мои мысли приведённые выше верны?
Нет, хотя я особо не вникал в ваши выкладки. Степень может находиться в значительно большем диапазоне. Если я не ошибся, то степень n по коду степени p можно вычислить по формуле n=p-2^(i-1)+2. С учетом того, что коды 0 и 255 не используются для кодирования степени, получаем диапазон степеней -125...128.
Это понятно, суть вопроса в том, можно ли получить точное число, скажем – 10 234 567 789, оно входит в диапазон значений флоат, но представить его не получится. Нельзя же из 32 битов памяти составить число, превышающие 2^32, до единиц точное. А если нельзя, то зачем это нужно.
Зачем? Чтобы считать с определенной точностью.
Без вычислений трудно сказать, с какой погрешностью представимо это число. Вполне возможно, что десятки или даже сотни единиц. А для чего все это нужно, я уже говорил. Чтобы охватить большой диапазон чисел. При вычислениях с этим числом или другими числами подобного порядка лучше иметь погрешность в сотни единиц, чем многократное переполнение или насыщение на значительно меньшем диапазоне представления чисел. Повторяю, что при приближении к нулю погрешность представления чисел будет существенно уменьшаться.
Спасибо
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 она будет намного больше. А если такой формат существует, то где-то его и используют. Мне бы было очень интересно узнать для каких целей это подходит, сам додуматься не смог. Разве что для определения неких границ, для которых максимальная точность не критична, или для сравнения. Ещё раз извиняюсь за настойчивость.
Округли исходное число в большую сторону. Получишь погрешность, равную единице.