Ноль со знаком - это ноль с соответствующим знаком . В обычной арифметике число 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 нулевые значения представлены смещенной экспонентой и мантиссой, оба равны нулю. Отрицательный ноль имеет бит знака, равный единице. Отрицательный ноль может быть получен в результате определенных вычислений, например, в результате арифметической потери значимости отрицательного числа, или −1.0×0.0
, или просто как −0.0
.
В десятичном кодировании с плавающей запятой IEEE 754 отрицательный ноль представлен экспонентой, которая является любой действительной экспонентой в диапазоне для кодирования, истинное значение равно нулю, а знаковый бит равен единице.
Свойства и обращение
Стандарт IEEE 754 с плавающей запятой определяет поведение положительного и отрицательного нуля при различных операциях. Результат может зависеть от текущих настроек режима округления IEEE .
Обозначение
В системах, которые включают как знаковые, так и беззнаковые нули, обозначение а также иногда используется для знаковых нулей.
Арифметика
Сложение и умножение коммутативны, но есть некоторые особые правила, которые необходимо соблюдать, а это означает, что обычные математические правила алгебраического упрощения могут не применяться. В знак ниже показывает подписанный результат операций.
При умножении или делении всегда соблюдается обычное правило для знаков:
- (для отличается от ± ∞)
- (для отличается от 0)
Существуют специальные правила для добавления или вычитания нуля со знаком:
- (для отличается от 0)
- (для любого конечного , −0 при округлении в отрицательную сторону)
Из-за отрицательного нуля (а также при режиме округления в сторону увеличения или уменьшения) выражения - ( x - y ) и (- x ) - (- y ) для переменных с плавающей запятой x и y не могут быть заменены на y. - х . Однако (-0) + x можно заменить на x с округлением до ближайшего (кроме случаев, когда x может быть сигнальным NaN ).
Некоторые другие особые правила:
- [3]
- (следует правилу знаков для разделения)
- (для ненулевого , следует правилу знаков для деления)
- ( Не число или прерывание для неопределенной формы )
Деление ненулевого числа на ноль устанавливает флаг деления на ноль , а операция, производящая NaN, устанавливает флаг недопустимой операции. Обработчик исключений вызывается , если включен для соответствующего флага.
Сравнения
Согласно стандарту IEEE 754 отрицательный ноль и положительный ноль должны сравниваться как равные с обычными (числовыми) операторами сравнения, такими как ==
операторы C и Java . На этих языках могут потребоваться специальные приемы программирования, чтобы различать два значения:
- Введите каламбур числа в целочисленный тип, чтобы посмотреть на знаковый бит в битовом шаблоне;
- использование функции ISO C
copysign()
(операция copySign IEEE 754) для копирования знака нуля в некоторое ненулевое число; - использование
signbit()
макроса ISO C (операция isSignMinus IEEE 754), который возвращает, установлен ли знаковый бит числа; - взяв величину, обратную нулю, чтобы получить либо 1 / (+ 0) = + ∞, либо 1 / (- 0) = −∞ (если исключение деления на ноль не зафиксировано).
Примечание: Кастинг для интегрального типа не всегда будет работать, особенно на два в системах комплемента.
Однако некоторые языки программирования могут предоставлять альтернативные операторы сравнения, которые действительно различают два нуля. Так обстоит дело, например, с методом equals в Double
классе оболочки Java . [4]
В округленных значениях, например, температурах
Неформально можно использовать обозначение «-0» для отрицательного значения, которое было округлено до нуля. Это обозначение может быть полезно, когда отрицательный знак имеет значение; например, при табулировании температур по Цельсию , где отрицательный знак означает температуру ниже нуля .
В статистической механике
В статистической механике иногда используют отрицательные температуры для описания систем с инверсией населенностей , которые можно рассматривать как имеющие температуру больше положительной бесконечности, потому что коэффициент энергии в функции распределения населенностей равен −1 / Температура. В этом контексте температура -0 является (теоретической) температурой выше, чем любая другая отрицательная температура, что соответствует (теоретической) максимальной мыслимой степени инверсии населенности, противоположной крайнему значению для +0. [5]
Смотрите также
- Линия с двумя истоками
- Отрицательная бесконечность
Рекомендации
- ^ Уильям Кахан , "Отрезки ветвей для сложных элементарных функций, или много шума из ничего не значащий бит", в Современном состоянии в области численного анализа (редакторы Изерлеса и Пауэлла), Clarendon Press, Оксфорд, 1987.
- ^ Уильям Кахан , Производные в комплексной z-плоскости , стр. 10.
- ^ Cowlishaw, Mike (7 апреля 2009). «Десятичная арифметика: арифметические операции - извлечение квадратного корня» . speleotrove.com ( корпорация IBM ) . Проверено 7 декабря 2010 года .
- ^ http://java.sun.com/javase/6/docs/api/java/lang/Double.html#equals(java.lang.Object)
- ^ Киттель, Чарльз и Герберт Кремер (1980). Теплофизика (2-е изд.) . WH Freeman and Company . п. 462. ISBN. 0-7167-1088-9.
- «Типы с плавающей запятой» . Спецификация языка MSDN C # . Источник +15 Октябрь +2005 .
- «Оператор деления» . Спецификация языка MSDN C # . Источник +15 Октябрь +2005 .
- Томас Ван (март 2000 г.). «Тонкости работы с числами с плавающей запятой в Java» . Сентябрь 2000 года архивация от оригинала на 2005-09-21. Цитировать журнал требует
|journal=
( помощь ) - Майк Колишоу (28 июля 2008 г.). «Спецификация десятичной арифметики, версия 1.68» . Проверено 14 августа 2008 . - спецификация десятичной с плавающей запятой, которая включает отрицательный ноль
дальнейшее чтение
- Майкл Инграссиа. «Изменение знака Fortran 95» . Sun Developer Network . Проверено 15 октября 2005 года . - изменения в Fortran
SIGN
функции в Fortran 95 для размещения отрицательного нуля - «Типы данных JScript» . MSDN JScript . Проверено 16 октября 2005 года . - Тип JScript с плавающей точкой с отрицательным нулем по определению
- Веннерс, Билл (1 октября 1996 г.). «Арифметика с плавающей точкой» . Изучите Java. JavaWorld . Под капотом . Проверено 14 июля 2020 . - представление отрицательного нуля в виртуальной машине Java
- Брюс Доусон (25 февраля 2012 г.). «Сравнение чисел с плавающей запятой, издание 2012 г.» . - как обрабатывать отрицательный ноль при сравнении чисел с плавающей запятой
- Джон Уокер . «Минус ноль» . Воспоминания UNIVAC . Проверено 17 октября 2005 года . - дополнительные номера на компьютерах семейства UNIVAC 1100