Андрей Макронович предлагает Вам запомнить сайт «Космос»
Вы хотите запомнить сайт «Космос»?
Да Нет
×
Прогноз погоды

Без Космоса нет будущего!

Поиск по блогу

Запомнить
Читать

О сайте

Наглядное объяснение чисел с плавающей запятой

развернуть
image

В начале 90-х создание трёхмерного игрового движка означало, что вы заставите машину выполнять почти не свойственные ей задачи. Персональные компьютеры того времени предназначались для запуска текстовых процессоров и электронных таблиц, а не для 3D-вычислений со частотой 70 кадров в секунду. Серьёзным препятствием стало то, что, несмотря на свою мощь, ЦП не имел аппаратного устройства для вычислений с плавающей запятой. У программистов было только АЛУ, перемалывающее целые числа.



При написании книги Game Engine Black Book: Wolfenstein 3D я хотел наглядно показать, насколько был велики были проблемы при работе без плавающей запятой. Мои попытки разобраться в числах с плавающей запятой при помощи каноничных статей мозг воспринимал в штыки. Я начал искать другой способ. Что-нибудь, далёкое от (−1)S∗1.M∗2(E−127) и их загадочных экспонент с мантиссами. Может быть, в виде рисунка, потому что их мой мозг воспринимает проще.

В результате я написал эту статью и решил добавить её в книгу. Не буду утверждать, что это моё изобретение, но пока мне не приходилось видеть такого объяснения чисел с плавающей запятой. Надеюсь, статья поможет тем, у кого, как и меня, аллергия на математические обозначения.
Как обычно объясняют числа с плавающей запятой


Цитирую Дэвида Голдберта (David Goldbert):

Для многих людей арифметика с плавающей запятой кажется каким-то тайным знанием.


Полностью с ним согласен. Однако важно понимать принципы её работы, чтобы полностью осознать её полезность при программировании 3D-движка. В языке C значения с плавающей запятой — это 32-битные контейнеры, соответствующие стандарту IEEE 754. Они предназначены для хранения и выполнения операций над аппроксимациями вещественных чисел. Пока я видел только такое их объяснение. 32 бита разделены на три части:

  • S (1 бит) для хранения знака
  • E (8 бит) для экспоненты
  • M (23 бита) для мантиссы



Внутренности числа с плавающей запятой.


Три части числа с плавающей запятой.

Пока всё нормально. Пойдём дальше. Способ интерпретации чисел обычно объясняется с помощью такой формулы:

(−1)S∗1,M∗2(E−127)

Именно это объяснение чисел с плавающей запятой все ненавидят.


И здесь я обычно начинаю терять терпение. Возможно, у меня аллергия на математическую нотацию, но когда я это читаю, в моём мозгу ничего не «щёлкает». Такое объяснение похоже на способ рисования совы:

Наглядное объяснение чисел с плавающей запятой

Другой способ объяснения


Хоть это изложение и верно, такой способ объяснения чисел с плавающей запятой обычно не даёт нам никакого понимания. Я виню эту ужасную запись в том, что она разочаровала тысячи программистов, испугала их до такой степени, что они больше никогда не пытались понять, как же на самом деле работают вычисления с плавающей запятой. К счастью, их можно объяснить иначе. Воспринимайте экспоненту как окно (Window) или интервал между двумя последовательными степенями двух целых чисел. Мантиссу воспринимайте как смещение (Offset) в этом окне.


Три части числа с плавающей запятой.

Окно сообщает нам, между какими двумя последовательными степенями двойки будет число: [0,1], [1,2], [2,4], [4,8] и так далее (вплоть до [2127,2128]. Смещение разделяет окно на 223=8388608сегментов. С помощью окна и смещения можно аппроксимировать число. Окно — это отличный механизм защиты от выхода за границы. Достигнув максимума в окне (например, в [2,4]), можно «переплыть» вправо и представить число в пределах следующего окна (например, [4,8]). Ценой этого будет только небольшое снижение точности, потому что окно становится в два раза больше.

Викторина: сколько точности теряется, когда окно закрывает больший интервал? Давайте возьмём пример с окном [0,1], в котором 8388608 смещений накладываются на интервал размером 1, что даёт нам точность (1−0)8388608=0,00000011920929. В окне [2048,4096] 8388608 смещений накладываются на интервал (4096−2048)=2048, что даёт нам точность (4096−2048)8388608=0,0002.

На рисунке ниже показано, как кодируется число 6,1. Окно должно начинаться с 4 и заканчиваться следующей степенью двойки, т.е. 8. Смещение находится примерно посередине окна.

Значение 6,1 аппроксимированное с помощью числа с плавающей запятой.

Давайте возьмём ещё один пример с подробным вычислением представлением в виде числа с плавающей точкой хорошо известного всем нам значения: 3,14.

  • Число 3,14 положительно →S=0.
  • Число 3,14 находится между степенями двойки 2 и 4, то есть окно числа с плавающей запятой должно начинаться с 21 →E=128 (см. формулу, где окно — это 2(E−127)).
  • Наконец, есть 223 смещений, которыми можно выразить расположение 3,14 внутри интервала [2-4]. Оно находится в 3,14−24−2=0,57 внутри интервала, что даёт нам смещение M=223∗0,57=4781507


В двоичном виде это преобразуется в следующее:

  • S = 0 = 0b
  • E = 128 = 10000000b
  • M = 4781507 = 10010001111010111000011b



Двоичное представление с плавающей точной числа 3,14.

То есть значение 3,14 аппроксимируется как 3,1400001049041748046875.

Соответствующее значение в непонятной формуле:

3,14=(−1)0∗1,57∗2(128−127)

И, наконец, графическое представление с окном и смещением:


Окно и смещение числа 3,14.

Интересный факт: если модули операций с плавающей запятой были такими медленными, почему в языке C в результате использовали типы float и double? Ведь в машине, на которой изобретался язык (PDP-11), не было модуля операций с плавающей запятой! Дело в том, что производитель (DEC) пообещал Деннису Ритчи и Кену Томпсону, что в следующей модели он будет. Они были любителями астрономии и решили добавить в язык эти два типа.

Интересный факт: те, кому в 1991 году действительно нужен был аппаратный модуль операций с плавающей запятой, могли его купить. Единственными, кому он мог понадобиться в то время, были учёные (по крайней мере, так Intel понимала потребности рынка). На рынке они позиционировались как «математические сопроцессоры». Их производительность была средней, а цена огромной (200 долларов 1993 года — это 350 долларов в 2016 году.). В результате уровень продаж оказался посредственным.

Наглядное объяснение чисел с плавающей запятой



Надеюсь, статья была вам полезна!

Источник: https://habrahabr.ru/


Ключевые слова: Книги
Опубликовано 13.09.2017 в 15:31

Комментарии

Показать предыдущие комментарии (показано %s из %s)
Дмитрй Танцюра
Дмитрй Танцюра 14 сентября, в 09:31 спсб . Текст скрыт развернуть
0
Юрий В Радюшин
Юрий В Радюшин Дмитрй Танцюра 15 сентября, в 07:58 Не понятно о чём Вы ...? Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Юрий В Радюшин 15 сентября, в 08:53 вот : казнить нельзя помиловать ( оказавается логика имеет место математической формулы ,я не мог это раньше осознать хоть и живу по правилам аксиом ) в это словосочетания не только запятые вставить можно , а это это уже подобность совершенно другим свойствам .
ну приближается к ответу на другой вопрос : если физика это объём математики ,то какая следующая наука будет равная им по значению .
да и для подмены свойств пространства ,тут многое есть
Текст скрыт развернуть
0
Некто ВК
Некто ВК 15 сентября, в 11:45 Да, статья очень полезна, только не в том смысле, на который рассчитывал автор. Это, как говорится - не для средних умов. А поскольку к особо выдающимся дарованиям я себя не отношу, то мое отношение к таким озарениям следующее - не подходи к быку спереди, к лошади сзади, а к идиоту вообще. Может быть, для узких специалистов, работающих в этой области и чувствующих себя как рыба в воде, такое представление и имеет смысл, но на данном обсуждении, думаю, оно излишнее. Тем более, что автор не потрудился объяснить, что же, все-таки, такое - плавающая запятая и чем она отличается от плавающей точки (в математическом, конечно, смысле, а не в графическом). Текст скрыт развернуть
0
Показать новые комментарии
Комментарии с 21 по 24 | всего: 24
Комментарии Facebook
Блог
ВЫСШИЙ ЗАМЫСЕЛ
22 сен, 10:35
+4 1
Происхождение массы
22 сен, 06:13
+3 6
Альтернативно одаренная энергетика - или «Не смейтесь над обезьяной!»
17 сен, 07:06
+6 6
Эволюция наручных часов: чему их научили технологии
13 сен, 10:26
+4 0

Последние комментарии

Евгений Титаев
Кот Рыжый
Юрий В Радюшин
Да и хрен (простите за ботанику) с Вами! Считайте и высказывайте все что угодно...
Юрий В Радюшин Происхождение массы
Цу Кен
)) Он совсем историю не знает. Судя по всему, он вообще мало что знает.
Цу Кен Почему Пересвет победил Челубея
Евгений Титаев
Эдуард Тихомиров
Эдуард Тихомиров
дима кузнецов
псевдонаучный бред. Челубей много нового о себе узнал,однако
дима кузнецов Почему Пересвет победил Челубея
Grekwer 75
По моему человек писавший этот пост мало ,что знает об истории.
Grekwer 75 Почему Пересвет победил Челубея
Кот Рыжый
По крайней мере, КГБ содержала на довольствии святых отцов.
Кот Рыжый Почему Пересвет победил Челубея
Valery Pedan
"у церкви, феноменальная способность:" все священники - офицеры КГБ.
Valery Pedan Почему Пересвет победил Челубея
Алексей Черезов
Кот Рыжый
Евсей Спиридонов
Бред пятиклассника.
Евсей Спиридонов Почему Пересвет победил Челубея
Тимур Бикметов
Цу Кен
Некто ВК
Сергей
Воробей
Воробей
Юрий В Радюшин
Юрий В Радюшин
Юрий В Радюшин
Юрий В Радюшин
Анатолий Дмитриевич
флаг в руки!
Анатолий Дмитриевич Евросоюз отказался от российских ракет «Союз»
Воробей
Воробей
Фантастом дядька был.
Воробей Ликвидаторы миров: что думал Константин Циолковский о будущем человечества
Некто ВК
Не хотелось бы Землю пачкать этим г...
Некто ВК Конспирологическое: FEMA готовится к Апокалипсису 27 сентября.
Некто ВК
Александр Самсонов
Движущаяся пустота приобретает массу. Занимательно.
Александр Самсонов Происхождение массы
Эдуард Тихомиров
Юрий В Радюшин
Не, не надо путать войну с комп. игрушкой!
Юрий В Радюшин Конспирологическое: FEMA готовится к Апокалипсису 27 сентября.
Анатолий Никитин
Юрий В Радюшин
Юрий В Радюшин
Максот Битанов
Ирина Абрамова (Калганова)
Некто ВК
Юрий В Радюшин
Причем с умным видом собирая инвесторов и бабкм рт них!
Юрий В Радюшин Приземление Илона Маска
Юрий В Радюшин
Валерий Акинин
Получается, что я был прав. Что-то объяснять Вам нет смысла...
Валерий Акинин Приземление Илона Маска
Некто ВК
Некто ВК
Владимир Барышев
Юрий Трифонов
Юрий Трифонов
Валерий Акинин
Некто ВК
Александр Зиборов
Владимир Сахелашвили