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

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

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

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

О сайте

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

развернуть
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
Блог
«Как можем мы, атеисты, не симпатизировать такой религии?»
30 окт, 06:00
+10 4
Если хотите знать историю буквы "Ё"...
27 окт, 07:04
+7 3
ВЫСШИЙ ЗАМЫСЕЛ
22 сен, 10:35
+5 1
Происхождение массы
22 сен, 06:13
+4 6

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

Евгений Шеньшин
Владислав Малиновский
СЕРГЕЙ СОХАНЬ
Дионисий Воловед
Владимир Барышев
федот
Молодчина и автор и Юрий Радюшин,в самый раз для егэшников-,,авиятороф'.'
федот Двигатель и крыло
Сергей Иванов
Ахинея!
Сергей Иванов Двигатель и крыло
Глеб Глебыч
Vova Timushev
кувырок чего м поля или земли??
Vova Timushev В США меняют маркировку взлетных полос. Земля скоро совершит кувырок?
Александр Самсонов
M-s Арх.
Юрий В Радюшин
Михаил Анохин
Александр Ник
radiofree RF
Большое спасибо,не заметил,наверное привык пользоваться буквой Е.
radiofree RF Если хотите знать историю буквы "Ё"...
александр лисяков
Ё, левее единицы!
александр лисяков Если хотите знать историю буквы "Ё"...
radiofree RF
А почему на клаве энту букву не сделали.))))))))))))))))))
radiofree RF Если хотите знать историю буквы "Ё"...
Аристарх Сергеевич Неизвестный
Павел Васильев
Юрий В Радюшин
Ну и что дальше?
Юрий В Радюшин «Как можем мы, атеисты, не симпатизировать такой религии?»
Павел Васильев
вага карлито
Владимир Сабакарь
Сергей Ефимов
Владимир Сабакарь
Владимир Сабакарь
Сергей Ефимов
Gena Lipatov
Меняется вес или масса маховика?
Gena Lipatov Гравитация – это не притяжение или что такое гравитация.
Александр
Лейла Турманова
Владимир Сабакарь
Сергей Ефимов
Владимир Сабакарь
Сергей Ефимов
Владимир Сабакарь
Сергей Ефимов
Владимир Сабакарь
Сергей Ефимов
Владимир Сабакарь
Владимир Сабакарь
Сергей Ефимов
Владимир Сабакарь
Владимир Сабакарь
Контузия это не просто так....
Владимир Сабакарь Гравитация – это не притяжение или что такое гравитация.
Владимир Сабакарь
Владимир Сабакарь
Владимир Калинычев
Владимир Калинычев
Дмитрий Самойленко
Адам Меровей
Сергей Ефимов