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

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

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

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

О сайте

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

развернуть
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)
Некто ВК
Некто ВК Некто ВК 15 сентября, в 12:37 Кстати, очень хорошее объяснение дал предыдущий комментатор Дмитрий Танцюра. Правда, пример этот из области логики. Зато очень наглядный и удобный, скажем, для современных укропитеков. Когда знак можно по желанию тулить куда угодно, в зависимости от собственных хотелок. А самое главное - в любой момент можно переиграть - поменять местами, вообще изъять или добавить еще одну ("Казнить, нельзя, помиловать!" - тоже неплохо выглядит и трактовать тоже можно как угодно) :-( :-) Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 16:44 спсб и улыбнули ,😎 ну вот теперь очень не простой вопрос или 🐒 молограмотен совет наверное: число π нельзя рассматривать и использовать в расчётах при вычислениях с кругом ,только с туннелем или спиралью или сферы это переменная 3D модели . скажем так для вычисления в условиях применения с аксиомой Ома .
не знаю какие вычисление Сони делает ,но они уже микросхемы наливают , а не штампуют .
Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 19:47 Ну, так в Малороссии уже давно кашу наливают, а борщ насыпают. Чем япона мать лучше? А насчет числа Пи напрашивается такая история. Колеса вагонов у поезда круглые, а рельсы ровные. Но, поскольку площадь колес равна Пи на Р в квадрате, то вот этот квадрат и стучит по рельсам. Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 19:50 вот оно чё ,ты про малограмотный не так меня понял .
колёса то круглые а ось косая .
Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 19:57 "про малограмотный" - это кто? Профессор, профессионал, профан или просто малограмотный? Гордиться мне или возмущаться? Косая же ось вызывает не стук, а вибрации, если уж на то пошло. Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 20:00 а вибрация и есть звук . да то я обезьянке . пройди мимо не твоё .⛹ Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 20:05 Может быть и так. Если вагон качает и трясет, то пассажиры издают не самые приятные звуки. Текст скрыт развернуть
1
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 20:11 ты реально супер .
шо погрузили то и везут .
Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 20:25 Ну, так еще бы! Я даже могу ответить, чему равна сумма квадратов гипотенузы. Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 20:31 квадратных , по аналогии с колесом , интеграл точки = дуга . Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Дмитрй Танцюра 15 сентября, в 20:37 сам в шоке 🐨 Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 20:38 Да нет, все несколько проще. Сумма квадратов гипотенузы равна сумме квадратов катетов, помноженных на число этих самых квадратов гипотенузы. Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 20:39 а как эти квадраты считать если π®² ? Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 21:00 А чего его считать, если в π®² он только один? Хотя, впрочем, можно его нарезать и кусочками. Как блин. Только вкуснее он от этого не станет. Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 21:07 о ,есть два вида сковородок круглый и квадратные , а блинов больше на круглой получается . Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Дмитрй Танцюра 15 сентября, в 21:11 и вот я задумался у чего кристаллическая решотка круглая ? общее правило кругов это другое - это LSD от ЦРУ . Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 21:34 Круглая кристаллическая решетка? Это что еще такое, замороженный бензол, что-ли? Есть, правда, еще целониты (кажется так они называются). Не вполне круглые решетки, но если пообтесать, то можно придать вполне ровную круглую форму. Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 21:37 спсб . полез в таблицу . к стати а ей можно 3D форму придать ? может допишем ,тогда только изначально элемент с атомной массой - 0.π на вершине и рядов по больше . Текст скрыт развернуть
0
Некто ВК
Некто ВК Дмитрй Танцюра 15 сентября, в 21:47 Предлагаю завершить эту бодягу, а то попрут нас с сайта, как шелудивых котят. Текст скрыт развернуть
0
Дмитрй Танцюра
Дмитрй Танцюра Некто ВК 15 сентября, в 21:54 не думай . Текст скрыт развернуть
0
Показать новые комментарии
Комментарии с 1 по 20 | всего: 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 сентября.
Анатолий Никитин
Юрий В Радюшин
Юрий В Радюшин
Максот Битанов
Ирина Абрамова (Калганова)
Некто ВК
Юрий В Радюшин
Причем с умным видом собирая инвесторов и бабкм рт них!
Юрий В Радюшин Приземление Илона Маска
Юрий В Радюшин
Валерий Акинин
Получается, что я был прав. Что-то объяснять Вам нет смысла...
Валерий Акинин Приземление Илона Маска
Некто ВК
Некто ВК
Владимир Барышев
Юрий Трифонов
Юрий Трифонов
Валерий Акинин
Некто ВК
Александр Зиборов
Владимир Сахелашвили