Подписанный ноль - Википедия - Signed zero

Подписанный ноль является нуль с ассоциированным знак. В обычной арифметике число 0 не имеет знака, поэтому -0, +0 и 0 идентичны. Однако в вычисление, некоторые представления чисел допускают существование двух нулей, часто обозначаемых −0 (отрицательный ноль) и +0 (положительный ноль), рассматриваемые как равные при операциях численного сравнения, но с возможным различным поведением в конкретных операциях. Это происходит в знак и величина и дополнение представление числа со знаком для целых чисел и в большинстве число с плавающей запятой представления. Число 0 обычно кодируется как +0, но может быть представлено как +0, так и -0.

В IEEE 754 стандарт для арифметики с плавающей запятой (в настоящее время используется большинством компьютеров и языков программирования, поддерживающих числа с плавающей запятой) требует как +0, так и −0. Действительную арифметику со знаковыми нулями можно рассматривать как вариант расширенная строка действительных чисел такое, что 1 / −0 = - и 1 / + 0 = + ∞; разделение только неопределенный за ± 0 / ± 0 и ± ∞ / ± ∞.

Ноль со знаком с отрицательным знаком повторяет математический анализ концепция приближения к 0 снизу как односторонний предел, который можно обозначить как Икс → 0, Икс → 0−, или Икс → ↑ 0. Обозначение «-0» может использоваться неформально для обозначения небольшого отрицательного числа, которое было округлый до нуля. Концепция отрицательного нуля также имеет некоторые теоретические приложения в статистическая механика и другие дисциплины.

Утверждается, что включение нуля со знаком в IEEE 754 значительно упрощает достижение числовой точности в некоторых критических задачах,[1] в частности при вычислениях с сложный элементарные функции.[2] С другой стороны, концепция нуля со знаком противоречит общему предположению, сделанному в большинстве математических областей, что отрицательный ноль - это то же самое, что и ноль. Представления, допускающие отрицательный ноль, могут быть источником ошибок в программах, если разработчики программного обеспечения не принимают во внимание, что, хотя два нулевых представления ведут себя как равные при числовых сравнениях, они дают разные результаты в некоторых операциях.

Представления

Широко используемый два дополнения кодировка не допускает отрицательного нуля. В 1 + 7-битном знак и величина представление для целых чисел, отрицательный ноль представлен битовой строкой 10000000. В 8-битном дополнение представление, отрицательный ноль представлен битовой строкой 11111111. Во всех трех кодировках положительный ноль представлен как 00000000. Однако это необычные форматы, наиболее распространенными форматами, включая отрицательный ноль, являются форматы с плавающей запятой IEEE 754, описанные ниже.

Отрицательный ноль по представлению IEEE 754 в двоичный32

В IEEE 754 двоичные числа с плавающей запятой, нулевые значения представлены смещенной экспонентой и значимое оба равны нулю. Отрицательный ноль имеет бит знака, равный единице. Отрицательный ноль может быть получен в результате определенных вычислений, например, в результате арифметическое истощение на отрицательное число, или −1.0×0.0, или просто как −0.0.

В десятичном кодировании с плавающей запятой IEEE 754 отрицательный ноль представлен экспонентой, являющейся любой действительной экспонентой в диапазоне для кодирования, истинное значение равно нулю, а знаковый бит равен единице.

Свойства и обращение

Стандарт IEEE 754 с плавающей запятой определяет поведение положительного и отрицательного нуля при различных операциях. Результат может зависеть от текущего Режим округления IEEE настройки.

Обозначение

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

Арифметика

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

При умножении или делении всегда соблюдается обычное правило для знаков:

  • (за отличается от 0)

Существуют специальные правила для добавления или вычитания нуля со знаком:

  • (за отличается от 0)
  • (для любого конечного , −0 при округлении в отрицательную сторону)

Из-за отрицательного нуля (а также при использовании режима округления вверх или вниз) выражения −(Иксу) и (−Икс) − (−у), для переменных с плавающей запятой Икс и у, нельзя заменить на уИкс. тем не мение (−0) + Икс можно заменить на Икс с округлением до ближайшего (кроме Икс может быть сигнализация NaN ).

Некоторые другие особые правила:

  • [3]
  • (следует правилу знаков для разделения)
  • (для ненулевого , следует правилу знаков для деления)
  • (Не число или прервать неопределенная форма )

Деление ненулевого числа на ноль устанавливает деление на ноль. флаг, и операция, производящая NaN, устанавливает флаг недопустимой операции. An обработчик исключений вызывается, если включен соответствующий флаг.

Сравнения

Согласно стандарту IEEE 754, отрицательный ноль и положительный ноль должны сравниваться как равные с обычными (числовыми) операторами сравнения, такими как == операторы C и Ява. На этих языках могут потребоваться специальные приемы программирования, чтобы различать два значения:

  • Набросок типа число к целочисленному типу, чтобы смотреть на бит знака в битовой комбинации;
  • используя ISO C copysign () функция (операция copySign IEEE 754) для копирования знака нуля в какое-то ненулевое число;
  • используя ISO C signbit () макрос (операция isSignMinus IEEE 754), который возвращает, установлен ли знаковый бит числа;
  • взяв величину, обратную нулю, чтобы получить либо 1 / (+ 0) = + ∞, либо 1 / (- 0) = −∞ (если деление на ноль исключение не перехвачено).

Примечание: Кастинг к интегральному типу не всегда сработает, особенно в системах с двумя дополнениями.

Однако некоторые языки программирования могут предоставлять альтернативные операторы сравнения, которые действительно различают два нуля. Так обстоит дело, например, с равно метод в Java Двойной класс-оболочка.[4]

Научное использование

Неформально можно использовать обозначение «-0» для отрицательного значения, которое было округлено до нуля. Это обозначение может быть полезно, когда отрицательный знак имеет значение; например, при составлении таблиц Цельсия температуры, где отрицательный знак означает ниже нуля.

В статистической механике иногда используют отрицательные температуры описывать системы с инверсия населения, который можно считать имеющим температуру больше положительной бесконечности, потому что коэффициент энергии в функции распределения населения равен -1 / Температура. В этом контексте температура -0 является (теоретической) температурой выше, чем любая другая отрицательная температура, что соответствует (теоретической) максимальной мыслимой степени инверсии населенности, противоположной экстремальной точке +0.[5]

Смотрите также

Рекомендации

  1. ^ Уильям Кахан, «Отрезки ветвей для сложных элементарных функций, или много шума из ничего не значащего бита», в Современное состояние численного анализа (ред. Изерлеса и Пауэлла), Clarendon Press, Oxford, 1987.
  2. ^ Уильям Кахан, Производные в комплексной z-плоскости, п. 10.
  3. ^ Коулишоу, Майк (7 апреля 2009 г.). «Десятичная арифметика: арифметические операции - извлечение квадратного корня». speleotrove.com (Корпорация IBM ). Получено 7 декабря 2010.
  4. ^ http://java.sun.com/javase/6/docs/api/java/lang/Double.html#equals(java.lang.Object)
  5. ^ Киттель, Чарльз и Герберт Кремер (1980). Теплофизика (2-е изд.). Компания W.H. Freeman. п. 462. ISBN  0-7167-1088-9.

дальнейшее чтение