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

Дифференциация положительного и отрицательного нуля

Знаковый ноль — это ноль с соответствующим знаком . В обычной арифметике число 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-битном знаково-величинном представлении для целых чисел отрицательный ноль представлен битовой строкой . В 8-битном представлении с дополнением до единиц отрицательный ноль представлен битовой строкой . Во всех этих трех кодировках положительный или беззнаковый ноль представлен . Однако последние две кодировки (со знаковым нулем) нечасто встречаются для целочисленных форматов. Наиболее распространенными форматами со знаковым нулем являются форматы с плавающей точкой ( форматы IEEE 754 или аналогичные), описанные ниже.100000001111111100000000

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

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

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

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

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

Обозначение

В системах, включающих как знаковые, так и беззнаковые нули, для знаковых нулей иногда используется обозначение и . 0 + {\displaystyle 0^{+}} 0 {\displaystyle 0^{-}}

Арифметика

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

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

  • ( 0 ) | х | = 0 {\displaystyle (-0)\cdot \left|x\right|=-0\,\!} (для отличного от ±∞) х {\displaystyle x}
  • 0 | х | = 0 {\displaystyle {\frac {-0}{\left|x\right|}}=-0\,\!} (для отличного от 0) х {\displaystyle x}
  • ( 0 ) ( 0 ) = + 0 {\displaystyle (-0)\cdot (-0)=+0\,\!}

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

  • х + ( ± 0 ) = х {\displaystyle x+(\pm 0)=x\,\!} (для отличного от 0) х {\displaystyle x}
  • ( 0 ) + ( 0 ) = ( 0 ) ( + 0 ) = 0 {\displaystyle (-0)+(-0)=(-0)-(+0)=-0\,\!}
  • ( + 0 ) + ( + 0 ) = ( + 0 ) ( 0 ) = + 0 {\displaystyle (+0)+(+0)=(+0)-(-0)=+0\,\!}
  • х х = х + ( х ) = + 0 {\displaystyle xx=x+(-x)=+0\,\!} (для любого конечного , −0 при округлении в сторону отрицательного) х {\displaystyle x}

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

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

  • | 0 | = + 0 {\displaystyle \left|-0\right|=+0\,\!}
  • 0 = 0 {\displaystyle {\sqrt {-0}}=-0\,\!} [3]
  • 0 = + 0 {\displaystyle {\frac {-0}{-\infty }}=+0\,\!} (следует правилу знаков для деления)
  • | х | 0 = {\displaystyle {\frac {\left|x\right|}{-0}}=-\infty \,\!} (для ненулевых чисел действует правило знаков деления) х {\displaystyle x}
  • ± 0 × ± = NaN {\displaystyle {\pm 0}\times {\pm \infty }={\mbox{NaN}}\,\!} ( Не число или прерывание для неопределенной формы )
  • ± 0 ± 0 = NaN {\displaystyle {\frac {\pm 0}{\pm 0}}={\mbox{NaN}}\,\!}

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

Сравнения

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

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

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

Однако некоторые языки программирования могут предоставлять альтернативные операторы сравнения, которые различают два нуля. Это касается, например, метода 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.
  • "Типы с плавающей точкой". MSDN C# Language Specification . Архивировано из оригинала 6 декабря 2005 г. Получено 15 октября 2005 г.
  • "Оператор деления". MSDN C# Language Specification . Архивировано из оригинала 21 ноября 2005 г. Получено 15 октября 2005 г.
  • Томас Ванг (сентябрь 2000 г.) [март 2000 г.]. "Java Floating-Point Number Intricacies". Архивировано из оригинала 21-09-2005.
  • Майк Колишоу (28 июля 2008 г.). "Спецификация десятичной арифметики, версия 1.68". Speleotrove . Получено 14.08.2008 . – десятичная спецификация с плавающей точкой, включающая отрицательный ноль

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

  • Майкл Инграссия. "Fortran 95 SIGN Change". Sun Developer Network . Получено 15 октября 2005 г. – изменения в функции Fortran SIGN в Fortran 95 для учета отрицательного нуля
  • "Типы данных JScript". MSDN JScript . Получено 16 октября 2005 г. . – Тип с плавающей точкой JScript с отрицательным нулем по определению
  • Веннерс, Билл (1 октября 1996 г.). "Арифметика с плавающей точкой". Изучите Java. JavaWorld . Под капотом . Получено 14.07.2020 . – представление отрицательного нуля в виртуальной машине Java
  • Брюс Доусон (25 февраля 2012 г.). «Сравнение чисел с плавающей точкой, издание 2012 г.». – как обрабатывать отрицательный ноль при сравнении чисел с плавающей точкой
  • Джон Уокер . "Минус Ноль". UNIVAC Memories . Получено 17 октября 2005 г. – числа с дополнительным кодом на компьютерах семейства UNIVAC 1100
Взято с "https://en.wikipedia.org/w/index.php?title=Signed_zero&oldid=1257867423"