Знаковый ноль
Знаковый ноль — это ноль с соответствующим знаком . В обычной арифметике число 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 нулевые значения представлены смещенной экспонентой, а мантисса равна нулю. Отрицательный ноль имеет знаковый бит, равный единице. Отрицательный ноль можно получить в результате определенных вычислений, например, в результате арифметического опустошения отрицательного числа (возможны и другие результаты), или −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()
функция (операция IEEE 754 copySign) для копирования знака нуля в некоторое ненулевое число; - используя ISO C
signbit()
макрос (операция IEEE 754 isSignMinus), который возвращает, установлен ли знаковый бит числа; - взяв обратную величину нулю, чтобы получить либо 1/(+0) = +∞, либо 1/(−0) = −∞ (если исключение деления на ноль не перехвачено).
Примечание. Приведение к целочисленному типу не всегда работает, особенно в системах с двойным дополнением.
Однако некоторые языки программирования могут предоставлять альтернативные операторы сравнения, которые различают два нуля. Так обстоит дело, например, с метод равенства в Java Double
класс оболочки . [4]
В округленных значениях, таких как температура
[ редактировать ]Неформально можно использовать обозначение «-0» для отрицательного значения, округленного до нуля. Это обозначение может быть полезно, когда отрицательный знак имеет значение; например, при составлении таблицы температур по Цельсию , где отрицательный знак означает температуру ниже нуля .
В статистической механике
[ редактировать ]В статистической механике иногда используются отрицательные температуры для описания систем с инверсной населенностью , которые, как можно считать, имеют температуру больше положительной бесконечности, поскольку коэффициент энергии в функции распределения населенностей равен -1/Температура. В этом контексте температура -0 является (теоретической) температурой, большей, чем любая другая отрицательная температура, что соответствует (теоретической) максимально возможной степени инверсии населенности, противоположному экстремуму +0. [5]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Уильям Кахан , «Разрезы для сложных элементарных функций, или Много шума из-за ничтожного знакового бита», в «Современном состоянии численного анализа » (редакторы Изерлза и Пауэлла), Clarendon Press, Оксфорд, 1987.
- ^ Уильям Кахан , Производные в комплексной z-плоскости , с. 10.
- ^ Коулишоу, Майк (7 апреля 2009 г.). «Десятичная арифметика: Арифметические операции – извлечение квадратного корня» . speleotrove.com ( Корпорация IBM ) . Проверено 7 декабря 2010 г.
- ^ "Двойной" . Платформа Java™, стандартная версия 6, спецификация API . Справочный центр Oracle. Архивировано из оригинала 4 августа 2009 г.
- ^ Киттель, Чарльз и Герберт Кремер (1980). Теплофизика (2-е изд.) . WH Фриман и компания . п. 462. ИСБН 0-7167-1088-9 .
- «Типы с плавающей запятой» . Спецификация языка MSDN C# . Архивировано из оригинала 6 декабря 2005 года . Проверено 15 октября 2005 г.
- «Оператор дивизиона» . Спецификация языка MSDN C# . Архивировано из оригинала 21 ноября 2005 года . Проверено 15 октября 2005 г.
- Томас Ван (сентябрь 2000 г.) [март 2000 г.]. «Трудности чисел с плавающей запятой в Java» . Архивировано из оригинала 21 сентября 2005 г.
- Майк Колишоу (28 июля 2008 г.). «Спецификация десятичной арифметики, версия 1.68» . Спелеотров . Проверено 14 августа 2008 г. – десятичная спецификация с плавающей запятой, которая включает отрицательный ноль
Дальнейшее чтение
[ редактировать ]- Майкл Инграссия. «Изменение ЗНАКА Фортрана 95» . Сеть разработчиков Sun. Проверено 15 октября 2005 г. — изменения в Фортране
SIGN
функция в Фортране 95 для размещения отрицательного нуля - «Типы данных JScript» . MSDN JScript . Проверено 16 октября 2005 г. – Тип JScript с плавающей запятой с отрицательным нулем по определению.
- Веннерс, Билл (1 октября 1996 г.). «Арифметика с плавающей запятой» . Изучите Java. JavaWorld . Под капотом . Проверено 14 июля 2020 г. – представление отрицательного нуля в виртуальной машине Java
- Брюс Доусон (25 февраля 2012 г.). «Сравнение чисел с плавающей запятой, издание 2012 г.» . – как обрабатывать отрицательный ноль при сравнении чисел с плавающей запятой
- Джон Уокер . «Минус ноль» . УНИВАК Воспоминания . Проверено 17 октября 2005 г. – дополнительные номера на компьютерах семейства UNIVAC 1100