Что такое число с плавающей запятой

Представление чисел с плавающей точкой

Содержание

Плавающая точка [ править ]

Такой метод является компромиссом между точностью и диапазоном представляемых значений. Представление чисел с плавающей точкой рассмотрим на примере чисел двойной точности (double precision). Такие числа занимают в памяти два машинных слова (8 байт на 32-битных системах). Наиболее распространенное представление описано в стандарте IEEE 754.

Кроме чисел двойной точности также используются следующие форматы чисел:

При выборе формата программисты идут на разумный компромисс между точностью вычислений и размером числа.

Нормальная и нормализованная формы [ править ]

Числа двойной точности [ править ]

Число с плавающей точкой хранится в нормализованной форме и состоит из трех частей (в скобках указано количество бит, отводимых на каждую секцию в формате double):

Знак
Экспонента
(11 бит)
Мантисса
(52+1 бит)
0000000000001,0000000000000000000000000000000000000000000000000000
6252510

Свойства чисел с плавающей точкой [ править ]

Особые значения чисел с плавающей точкой [ править ]

Ноль (со знаком) [ править ]

В нормализованной форме невозможно представить ноль. Для его представления в стандарте зарезервированы специальные значения мантиссы и экспоненты.

Утверждение:
Знак
ЭкспонентаМантисса
0 /1000001,0000000000= [math]\pm0[/math]

Согласно стандарту выполняются следующие свойства:

Бесконечность (со знаком) [ править ]

Для приближения ответа к правильному при переполнении, в double можно записать бесконечное значение. Так же, как и в случае с нолем, для этого используются специальные значение мантиссы и экспоненты.

Знак
ЭкспонентаМантисса
0 /1111111,0000000000= [math]\pm\infty[/math]

Бесконечное значение можно получить при переполнении или при делении ненулевого числа на ноль.

Неопределенность [ править ]

В математике встречается понятие неопределенности. В стандарте double предусмотрено псевдочисло, которое арифметическая операция может вернуть даже в случае ошибки.

Знак
ЭкспонентаМантисса
0 /1111111,0 /10 /10 /10 /10 /10 /10 /10 /10 /10 /1= [math]NaN[/math]

Неопределенность можно получить в нескольких случаях. Приведем некоторые из них:

Денормализованные числа [ править ]

Ввиду сложности, денормализованные числа обычно реализуют на программном уровне, а не на аппаратном. Из-за этого резко возрастает время работы с ними. Это недопустимо в областях, где требуется большая скорость вычислений (например, видеокарты). Так как денормализованные числа представляют числа мало отличные от нуля и мало влияют на результат, зачастую они игнорируются (что резко повышает скорость). При этом используются две концепции:

Начиная с версии стандарта IEEE 754 2008 года денормализованные числа называются «субнормальными» (subnormal numbers), то есть числа, меньшие «нормальных».

Машинная эпсилон [ править ]

Unit in the last place (Unit of least precision) [ править ]

Мера единичной точности используется для оценки точности вычислений.

Погрешность предиката «левый поворот» [ править ]

Определения [ править ]

[math] \exists \tilde <\epsilon>\in D: [/math]

Расчет [math] \tilde <\epsilon>[/math] [ править ]

Теперь распишем это выражение в дабловой арифметике.

[math] |\delta_i| \leq \varepsilon_m [/math]

Заметим, что [math] v \approx \tilde [/math]

Ответ [ править ]

[math] \tilde <\epsilon>\lt 8 \varepsilon_m \tilde[/math]

Заметим, что это довольно грубая оценка. Вполне можно было бы написать [math] \tilde <\epsilon>\lt 4.25 \varepsilon_m \tilde[/math] или [math] \tilde <\epsilon>\lt 4.5 \varepsilon_m \tilde.[/math]

Источник

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой

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

При написании книги Game Engine Black Book: Wolfenstein 3D я хотел наглядно показать, насколько велики были проблемы при работе без плавающей запятой. Мои попытки разобраться в числах с плавающей запятой при помощи каноничных статей мозг воспринимал в штыки. Я начал искать другой способ. Что-нибудь, далёкое от Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятойи их загадочных экспонент с мантиссами. Может быть, в виде рисунка, потому что их мой мозг воспринимает проще.

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

Как обычно объясняют числа с плавающей запятой

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

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

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой
Три части числа с плавающей запятой.

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой

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

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой

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

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой
Три части числа с плавающей запятой.

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

Викторина: сколько точности теряется, когда окно закрывает больший интервал? Давайте возьмём пример с окном [0,1], в котором 8388608 смещений накладываются на интервал размером 1, что даёт нам точность Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой. В окне [2048,4096] 8388608 смещений накладываются на интервал Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой, что даёт нам точность Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой.

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

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

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой

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

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

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой

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

Что такое число с плавающей запятой. Смотреть фото Что такое число с плавающей запятой. Смотреть картинку Что такое число с плавающей запятой. Картинка про Что такое число с плавающей запятой. Фото Что такое число с плавающей запятой

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

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

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

Источник

Тип float

Числа с плавающей запятой используют формат IEEE (Института инженеров по электротехнике и электронике). Значения с одиночной точностью и типом float имеют 4 байта, состоят из бита знака, 8-разрядной двоичной экспоненты excess-127 и 23-битной мантиссы. Мантисса представляет число от 1,0 до 2,0. Поскольку бит высокого порядка мантиссы всегда равен 1, он не сохраняется в числе. Это представление обеспечивает для типа float диапазон примерно от 3,4E–38 до 3,4E+38.

Можно объявить переменные в качестве типа float или double в зависимости от нужд приложения. Основные различия между двумя типами значения заключаются в представляемой ими значимости, требуемых ресурсах хранения и диапазоне. В следующей таблице показана связь между значимостью и требованиями к хранению.

Типы с плавающей запятой

Переменные с плавающей запятой представлены мантиссой, которая содержит значение числа, и экспонентой, которая содержит порядок возрастания числа.

В следующей таблице показано количество битов, выделенных мантиссе и экспоненте для каждого типа с плавающей запятой. Наиболее значимый бит любого типа float или double — всегда бит знака. Если он равен 1, число считается отрицательным; в противном случае — положительным.

Длина экспонент и мантисс

TypeДлина экспонентыДлина мантиссы
float8 бит23 бита
double11 бит52 бита

Поскольку экспоненты хранятся в форме без знака, экспоненты смещены на половину своего возможного значения. Для типа float смещение составляет 127; для типа double это 1023. Можно вычислить фактическое значение экспоненты, вычтя значение смещения из значения экспоненты.

Мантисса хранится в виде бинарной доли, которая больше или равна 1 и меньше 2. Для типов float и double в мантиссе подразумевается наличие начального 1 в наиболее значимой битовой позиции, поэтому фактически длина мантисс составляет 24 и 53 бит соответственно, даже если наиболее значимый бит никогда не хранится в памяти.

Вместо только что описанного метода хранения пакет значений с плавающей запятой может хранить двоичные числа с плавающей запятой как денормализованные числа. Денормализованные числа — это ненулевые числа с плавающей запятой и зарезервированными значениями экспонент, в которых наиболее значимый бит мантиссы равен 0. Используя денормализованный формат, можно расширить диапазон числа с плавающей запятой в ущерб точности. Невозможно контролировать, в какой форме будет представлено число с плавающей запятой — нормализованной или денормализованной. Пакет значений с плавающей запятой определяет представление. В пакете значений с плавающей запятой никогда не используется денормализованная форма. Исключение составляют случаи, когда экспонента становится меньше, чем минимальное значение, которое может быть представлено в нормализованной форме.

В следующей таблице показаны минимальное и максимальное значения, которое можно сохранить в переменных каждого типа с плавающей запятой. Значения, указанные в этой таблице, применяются только к нормализованным числам с плавающей запятой; денормализованные числа с плавающей запятой имеют меньшее минимальное значение. Обратите внимание, что номера, сохраненные в регистрах 80x87, всегда представлены в 80-разрядной нормализованной форме; при сохранении в 32- или 64-разрядных переменных с плавающей запятой числа могут быть представлены только в ненормализованной форме (переменные типов float и long).

Диапазон типов с плавающей запятой

TypeМинимальное значениеМаксимальное значение
плавающее1,175494351 E – 383,402823466 E + 38
double2,2250738585072014 E – 3081,7976931348623158 E + 308

Если точность менее важна, чем размер хранимых данных, имеет смысл использовать тип float для переменных с плавающей запятой. И наоборот, если точность — наиболее важный критерий, используйте тип double.

Уровень переменных с плавающей запятой можно повысить до типа большей значимости (преобразование типа float в тип double). Повышение уровня часто происходит при выполнении арифметических действий с переменными плавающего типа. Это арифметическое действие всегда выполняется на том же уровне точности, что и переменная с наивысшим уровнем точности. Например, проанализируйте объявления следующих типов.

В следующем примере (с использованием объявлений из предыдущего примера) арифметическая операция выполняется на уровне точности переменной типа float (32-разрядной). Уровень результата затем повышается до уровня double.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *