32 bit float что это

32 битых

Поздравляем, с некоторых пор наши любимые «24 бит» подросли на треть. Ожидать ли роста надоев и шерсти или это очередные маркетинговые тарахтелки? Рассмотрим 32 бита прямо в студии звукозаписи.

Коммерческих фонограмм, изданных «в 32-битовом исчислении», пока нет. Все хорошо расслышали? Не-ту.

Зато ЦАПов с 32-битовой разрядностью на всех углах — оптом, и в розницу, и на разлив. Например, ESS Sabre ES9018, Texas Instruments PCM1795 или Asahi Kasei AK4399. Все эти комплектующие успешно обкатаны в современных и уже не очень моделях для домашнего аудио. При этом, опять же, если мы заглянем на студию, то самые дорогие аналого-цифровые преобразователи по-прежнему будут иметь предел лишь до 24 бит/192 кГц. Но все-таки 32-битовое исчисление — полезная штука. Не знаем, как там в ЦАПе, а вот на этапе подготовки фонограммы частенько используется обработка данных с 32-битовой точностью. А иногда даже и 64. Как это работает? Начнем с финала.

Допустим, вы типичный издатель, чтоб, не дай бог, какой аудиофильский лейбл с занудным репертуаром. Обычная студия, которая готовит мастер к выпуску. Стандартный круг будущих носителей — CD, MP3 для веб-сервисов и винил. Как правило, для всех этих нужд хватает одного-единственного цифрового мастера в 24 бит/44 кГц. Де-факто на сегодня это финальный студийный продукт, которым оперируют в подавляющем большинстве случаев. Все, что выше, оговаривается по специальным заказам и встречается гораздо реже. Вам кажется 24/44 маловато? Да, частотка как у компакт-диска, но все-таки 24 бит дают более гладкое представление аудиоданных. По сравнению с CD такой файл звучит ну. не как небо и земля, но определенно плотнее, четче, с лучшей фокусировкой. Кстати, на ресурсах вроде HD Tracks или Qobuz вот именно такие 24/44 и предлагаются к продаже. Чтобы получить хороший результат на финальном мастере 24/44, инженерам звукозаписи имеет смысл позаботиться о некотором запасе.

А как же наши двухпудовые ЦАПы, зачем же все это надо?

«32 bit float» — т.е. 32 бит с плавающей точкой — вот как это называется в интерфейсе программных аудиоредакторов. АЦП может цифровать аналоговый сигнал максимально в 24 бит/192 кГц, но обычно звук записывают хоть и в 24 бит, но с более низкой частотой дискретизации, например 48 кГц. При этом каждому блоку данных аудиоредактор присваивает дополнительно 8 разрядов. По факту это не «настоящее», а виртуальное 32-битовое представление сигнала, они пока остаются пустыми. Зато потом на стадии микширования или редактирования эта «восьмерка пик» сможет пригодиться, пускай и не вся колода.

Например, вы сложили несколько дорожек. Или слишком бодро компрессировали амплитуду, чтобы разогнать громкость, и получили перехлест уровня выше 0 дБ. Для цифрового сигнала упереться в 0 дБ — это необратимый клиппинг, искажения, которые не отмотать назад. Так и было бы, если бы вы ворочали микс в родной 24-битовой среде. Вот здесь и приходят на помощь дополнительные 8 разрядов от звукового софта. Они дают необходимый «headroom», т.е. запас динамики, с помощью которого можно исправить ошибку — поправить уровень, более тщательно наложить эффект и т.п. Далее в самом конце все понижается в 24-битовый микс, а потом и в 16-битовый — для компакт-дисков и iTunes.

А как же наши двухпудовые ЦАПы, зачем же все это надо? «Опять обман?» — воскликнет читатель. «А что вам, собственно, — ответит редакция, — жалко, что ли?» За восемь лишних бит сверху денег не берут. А если когда и берут, то из-за колебаний валютного курса. Сладчайших вам прейскурантов и крепкой скидки в аудиосалонах!

Источник

Про Float в аудио популярно (1 онлайн

Entrase

Поделюсь тем, что знаю

Сразу прошу прощения за разговоры про «плавную волну». При всём своём новичковском звучании такие изъяснения легко визуализируются в мыслях. В дебри программирования и математики лазить не буду, рассказываю для всех.

Про Float в аудио популярно

Где нам только не попадается надпись вроде «32 bit float» — в спецификациях, обзорах, руководствах. К сожалению, последний элемент этой надписи часто недооценивается или вовсе игнорируется, и формат ставится в один ряд с привычными нам 16- или 24-битными. То есть многие просто не осведомлены о преимуществах представления с плавающей запятой («float» — плавающий). Потому распространены суждения в духе «зачем 32, если мне и 24 достаточно». Разберёмся, зачем и где это всё-таки нужно.

Когда речь идёт о 16, 20, 24 или 48 битах, то обычно под этим подразумевается противоположность плавающей запятой — фиксированная запятая. Подписывается это как «int», то есть integer — целочисленный, т.к. в этом виде удобно представлять целые числа. Именно о представлении с фиксированной запятой считает своим долгом рассказать любой автор, пишущий об основах цифрового звука. Поэтому не будем вдаваться подробности, а лишь вспомним, что 00 = 0, 01 = 1, 10 = 2, 11 = 3 и т.д., но только с соответствующим числом разрядов (разряды и биты — одно и то же в данном контексте, если что Правда, один бит отдаётся под знак — так удобнее представлять «цифровую волну», которая колеблется в обе стороны относительно нуля. С разным количеством бит получается разный диапазон чисел, но самое большое по модулю число в этом диапазоне всё равно соответствует 0 дБ. Это пресловутый Full Scale, выше которого не прыгнешь, т.к. все биты уже единицы. Но иногда прыгнуть нужно.

Во-первых, в процессе обработки звука возможны очень сильные изменения уровней. Они могут быть не совсем заметными с точки зрения пользователя, но на отдельных шагах алгоритмов внутри устройств и программ обработки перепады могут быть чрезвычайно серьёзными. А ведь при традиционном целочисленном представлении количество бит у нас ограничено. Если сделаем слишком тихо, то уйдём в полный ноль или, как минимум, оставим мало места для плавного изменения уровня «волны», а если слишком громко, то получим не подлежащий исправлению клиппинг.

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

Как же float позволяет нам прыгнуть выше 0 дБ? По правде говоря, помогает не float, а тот факт, что 0 дБ в данном случае соответствует не максимальному числу с плавающей запятой, а намного меньшему. То же самое можно сделать и в целых числах. Взять, скажем, в 16-битном диапазоне за ноль не 32768, а раза в два меньше. Но разве для сильных перепадов нам достаточно такого запаса? Нет. Хорошо, float мы обычно видим в 32-битном исполнении. Возьмём тогда и для целого числа 32 бита. Поставим ноль посередине. Запас будет куда больше. Но для сильных многократных изменений этого всё равно может оказаться недостаточно. А если и хватит (работать и обрабатывать можно по-разному), то это лишняя головная боль программистам: необходимо отслеживать переполнения (когда все единицы и дальше некуда) и потери значимости (когда все нули). А наткнуться на эти эффекты при фиксированном формате куда проще, чем с плавающей запятой.

Почему? Потому что числа кодируются нулями и единицами иначе. Если в целочисленных форматах мы имели подход «в лоб» с переключением нулей на единички по порядку в одном большом поле (бит под знак сути не меняет), то здесь уже имеются два поля: мантисса и показатель степени. По стандарту IEEE754 число одинарной точности имеет 8-битный показатель и 23-битную мантиссу (1 бит под знак). Более глубоко тема раскрывается в энциклопедиях. Это называется экспоненциальной записью, и все её знают. В школе на физике и математике рассказывают, что число 1 536 000 можно записать как 1,536 × 10^6. 6 — показатель степени, 1,536 — мантисса. Не слишком напрягаясь можно манипулировать порядком числа — достаточно изменять показатель (1,536 × 10^−6). Довольно школьного материала, всё есть в учебниках и справочниках в достаточно сжатом виде. Вывод прост: волна будет оставаться плавной на самых разных уровнях, причём куда более разных, чем при обычной нотации. То есть звук не будет терять качество даже при очень серьёзных «регулировках громкости».

За 0 дБ в «плавающих форматах» берётся единица (1,00000…). Форматы эти имеют знак, как и целочисленные. Например, в 16 битах имеем числовой диапазон от −32768 до 32767. Вот эти пределы по децибелам и соответствуют промежутку −1,00—1,00 в плавающем виде. Но пределы самого плавающего вида куда шире диапазона от −1,00 до 1,00. Больше настолько, что уже в 32-битном представлении с плавающей запятой без ущерба для звука можно делать регулировки на сотни децибел! Вот так.

Почти панацея для программистов и серьёзное упрощение рабочего процесса для звукоинженеров. Почему почти? Потому что не всегда была и не всегда есть возможность применить соответствующие процессоры или снабдить процессор устройством для вычислений с плавающей запятой. Причём раньше проблема проявляла себя сильнее. Те стандарты и решения, которые становились давно по меркам вычислительной техники, завязаны на целых числах. По мере обновления техники вычисления с плавающей запятой задействуются шире. Например, новая звуковая подсистема ОС Windows Vista построена полностью на float-формате. Ещё программистам фирма Intel подарила ложку дёгтя в виде жутких тормозов своих процессоров при работе с очень мелкими числами. Впрочем, пользователей данная проблема не касается, т.к. программисты успешно обходят этот баг. На звук это не влияет, т.к. речь о действительно мелких числах. Не спешите погружаться в негодование и бежать за другими процессорами к другим фирмам. Особенность эта очень старая и присуща всем совместимым камням.

При всех положительных сторонах не везде целесообразно применять вычисления с плавающей запятой. На сегодняшний день не существует АЦП/ЦАП, способных полностью покрыть даже 24 бита, не говоря уже о чём-то большем. А значит, и нет смысла выбирать плавающие форматы для конечного продукта. Их предназначение — промежуточные результаты хоть в виде файлов, хоть внутри микшера виртуальной студии. Вне компьютера вычисления с плавающей запятой пока что распространения не получили. Конечно, они используются, например, в декодерах, а есть и вовсе отдельный класс процессоров — сигнальные. Но это закрытые для пользователя системы, и ему плевать, как там внутри его проигрывателя реализовано декодирование MP3. Студийные железки через AES3 передают звук целыми числами. А в бытовой технике поддержка огромного диапазона внешними интерфейсами совсем не нужна. Наверное, такой изолированностью и можно объяснить отсутствие 16-, 20-, 24- и прочих разрядностей, частых для фиксированных представлений.

Вот и всё, что могу на данный момент сказать, не погружаясь куда попало. Может, позже что-то добавлю. Или вы добавите. Спасибо за внимание.

Источник

Одинарная или двойная точность?

Введение

Статья также написана для тех из вас, у кого много данных. Если вам требуется несколько чисел тут или там, просто используйте double и не забивайте себе голову!

Точность данных

У 32-битных чисел с плавающей запятой точность примерно 24 бита, то есть около 7 десятичных знаков, а у чисел с двойной точностью — 53 бита, то есть примерно 16 десятичных знаков. Насколько это много? Вот некоторые грубые оценки того, какую точность вы получаете в худшем случае при использовании float и double для измерения объектов в разных диапазонах:

Почему всегда не хранить всё с двойной точностью?

Влияние на производительность вычислений с одинарной и двойной точностью

Когда производить вычисления с увеличенной точностью

Даже если вы храните данные с одинарной точностью, в некоторых случаях уместно использовать двойную точность при вычислениях. Вот простой пример на С:

Если вы запустите этот код на десяти числах одинарной точности, то не заметите каких-либо проблем с точностью. Но если запустите на миллионе чисел, то определённо заметите. Причина в том, что точность теряется при сложении больших и маленьких чисел, а после сложения миллиона чисел, вероятно, такая ситуация встретится. Практическое правило такое: если вы складываете 10^N значений, то теряете N десятичных знаков точности. Так что при сложении тысячи (10^3) чисел теряются три десятичных знака точности. Если складывать миллион (10^6) чисел, то теряются шесть десятичных знаков (а у float их всего семь!). Решение простое: вместо этого выполнять вычисления в формате double :

Пример

Предположим, что вы хотите точно измерить какое-то значение, но ваше измерительное устройство (с неким цифровым дисплеем) показывает только три значимых разряда. Измерение переменной десять раз выдаёт следующий ряд значений:

Чтобы увеличить точность, вы решаете сложить результаты измерений и вычислить среднее значение. В этом примере используется число с плавающей запятой в base-10, у которого точность составляет точно семь десятичных знаков (похоже на 32-битный float ). С тремя значимыми разрядами это даёт нам четыре дополнительных десятичных знака точности:

В сумме уже четыре значимых разряда, с тремя свободными. Что если сложить сотню таких значений? Тогда мы получим нечто вроде такого:

Всё ещё остались два неиспользованных разряда. Если суммировать тысячу чисел?

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

Заметьте, как мы сдвигаем меньшее число, чтобы выровнять десятичный разделитель. У нас больше нет запасных разрядов, и мы опасно приблизились к потере точности. Что если сложить сто тысяч значений? Тогда добавление новых значений будет выглядеть так:

Обратите внимание, что последний значимый разряд данных (2 в 3.12) теряется. Вот теперь потеря точности действительно происходит, поскольку мы непрерывно будем игнорировать последний разряд точности наших данных. Мы видим, что проблема возникает после сложения десяти тысяч чисел, но до ста тысяч. У нас есть семь десятичных знаков точности, а в измерениях имеются три значимых разряда. Оставшиеся четыре разряда — это четыре порядка величины, которые выполняют роль своеобразного «числового буфера». Поэтому мы можем безопасно складывать четыре порядка величины = 10000 значений без потери точности, но дальше возникнут проблемы. Поэтому правило следующее:

(Существуют численно стабильные способы сложения большого количества значений. Однако простое переключение с float на double гораздо проще и, вероятно, быстрее).

Выводы

Приложение: Что такое число с плавающей запятой?

Я обнаружил, что многие на самом деле не вникают, что такое числа с плавающей запятой, поэтому есть смысл вкратце объяснить. Я пропущу здесь мельчайшие детали о битах, INF, NaN и поднормалях, а вместо этого покажу несколько примеров чисел с плавающей запятой в base-10. Всё то же самое применимо к двоичным числам.

Вот несколько примеров чисел с плавающей запятой, все с семью десятичными разрядами (это близко к 32-битному float ).

1.875545 · 10^-18 = 0.000 000 000 000 000 001 875 545
3.141593 · 10^0 = 3.141593
2.997925 · 10^8 = 299 792 500
6.022141 · 10^23 = 602 214 100 000 000 000 000 000

Выделенная жирным часть называется мантиссой, а выделенная курсивом — экспонентой. Вкратце, точность хранится в мантиссе, а величина в экспоненте. Так как с ними работать? Ну, умножение производится просто: перемножаем мантисссы и складываем экспоненты:

Сложение немного хитрее: чтобы сложить два числа разной величины, сначала нужно сдвинуть меньшее из двух чисел таким образом, чтобы запятая находилась в одном и том же месте.

Заметьте, как мы сдвинули некоторые из значимых десятичных знаков, чтобы запятые совпадали. Другими словами, мы теряем точность, когда складываем числа разных величин.

Источник

Автор: Яшкардин Владимир &nbsp &nbsp
www.softelectro.ru &nbsp &nbsp
Дата: 2009 &nbsp &nbsp &nbsp &nbsp
Редакция: 04.06.2012
info@softelectro.ru

§1. Название стандарта.

Данный стандарт разработан ассоциацией IEEE (Institute of Electrical and Electronics Engineers) и используется для представления действительных чисел (чисел с плавающей точкой) в двоичном коде. Наиболее используемый стандарт для вычислений с плавающей точкой, используется многими микропроцессорами и логическими устройствами, а также программными средствами.

В 2008 года ассоциация IEEE выпустила стандарт IEEE 754-2008, который включил в себя стандарт IEEE 754-1985.

§2.Краткое описание стандарта.

Стандарт содержит 23 страницы текста в 7 секциях и одном приложении: 1.Scope(Область применения) 1.1 Implementation Objectives (Описывает цели стандарта) 1.2 Inclusions (Описывает что включено в стандарт) 1.3 Exclusions (Описывает что не определяет стандарт) 2.Definitions (Вводимы определения) 3.Formats (Форматы чисел) 3.1 Sets of Values (Наборы переменных для представления формата) 3.2 Basic Formats (Базовые форматы) 3.3 Extended Formats (Расширенные форматы) 3.4 Combinations of Formats (Комбинирование форматов) 4.Rounding (Округления) 4.1 Round to Nearest (Округление к ближайшему) 4.2 Directed Roundings (Прямое округление) 4.3 Rounding Precision (Точность округления) 5.Operations (Операции) 5.1 Arithmetic (Арифметика) 5.2 Square Root (Квадратный корень) 5.3 Floating-Point Format Conversions (Конверсия форматов с плавающей точкой) 5.4 Conversion Between Floating-Point and Integer Formats (Конверсия между форматами с плавающими точками и форматами целых чисел.) 5.5 Round Floating-Point Number to Integer Value (округление чисел с плавающей точкой в целые числа) 5.6 Binary Decimal Conversion (Конверсия бинарного в десятичное) 5.7 Comparison (Сравнение) 6.Infinity, NaNs, and Signed Zero (Бесконечность, не числа, и знаковый ноль) 6.1 Infinity Arithmetic (Арифметические действия с бесконечностями) 6.2 Operations with NaNs (Операции с не числами) 6.3 The Sign Bit (Операции с знаковым бит) 7.Exceptions (Исключения) 7.1 Invalid Operation (Недопустимые операции) 7.2 Division by Zero (Деление на ноль) 7.3 Overflow (Переполнение) 7.4 Underflow (Нехватка разряда) 7.5 Inexact (Неточность) 8.Traps (Обнаружение недопустимых операций) 8.1 Trap Handler (Исполнитель обнаружения недопустимых операций) 8.2 Precedence (Первоочередность) A.Recommended Functions and Predicates (Рекомендованные функции и утверждения)

&nbsp &nbsp &nbsp &nbspК сожалению, организация IEEE превратилась из международной общественной инженерной организации (которой она была изначально) в торговую организацию.
Этой организации принадлежит авторское право на публикацию стандарта IEEE754-1985.
Поэтому если вы захотите ознакомиться, с оригиналом стандарта, вам придется купить его примерно за 80$.
Но, Российского законодательство разрешает мне в учебных целях комментировать данный стандарт.
Поэтому дальше я буду давать вольное изложение стандарта и выражать своё мнение о нём в учебных целях.

§3. Основные понятия в представлении чисел с плавающей точкой.


3.1 Представление числа в нормализованном экспоненциальном виде.


3.2 Представление числа в денормализованном экспоненциальном виде.


3.3 Преобразование десятичного числа в двоичное число с плавающей точкой.

Наша задача сводится к представлению десятичного числа с плавающей точкой, в двоичное число с плавающей точкой в экспоненциальном нормализованном виде. Для этого разложим заданное число по двоичным разрядам:

Приведем полученное число к нормализованному виду в десятичной и двоичной системе:
1,55625∙exp10 +2 = 1,0011011101∙exp2 +111

В результате мы получили основные составляющие экспоненциального нормализованного двоичного числа:
Мантиссу M=1,0011011101
Экспоненту exp 2= +111

§4. Описание преобразования чисел по стандарту IEEE 754.

4.1 Преобразование двоичного нормализованного числа в 32 битный формат IEEE 754

Основное применение в технике и программирование получили форматы 32 и 64 бита.
Например, в VB используют типы данных single (32 бита) и double (64 бита).
В Си аналогично используют float (32 бита) и double (64 бит)
Рассмотрим преобразование двоичного числа 10011011,101 в формат single-precision (32 бита) стандарта IEEE 754.
Остальные форматы представления чисел в IEEE 754 являются увеличенной копией single-precision.

Чтобы представить число в формате single-precision IEEE 754 необходимо привести его к двоичному нормализованному виду. В §3 мы проделали это преобразование над числом 155,625. Теперь рассмотрим, как двоичное нормализованное число преобразуется к 32 битному формату IEEE 754.

В результате десятичное число 155,625 представленное в IEEE 754 c одинарной точностью равно 431BA000 (hex).

4.2 Преобразования числа формата 32 бит IEEE 754 в десятичное число

Это целые числа которые записанные в числе IEEE 754 в двоичном виде.

Приведём формулу для получения десятичного числа из числа IEEE754 одинарной точности:

Проверяем наш пример:
F =(-1) 0 ∙2 (134-127) ∙(1+ 1810432 / 2 23 )= 2 7 ∙(1+0,2158203125)=128∙1,2158203125=155,625

§5. Формальное представление чисел в стандарте IEEE 754 для любого формата точности.

Рис. 1 Представление числа в формате IEEE 754

Формула вычисления десятичных чисел с плавающей точкой, из чисел представленных в стандарте IEEE754:

32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это(Формула №1)

Используя формулу №1 вычислим формулы для нахождения десятичных чисел из форматов одинарной (32 бита) и двойной (64 бита) точности IEEE 754:

Рис.2 Формат числа одинарной точности (single-precision) 32 бита32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

Рис.3 Формат числа двойной точности (double-precision) 64 бита32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

§6. Представление денормализованного числа и других чисел в формате IEEE 754

Отсюда видно, что невозможно представить число нуль или бесконечность в заданном формате.

Поэтому формула №1 не применяется в следующих случаях:

Формула расчета денормализованных чисел:

32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это(Формула №2)

7.2 Полный диапазон чисел одинарной точности (32 бит) по стандарту IEEE754


7.3 Полный диапазон чисел двойной точности (64 бит) по стандарту IEEE754


7.4 Точность представления вещественных чисел в формате IEEE754.

Числа представленные в формате IEEE754 представляют конечное множество, на которое отображается бесконечное множество вещественных чисел. Поэтому исходное число может быть представлено в формате IEEE754 с ошибкой.

Рис.6 Функция ошибки точности представления числа в IEEE754
32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

Абсолютная максимальная ошибка для числа в формате IEEE754 равна в пределе половине шага чисел. Шаг чисел удваивается с увеличением экспоненты двоичного числа на единицу. То есть, чем дальше от нуля, тем шире шаг чисел в формате IEEE754 по числовой оси.

Шаг денормализованных чисел равен 2 (E-149) (Single) и 2 (E-1074) (Double).
Соответственно предел макс. абсолютной ошибки будет равен 1/2 шага числа: 2 (E-150) (Single) и 2 (E-1075) (Double).
Относительная ошибка в % будет равна: (2 (E-150) /F)*100%(Single) и (2 (E-1075) /F)*100% (Double).

Шаг нормализованных чисел равен 2 (E-150) (Single) и 2 (E-1075) (Double).
Соответственно предел макс. абсолютной ошибки будет равен 1/2 шага числа: 2 (E-151) (Single) и 2 (E-1076) (Double).
Относительная ошибка в % будет равна: (2 (E-151) /F)*100%(Single) и (2 (E-1076) /F)*100% (Double).

Максимальная относительная ошибка для денормализованного числа(single/double):
32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

Максимальная относительная ошибка нормализованного числа(single):
32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

Максимальная относительная ошибка нормализованного числа(double):
32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

7.5 Общие сведенья для чисел одинарной и двойной точности стандарта IEEE 754.


§8. Округление чисел в стандарте IEEE 754.

Стандарт IEEE754 предусматривает четыре способа округления чисел.

§9. Проблемы компьютерных вычислений, вызванные использованием стандарта IEEE754.

Стандарт IEEE 754 широко применяется в технике и программировании.
Большинство современных микропроцессоров изготовляются с аппаратной реализацией представления вещественных переменных в формате IEEE754.
Язык программирования и программист не могут изменить эту ситуацию, иного преставления вещественного числа в микропроцессоре не существует.
Когда создавали стандарт IEEE754-1985 представление вещественной переменной в виде 4 или 8 байт казалось очень большой величиной, так как объём оперативной памяти MS-DOS был равен 1 Мб. А, программа в этой системе могла использовать только 0,64 Мб. Для современных ОС размер в 8 байт является ничтожным, тем не менее переменные в большинстве микропроцессоров продолжают представлять в формате IEEE754-1985.

Рассмотрим ошибки компьютерных вычислений, вызванные применением чисел в формате IEEE754.

9.1 Ошибки связанные с точностью представления вещественных чисел в формате IEEE754. Опасная редукция.

На самом деле ошибки точности представления числа наиболее безобидные в компьютерных вычислениях, и обычно многие программисты на них не обращают никакого внимания. Тем не менее они вас могут сильно огорчить.

9.2 Ошибки связанные с неправильным приведением типов данных. Дикие ошибки.

Эти ошибки вызваны тем, что исходное число представленное в формате single и в формате double обычно не равны друг другу.
Например: исходное число 123456789,123456789
Single: 4CEB79A3=+123456792,0(dec)
Double: 419D6F34547E6B75=+123456789,12345679104328155517578125
Разница между Single и Double составит:2,87654320895671844482421875

Вот пример на VB:
Относительная погрешность результата равна: &#8734 (бесконечности)
Такую ошибку называют «грязным нулем».
Если переменные привести к одному типу, то этой ошибки не будет.
Поэтому переменные и промежуточные результаты компьютерных вычислений должны быть приведены к одному типу данных.
Например, требование приведения данных к одному типу изложено в стандарте на язык Си ISO/IEC 9899:1999.

Обратите внимание на то, что недостаточно просто привести все исходные данные к одному типу. Необходимо привести также результаты промежуточных операций к одному типу.
Вот пример с ошибкой в промежуточном результате:

Здесь ошибка возникает потому, что промежуточный результат 1/3 в строке c=c-1/3 будет иметь тип double, а не single. Чтобы избавиться от ошибки вам надо привести промежуточный результат к типу single с помощью оператора приведения типов CSng. Пример приведения типа данных для GNU C, присланный Григорием Ситкаревым :

Если Вариант 1 (без приведения типов) выполнить с переменными двойной точности (double), то ошибки приведения данных не будет и Result=0.000000
Поэтому в большинстве случаев чтобы избавиться от приведения типов данных надо просто использовать тип данных double и забыть о существовании типа single(float).
Ошибки вычислений вызванные не приведением типов данных я называю «Дикими ошибками», так как они связаны с незнанием стандартов и теории программирования (т.е. с плохим фундаментальным образованием)

9.3 Ошибки вызванные сдвигом мантисс. Циклические дыры.

Эти ошибки связаны с потерей точности результата при неполном пересечении мантисс чисел на числовой оси.
Если мантиссы чисел не пересекаются на числовой оси, то операции сложения и вычитания между этими числами невозможны.
К примеру возьмём число Single: 47FFFFFF = +131071,9921875(dec)
В двоичной системе это число выглядит так: +11111111111111111,1111111

Покажем несколько компьютерных операций сложений и этим числом в формате Single
Значащих цифр в мантиссе двоичного числа в формате Single не более 24
Красным цветом показаны цифры выходящие за этот предел и не участвующие в формате Single

1. сложение с одинаковым числом (ошибка сдвига =0.0).
32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

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

Как видно из приведенных примеров ошибка сдвига возникает если у исходных нормализованных чисел различаются экспоненты. Если числа отличаются более чем в 2 23 (для single) и 2 52 (для double), то операции сложения и вычитания между этими числами не возможны.
Максимальная относительная погрешность результата операции равна примерно 5,96e-6%, что не превышает относительную погрешность представления числа (см.п.9.1).

Хотя с относительной погрешностью здесь всё в порядке, здесь есть другие проблемы.
Во-первых, работать с числами можно только в узком диапазоне числовой оси, где мантиссы пересекаются.
Во-вторых, для каждого исходного числа существует предел выполнения цикла называемый «Циклической дырой». Поясню, если существует цикл в котором исходное число суммируется к сумме, то существует численный предел суммы для этого числа. То есть сумма достигнув определённой величины перестает увеличиваться от сложения её с исходным числом.

Как вы понимаете, такая система работает в бесконечном цикле.
Допустим в один из дней фасовочная машина простояла слишком долго и бункер заполнился до 300 кг.
Что произойдет после её включения?

Упрощенный пример работы цикла программы управления: В данном примере фасовочная машина забрала из бункера 100 кг продукции, а вес продукции в бункере не изменился.
Почему не изменился?
Потому, что мантиссы чисел 300 и 0,00001 не пересекаются для формата single.

Далее формовочная машина доведет вес бункера до 500 кг и остановится. Фасовочная машина заберет все таблетки из бункера и тоже остановится. Программа будет показывать вес в бункере 500кг. Прибегут специалисты, проверят датчики, провода, компьютер и скажут что программа зависла. Но, программа не зависала, она продолжает работать без сбоев и любой контроль это подтвердит. Просто число 0,0001 попало в циклическую дыру и выйти из него не может.

В результате нам крупно повезло, что это был фармацевтический цех, а не Саяно-Шушенская ГЭС.

На самом деле опытный программист никогда не будет делать циклическое вычитание(или суммирование) таким образом. Этот пример вымышлен специально, и так считать нельзя, хотя с точки зрения математика здесь всё безупречно. Эта ошибка свойственна математикам и начинающим программистам.
Я бы сказал, что основная работа программиста заключается в борьбе с погрешностями, а не в математических решениях поставленной задачи.

Привожу правильный пример решения этой задачи, любезно предоставленный Ситкаревым Григорием: Показанный выше пример взят из реального промышленного кода.
Для наглядности упростим выше приведенный пример.
Как видно из этого примера, программисту приходится вычислять погрешность результата в каждом цикле, чтобы учесть её в следующем цикле.
Обратите внимание, что программист должен быть абсолютно готов к тому, что некоторые основные понятия математики могут не выполняться при вычислениях в формате IEEE754. Например, правила алгебраической коммутативности (a + b) + с = (a + c) + b, обычно не выполняются при таких вычислениях.
К сожалению, в современном фундаментальном математическом образовании этому вопросу уделяют мало внимания, оставляя решения проблем инструментария на прикладного программиста.

9.4 Ошибки вызванные округлением. Грязный ноль.

При компьютерных вычислениях можно выделить два вида округления:
1. Результат выполненной арифметической операции всегда округляется.
2. Вывод и ввод вещественного числа в окно Windows происходит с округлением.

В первом случае переменная округляется по одному из 4-типов округления IEEE754, по умолчанию округление происходит к ближайшему целому.
При этом переменная принимает новое округлённое значение.
В п.9.2 мы рассматривали сложение двух одинаковых чисел:

1. сложение с одинаковым числом (ошибка сдвига =0.0).
32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

Здесь результат операции сложения двух чисел абсолютно точен, но результат был округлен микропроцессором. Таким образом к точному результату была добавлена ошибка округления. В общем случае ошибка округления находится в пределах точности числа.

Во втором случае переменная не меняет своего значения, просто в окно Windows выводится округлённое значение вещественного числа. Получается, что исходная переменная и её отображение в окне Windows это разные числа. Это не ошибка формата IEEE754, это ошибка Windows.
Для переменных типа Single в окне Windows отображается 7 значащих цифр округлённых до ближайшего целого.
3DFCD6EA =+0,12345679104328155517578125 в окне отображается как 0,1234568
Для переменных типа Double в окне Windows отображается 15 значащих цифр округлённых до ближайшего целого.
3FBF9ADD3746F67D=+0,12345678901234609370352046653351862914860248565673828125 отображается как 0,123456789012346

Очень часто эта ошибка возникает в интерфейсе «оператор-машина».
Например, при обнулении тары в весовых программах.

Результат выполнения программы приведенного выше примера
32 bit float что это. Смотреть фото 32 bit float что это. Смотреть картинку 32 bit float что это. Картинка про 32 bit float что это. Фото 32 bit float что это

9.5 Ошибки на границе норма/денорма числа. Числа убийцы.

Эти ошибки возникают при работе с числами находящимися на границе нормализованного/денормализованного представления чисел. Они связанны с различием в представление чисел в формате IEEE754 и в различии формул перевода формата IEEE754 в вещественные числа. То есть устройства (или программы) должны применять различные алгоритмы в зависимости от положения вещественного числа на числовой оси формата. Кроме того, что это приводит к усложнению устройств и алгоритмов, ещё возникает неопределённость переходной зоны. Неопределённость переходной зоны заключается в том, что стандарт не определяет конкретного значения границы перехода. По сути дела граница перехода находится между двумя вещественными числами:
Последним денормализованным числом 000FFFFFFFFFFFFF:
Точное десятичное значение этого числа:
+2,2250738585072008890245868760858598876504231122409594654935248025624400092282356951787758888037591552642309780950
4343120858773871583572918219930202943792242235598198275012420417889695713117910822610439719796040004548973919380791
9893608152561311337614984204327175103362739154978273159414382813627511383860409424946494228631669542910508020181592
6642134996606517803095075913058719846423906068637102005108723282784678843631944515866135041223479014792369585208321
5976210663754016137365830441936037147783553066828345356340050740730401356029680463759185831631242245215992625464943
0083685186171942241764645513713542013221703137049658321015465406803539741790602258950302350193751977303094576317321
0852507299305089761582519159720757232455434770912461317493580281734466552734375e-308

и первым нормализованным числом 0010000000000000:
Точное десятичное значение этого числа:
+2,2250738585072013830902327173324040642192159804623318305533274168872044348139181958542831590125110205640673397310
3581100515243416155346010885601238537771882113077799353200233047961014744258363607192156504694250373420837525080665
0616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537
9358049921159810857660519924333521143523901487956996095912888916029926415110634663133936634775865130293717620473256
3178148566435087212282863764204484681140761391147706280168985324411002416144742161856716615054015428508471675290190
3161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680
984617210924625396728515625e-308
Так как граница является вещественным числом, то её точность можно задавать до бесконечности и цифровому устройству или программе может не хватить разрядности для принятия решения к какому диапазону отнести данное число.

§10 Заключение.

Из сказанного выше видно, что мнение о том, что при вычислениях с плавающей точкой результат не выходит за пределы относительной погрешности представления наибольшего числа является ложным. Ошибки перечисленные в п.9 складываются друг с другом. Такие ошибки как грязный ноль и опасная редукция могут сделать погрешность вычислений неприемлемой. Особое внимание при программировании компьютерных вычислений программист должен обратить на результаты близкие к нулю.

Некоторые специалисты считают, что этот формат чисел представляет угрозу человечеству.
Вы можете прочитать об этом в статье IEEE754-тика угрожает человечеству &nbsp
Хотя многие факты из этой статьи излишне драматизированы, и возможно неправильно интерпретированы, но проблема компьютерных вычислений философски отражена правильно.

Я не сторонник драматизации вычислений по стандарту IEEE754. Стандарт работает с 1985 года и полностью вошел в стандарт IEEE754-2008, который расширил точность вычислений. Но, проблема достоверности компьютерных вычислений сегодня очень актуальна, и стандарт IEEE754-2008 и рекомендации ISO не решили эту проблему. Я думаю, в этой области нужна инновационная идея, которой разработчики стандарта IEEE754-2008 к сожалению не обладают.

Если ученые(которые придумывают новое) и специалисты (которые знают как пользоваться известным) не могут решить проблему, то нужна инновация.

Можно представлять вещественные числа, как числа с фиксированной запятой. Для представления всего диапазона чисел Double достаточно иметь переменную состоящую из 1075 битов целой части и 1075 битов дробной части, т.е. около 270 байт на одну переменную. При этом все числа будут представлены с одинаковой абсолютной точностью. Можно работать с числами во всем диапазоне числовой оси, то есть становится возможным суммировать большие числа с малыми числами. Шаг чисел по числовой оси будет равномерен, то есть числовая ось будет линейна. Тип данных будет только один, т.е. не нужны целые, вещественные и др. типы. Здесь возникает проблема реализации регистров микропроцессоров размерностью в 270 байт, но это не проблема для современной технологии.

Для написания п.9 мне пришлось создать программу которая представляет числа в виде переменной с фиксированной точкой, длиною 1075,1075 байтов. Где число можно представить в виде строки символов ASCII, то есть один символ равен одному числовому разряду. Так же пришлось написать все арифметические операции при работе со строками ASCII. Это программа является аналогом бумажного расчета. Так как математические способности микропроцессора в ней не используются, то считает она довольно медленно. Зачем я это сделал?
Я не смог найти программы, которая смогла бы точно представить число формата IEEE754 в десятичном виде.
Так же я не нашел программы (хотя они безусловно есть, в чём нет сомнений) где в окно можно ввести 1075 значащих десятичных цифр.

Вот к примеру точно десятичное значение числа double 7FEFFFFFFFFFFFFF:
+17976931348623157081452742373170435679807056752584499659891747680315726078002853876058955 863276687817154045895351438246423432132688946418276846754670353751698604991057655128207624 549009038932894407586850845513394230458323690322294816580855933212334827479782620414472316 8738177180919299881250404026184124858368,0

Вы можете воспользоваться программой IEEE754 v.1.0 &nbsp
для изучения и оценки погрешностей при работе с вещественными числами представленными в формате IEEE754.

Список литературы:
1. IEEE Standard for Binary Floating-Point Arithmetic. Copyright 1985 by The Institute of Electrical and Electronics Engineers, Inc 345 East 47th Street, New York, NY 10017, USA

Источник

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

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