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

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

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

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

О сайте

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

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

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

Владислав Малиновский
Лариса Михайлова
Юрий В Радюшин
Тимур Бикметов
Анатолий Никитин
так
очень интересно.... БЛАГОДАРЮ.
так МИГи в магии вертмяры
Юрий В Радюшин
Адам Меровей
Павел Васильев
Павел Васильев
Это Смоленская  8 января
Павел Васильев Хроника глобального похолодания в отдельно взятом районе Брянской области
Тимур Бикметов
Тимур Бикметов
Woledemort Riddl
Oleg Konchakov
Тимур Бикметов
Юрий В Радюшин
Oleg Konchakov
Юрий В Радюшин
Тимур Бикметов
Тимур Бикметов
С Новым Годом!!!
Тимур Бикметов Поздравляем всех С новым годом!
Beefect Reemboltick
Юрий В Радюшин
Юрий В Радюшин
Ali
Victor Rasskazov
Зайцев Виктор Зайцев Виктор
Игорь Арутов
Юрий В Радюшин
Артём Просянников
Тимур Бикметов
Анатолий Никитин
Boleslav Buljanowskij
Елена Марченко
Юрий В Радюшин
Юрий В Радюшин
Владимир Дмитриев
Тимур Бикметов
Анатолий Никитин
Юрий В Радюшин
Юрий В Радюшин
Адам Меровей
Юрий В Радюшин
Адам Меровей
Анатолий Никитин
Юрий В Радюшин
Юрий В Радюшин
Адам Меровей
Адам Меровей
Адам Меровей
Анатолий Никитин