−0 (программирование)

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

−0 (отрицательный ноль) в программировании — число, возникающее при вычислениях с плавающей запятой (а также в некоторых вариантах представления целых со знаком).

Представления[править | править код]

В 1+7-битном представлении чисел со знаком отрицательный ноль представляется двоичным значением 10000000 в прямом коде. В 8-битном одинарном обратном коде −0 представляется двоичным значением 11111111. В стандарте представления чисел с плавающей запятой IEEE 754, отрицательный ноль представляется нулевой экспонентой и мантиссой и знаковым битом равным единице.

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

Свойства[править | править код]

В языках программирования, таких как C, C#, C++ и Java, хотя и возможно получить отрицательный ноль в качестве результата вычисления выражения, при сравнении отрицательный ноль равен положительному, поэтому простое сравнение не может быть использовано для определения того, является ли число отрицательным нулём. Для проверки на отрицательный ноль можно использовать функцию CopySign(), определённую в IEEE 754, которая копирует знак числа (в данном случае нуля) в другое число (для проверки знака нужно взять ненулевое).

Для определения знака нуля можно также использовать деление:

  • (для положительного x);
  • (для положительного x).

Результат других операций с отрицательным нулём:

  • (для положительного x);
  • (для отрицательного x);
  • (для отрицательного x);
  • ;
  • ;
  • ;
  • ;
  • ;
  • ;
  • ;
  • ;
  • (для положительного x);
  • ;
  • [1];
  • , где NaN (англ. Not-a-Number) — машинное представление значения с неопределённым результатом;
  • .

В математике[править | править код]

Определения операций для нуля со знаком отражают свойства операций с бесконечно малыми величинами в математическом анализе, хотя не всегда точно соответствуют им. Так, например, свойства , , определённые в стандарте IEEE 754, не имеют математического обоснования.

См. также[править | править код]

Примечания[править | править код]

  1. Cowlishaw, Mike Decimal Arithmetic: Arithmetic operations – square-root (англ.). speleotrove.com (IBM Corporation) (7 апреля 2009). Дата обращения: 7 декабря 2010. Архивировано 28 августа 2017 года.

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

  • Floating point types (англ.). MSDN C# Language Specification. Дата обращения: 15 октября 2005. Архивировано из оригинала 26 сентября 2009 года.
  • Division operator (англ.). MSDN C# Language Specification. Дата обращения: 15 октября 2005. Архивировано из оригинала 3 декабря 2009 года.
  • Java Floating-Point Number Intricacies, Thomas Wang, март 2000
  • Specification (англ.). General Decimal Arithmetic: Encoding Strawman 4d, version 0.96. Дата обращения: 16 октября 2005. Архивировано из оригинала 16 октября 2006 года. — десятичная спецификация чисел с плавающей точкой включающая отрицательный нуль
  • Charles Kittel, Herbert Kroemer, Thermal Physics, W. H. Freeman & Company, 1980

Для более углублённого изучения[править | править код]

  • Michael Ingrassia. Fortran 95 SIGN Change (англ.). Sun Developer Network. Дата обращения: 15 октября 2005. Архивировано из оригинала 5 сентября 2006 года. — изменения в функции SIGN в Fortran 95 для работы с отрицательным нулём
  • JScript data types (англ.). MSDN JScript. Дата обращения: 16 октября 2005. Архивировано из оригинала 6 декабря 2005 года. — арифметика с плавающей точкой в JScript содержит отрицательный нуль по определению
  • A look at the floating-point support of the Java virtual machine (англ.). Javaworld. Дата обращения: 16 октября 2005. Архивировано из оригинала 16 октября 2006 года. — представление отрицательного нуля в Java virtual machine
  • Comparing floating point numbers, Bruce Dawson — как обращаться с отрицательным нулём при сравнении чисел с плавающей точкой
  • John Walker. Minus Zero (англ.). UNIVAC Memories. Дата обращения: 17 октября 2005. Архивировано из оригинала 25 сентября 2006 года. — Числа в одинарном дополнительном коде на семействе компьютеров UNIVAC 1100.