stringtranslate.com

Знаковый ноль

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

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

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

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

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

Двоичные целочисленные форматы могут использовать различные кодировки . В широко используемой кодировке с дополнением до двух ноль не имеет знака. В 1+7-битном знаково-величинном представлении для целых чисел отрицательный ноль представлен битовой строкой 1000 0000. В 8-битном представлении с дополнением до единиц отрицательный ноль представлен битовой строкой 1111 1111. Во всех этих трех кодировках положительный или беззнаковый ноль представлен 0000 0000. Однако последние две кодировки (со знаковым нулем) нетипичны для целочисленных форматов. Наиболее распространенными форматами со знаковым нулем являются форматы с плавающей точкой ( форматы IEEE 754 или аналогичные), описанные ниже.

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

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

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

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

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

Обозначение

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

Арифметика

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

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

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

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

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

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

Сравнения

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

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

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

В округленных значениях, таких как температура

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

В статистической механике

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

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

Ссылки

  1. Уильям Кахан , «Разрезы ветвей для сложных элементарных функций, или Много шума из ничего», в книге «Современное состояние численного анализа» (ред. Исерлес и Пауэлл), Clarendon Press, Оксфорд, 1987.
  2. ^ Уильям Кахан , Производные в комплексной z-плоскости, стр. 10.
  3. ^ Коулишоу, Майк (7 апреля 2009 г.). «Десятичная арифметика: Арифметические операции – квадратный корень». speleotrove.com ( Корпорация IBM ) . Получено 7 декабря 2010 г.
  4. ^ "Double". Java™ Platform, Standard Edition 6 API Specification . Oracle Help Center. Архивировано из оригинала 4 августа 2009 г.
  5. ^ Киттель, Чарльз и Герберт Кремер (1980). Теплофизика (2-е изд.) . WH Freeman and Company . стр. 462. ISBN 0-7167-1088-9.

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