Zero negativo é zero com um sinal associado. Na aritmética ordinária, o número 0 tem um sinal, como em -0, +0 e 0. Na ciência da computação, algumas representações numéricas permitem a existência de dois zeros, muitas vezes denotados por -0 (zero negativo) e +0 (zero positivo), considerados iguais pelas operações de comparação numérica, mas com possíveis comportamentos diferentes em determinadas operações. Isso ocorre no sinal e na magnitude e nos complementos para uma representação de números com sinais inteiros e na maioria das representações de números de ponto flutuante.[1] O número 0 normalmente é codificado como +0, mas pode ser representado por +0, −0 ou, ainda, ±0, com sinal de mais ou menos.

O padrão IEEE 754 para aritmética de ponto flutuante (atualmente usado pela maioria dos computadores e linguagens de programação que suportam números de ponto flutuante) requer +0 e -0. A aritmética real com zeros negativos pode ser considerada uma variante da reta real estendida tal que 1/-0 = - e 1/+0 = +∞; divisão é apenas indefinida para ± 0/±0 e ±∞/±∞.[1][2]

O zero sinalizado negativamente ecoa o conceito da análise matemática de aproximar 0 para baixo como um limite unilateral, que pode ser denotado por x → 0, x → 0−, or x → ↑0. A notação "-0" pode ser usada informalmente para denotar um pequeno número negativo que foi arredondado para zero. O conceito de zero negativo também tem algumas aplicações teóricas na mecânica estatística e em outras disciplinas.[3]

Alega-se que a inclusão de zero com sinal no IEEE 754 facilita o alcance da precisão numérica em alguns problemas críticos,[4] em particular quando se computa com funções elementares complexas.[5] Por outro lado, o conceito de zero com sinal é contrário à suposição geral feita na maioria dos campos matemáticos de que zero negativo é a mesma coisa que zero. As representações que permitem zero negativo podem ser uma fonte de erros nos programas, se os desenvolvedores de software não levarem em conta que enquanto as duas representações de zero se comportam como iguais sob comparações numéricas, elas produzem resultados diferentes em algumas operações.[6]

Representações editar

A codificação de complemento de dois, amplamente utilizada não permite um zero negativo. Em uma representação de sinal e magnitude 1+7 bits de inteiros, o zero negativo é representado pela cadeia de bits 10000000. Em uma representação de complemento de um 8 bits, o zero negativo é representado pela cadeia de bits 11111111. Em todas as três codificações, o zero positivo é representado por 00000000.[7]

 
Zero negativo na representação IEEE 754 em 32 bits.

Em números binários de ponto flutuante IEEE 754, valores zero são representados pelo expoente polarizado e significando que ambos sendo zero. O zero negativo tem o bit de sinal definido para um. Um pode obter zero negativo como o resultado de determinados cálculos, por exemplo, como resultado de subfluxo aritmético em um número negativo, ou −1.0×0.0, ou simplesmente como −0.0.[1]

Na codificação de ponto flutuante decimal IEEE 754, um zero negativo é representado por um expoente que é qualquer expoente válido no intervalo para a codificação, o verdadeiro significando sendo zero, e o bit de sinal sendo um.

Propriedades e manuseio editar

O padrão de ponto flutuante IEEE 754 especifica o comportamento de zero positivo e zero negativo em várias operações. O resultado pode depender das definições do modo de arredondamento.[3]

Notação editar

Em sistemas que incluem zeros sinalizados e não sinalizados, a notação   e   é às vezes usada para zeros sinalizados.[2]

Arimética editar

A adição e a multiplicação são comutativas, mas há algumas regras especiais que devem ser seguidas, o que significa que as regras matemáticas usuais para a simplificação algébrica podem não se aplicar. O sinal   abaixo mostra o resultado sinalizado das operações.[3]

A regra usual para sinais é sempre seguida quando se multiplica ou divide:

  •   (para   diferente de 0)
  •  

Existem regras especiais para adicionar ou subtrair zero sinalizado:

  •   (para   diferente de 0)
  •  
  •  
  •   (para qualquer finito  , −0 quando arrendondado para negativo)

Devido ao zero negativo (e também quando o modo de arredondamento é para cima ou para baixo), as expressões −(xy) e (−x) − (−y), para variáveis de ponto flutuante x e y, não podem ser substituídas por yx. No entanto, (−0) + x podem ser substituídas por x com arredondamento para o mais próximo (exceto quando x pode ser uma sinalização NaN).[1][3]

Algumas outras regras especiais:[8]

  •  
  •   (segue a regra do sinal para a divisão)
  •   (para diferente de zero  , segue a regra do sinal para a divisão)
  •   (NaN ou suspende para uma forma inderteminada)
  •  

Divisão de um número diferente de zero por zero define a divisão por zero flag, e uma operação produzindo um NaN define o sinalizador de operação inválido.[9] Um tratamento de exceção é chamado se habilitado para o sinalizador correspondente.

Comparações editar

De acordo com a norma IEEE 754, o zero negativo e o zero positivo devem ser comparados com os operadores de comparação usuais (numéricos), como os operadores de C e Java.[10] Nessas línguas, truques de programação especiais podem ser necessários para distinguir os dois valores:[11]

  • Emulando os tipos (type punning) de número para um tipo inteiro, de modo a olhar para o bit de sinal no padrão de bits;
  • usando o ISO C copysign() função (IEEE 754 operação copySign) para copiar o sinal do zero para algum número diferente de zero;
  • usando o ISO C signbit() macro (IEEE 754 operação isSignMinus) que retorna se o bit de sinal de um número é definido;
  • tomando o recíproco do zero para obter 1/(+0) = +∞ ou 1/(−0) = −∞ (se a exceção da divisão por zero não esteja comprometida).

Nota:Convertendo o tipo integral não funcionará sempre, especialmente em sistemas de complemento de dois.

Entretanto, algumas linguagens de programação podem fornecer operadores de comparação alternativos que distinguem os dois zeros. Este é o caso, por exemplo, do método equals na classe wrapper Double da Java.[10]

Usos científicos editar

Informalmente, pode-se usar a notação "-0" para um valor negativo que foi arredondado para zero. Esta notação pode ser útil quando um sinal negativo é significativo; Por exemplo, ao tabular temperaturas Celsius, onde um sinal negativo significa "abaixo de zero".[12]

Na mecânica estatística, às vezes usa-se a temperatura negativa para descrever sistemas com inversão de população, que pode ser considerada como tendo uma temperatura maior do que o infinito positivo, porque o coeficiente de energia na função de distribuição da população é & menos;1/Temperatura. Neste contexto, uma temperatura de minus 0 é uma temperatura (teórica) maior do que qualquer outra temperatura negativa, correspondendo à extensão máxima (teórica) possível de inversão da população, o extremo oposto a +0.[13]

Referências

  1. a b c d Steve Hollasch. «IEEE Standard 754 Floating Point Numbers». steve.hollasch.net. Consultado em 9 de abril de 2017 
  2. a b John D. Cook (15 de junho de 2010). «Why computers have two zeros: +0 and -0». johndcook.com (em inglês). Consultado em 9 de abril de 2017 
  3. a b c d Xavier Rival, ed. (2016). Static Analysis: 23rd International Symposium (em inglês). Edimburgo, Reino Unido: Springer. p. 321. ISBN 3662534134. Consultado em 9 de abril de 2017 
  4. William Kahan, edited by; Powell, M.J.D. (1987). A. Iserles, ed. The state of the art in numerical analysis : proceedings of the Joint IMA/SIAM Conference on the State of the Art in Numerical Analysis held at the University of Birmingham, 14-18 April 1986. Oxford, Reino Unido: Clarendon Press. ISBN 0-198-53614-3 
  5. William Kahan (16 de maio de 2008). «Derivatives in the Complex» (pdf) (em inglês). p. 10. Consultado em 9 de abril de 2017 
  6. Robert C. Seacord (27 de janeiro de 2017). «INT32-C. Ensure that operations on signed integers do not result in overflow». CERT Secure Coding Standards (em inglês). Consultado em 9 de abril de 2017 
  7. «4.11. Sign-Magnitude» (em inglês). University of Wisconsin-Milwaukee. Consultado em 9 de abril de 2017 
  8. COWLISHAW, Mike (7 de abril de 2009). «Decimal Arithmetic: Arithmetic operations snd square-root». speleotrove.com (em inglês). Consultado em 9 de abril de 2017 
  9. «elop Support USA (English) Sign In Search Intel.com Sign In to access restricted content. Intel® 64 and IA-32 Architectures Developer's Manual» (pdf). intel.com (em inglês). p. 242, 258, 271. Consultado em 9 de abril de 2017 
  10. a b «Double (Java Platform SE 6)» (em inglês). Oracle. Consultado em 9 de abril de 2017 
  11. Tim Lindholm, Frank Yellin, Gilad Bracha, Alex Buckley (2013). The Java Virtual Machine Specification, Java SE 7 Edition. [S.l.]: Addison-Wesley. ISBN 0133260461. Consultado em 9 de abril de 2017 
  12. «Temperature Scales». quadibloc.com (em inglês). Consultado em 9 de abril de 2017 
  13. Kittel, Charles e Herbert Kroemer (1980). Thermal Physics (2nd ed.). [S.l.]: W. H. Freeman Company. p. 462. ISBN 0-7167-1088-9