Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Ноль со знаком - это ноль с соответствующим знаком . В обычной арифметике число 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 .

Обозначение [ править ]

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

Арифметика [ править ]

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

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

  • (для отличных от 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]

См. Также [ править ]

  • Линия с двумя истоками
  • Отрицательная бесконечность

Ссылки [ править ]

  1. ^ Уильям Кахан , «Отрезки ветвей для сложных элементарных функций, или много шума из ничего не значащий бит», в «Современном состоянии искусства в численном анализе» (редакторы Изерлеса и Пауэлла), Clarendon Press, Oxford, 1987.
  2. ^ Уильям Кахан , Производные в комплексной z-плоскости , стр. 10.
  3. ^ Cowlishaw, Mike (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-е изд.) . 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