@howdypierceHowdy Pierce
Presidente e Fundador
a Minha mulher traz a seguinte história a qualquer momento ela quer fazer o ponto de que eu sou pedante: Quando uma de minhas filhas estava no segundo grau, seu professor de matemática disse para a turma que qualquer número dividido por zero e um. Descarreguei um e-mail apaixonado para o professor, insistindo que o resultado tinha de ser indefinido. Supostamente, isto é prova de que às vezes sou difícil de estar por perto.acontece que a piada pode estar em mim — embora ainda seja difícil apoiar a resposta do professor do segundo ano. Recentemente aprendi um monte de coisas que eu não sabia sobre matemática de ponto flutuante:
- Há um valor para zero negativo, separado do regular (positivo?) zero. Estes dois zeros são definidos para serem iguais um ao outro e ainda assim são valores distintos.x ÷ 0, 0, para x ≠ ±0.0, não é um erro. Em vez disso, o resultado é infinito positivo ou infinito negativo, seguindo a Convenção de sinais usual.
- o caso de ±0, 0 ÷ ± 0, 0 é um erro (especificamente é “não um número” ou NaN).
- -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, and -0.0 × 0.0 = -0.0
These rules stem from the IEEE 754 “Standard for Floating-Point Arithmetic”, which standardized floating point representations across platforms. A versão mais recente do padrão foi concluída em 2008, mas a versão original foi emitida em 1985, de modo que este comportamento não é novo. As regras acima são verdadeiras tanto em C (gcc) e Swift no meu Mac, e também em Swift em um iPhone. Python no Mac suporta zero negativo para flutuadores, mas lança uma exceção quando você tenta dividir por zero de qualquer sinal.
Existem alguns corolários surpreendentes para estas regras:
- Porque 0, 0 e-0, 0 devem comparar-se como iguais, o teste (x< 0.0) não retorna verdadeiro para cada número negativo-ele falha para zero negativo. Portanto, para determinar o sinal de um valor zero, você precisa usar a função de sinais embutidos da plataforma, por exemplo o dobro.assine Swift. Ou acho que podes manipular a representação bruta do duplo, o que é a resposta de um programador C.
- Se a = b ÷ c, não necessariamente segue que b = A × c, porque isso também falha para o caso em que c é zero de qualquer um dos sinais.não sou um teórico dos números, mas acho os conceitos acima surpreendentes.um problema imediato: O infinito não é um número, como zero ou 3.25 ou π. Pelo contrário, o infinito é um conceito. É verdade que os números racionais são contavelmente infinitos — mas o infinito não é um membro do conjunto dos números racionais.
além disso, a partir de uma perspectiva da teoria dos números, a divisão por zero é absurda. Você pode entender por que se você ficar preciso sobre o que a divisão significa. Tecnicamente, “divisão” é “multiplicação pelo inverso de um número”, onde o inverso satisfaz: a × a^-1 = 1. Zero é o único número no conjunto de números reais que simplesmente não tem inverso multiplicativo. E como este inverso não existe, não podemos multiplicar-nos por ele.mas certamente as pessoas que desenharam números de vírgula flutuante sabiam tudo isso. Fiquei a pensar porque é que o comportamento descrito veio a ser escrito no padrão IEEE.
para começar, vamos considerar o problema que a matemática de ponto flutuante está tentando resolver. Os números reais são incontáveis infinitos, e no entanto queremos representar este conjunto inteiro dentro dos limites da memória finita do computador. Com um duplo de 64 bits, existem 2^64 símbolos possíveis, e os designers do padrão IEEE estavam tentando mapear esses símbolos no conjunto de números reais de uma forma que era útil tanto para aplicações do mundo real como economicamente viável, dadas as restrições do Silício do início dos anos 80. Tendo em conta os requisitos básicos, seriam claramente utilizadas aproximações.
The reasoning for negative zero appears to date to a 1987 paper by William Kahan, a Berkeley professor who is considered the “father of floating point” and who later won The Turing Award for his work in drafting IEEE 754. Acontece que a existência de zero negativo está intimamente ligada à capacidade de dividir por zero.
vamos começar por discutir a razão usual de que a divisão por zero não é permitida. Uma abordagem ingênua para divisão por zero é a observação de que:
em outras palavras, como x fica menor, o resultado de 1/x fica maior. Mas isso só é verdade quando x se aproxima de 0 a partir do lado positivo (e é por isso que há esse sinal de pouco mais acima). Executando a mesma experiência de pensamento do lado negativo:
Como resultado, o limite genérico de 1/x quando x se aproxima de 0 é indefinido, porque há uma descontinuidade (o que Kahan chama uma fenda) na função 1/x.
no Entanto, com a introdução de uma assinado zero, Kahan e o IEEE comitê poderia contornar a dificuldade. Intuitivamente, o sinal de um zero é tomado para indicar a direção da qual o limite está sendo aproximado. Como Kahan afirma em seu artigo de 1987:
ao Invés de pensar de +0 e -0, como distintos valores numéricos, pensar em seu bit de sinal como uma variável auxiliar que transmite um bit de informação (ou desinformação) sobre qualquer variável numérica que leva em 0 como valor. Normalmente esta informação é irrelevante; o valor de 3+x não é diferente para x := +0 do que para x := -0… No entanto, algumas operações aritméticas extraordinárias são afetadas pelo sinal de zero; por exemplo 1/ (+0) = +∞ mas 1/ (-0) = –∞.
eu fiz a minha em paz com o conceito através da adopção de uma racionalização propostas pelo meu parceiro de Mike Perkins: 2^64 símbolos disponíveis são claramente insuficientes para representar a totalidade do conjunto dos números reais. Então, os designers da IEEE reservaram alguns desses símbolos para significados especiais. Nesse sentido, ∞ não significa realmente ” infinito “-em vez disso, significa ” um número real que é maior do que podemos representar de outra forma em nosso conjunto de símbolos de ponto flutuante.”E portanto +0 não significa realmente “zero”, mas sim ” um número real que é maior que o verdadeiro 0, mas menor que qualquer número positivo que possamos representar.”
incidentalmente, enquanto pesquisava esta questão, eu descobri que até Kahan não ama a ideia de zero negativo:
assinado zero — bem, o zero assinado era um chato que poderíamos eliminar se usássemos o modo projetivo. Se houvesse apenas um infinito e um zero você poderia fazer muito bem; então você não se importava com o sinal de zero e você não se importava com o sinal do infinito. Mas se, por outro lado, insistisse naquilo que eu consideraria como a escolha menor de dois infinitos, então acabaria com dois zeros assinados. Não havia uma maneira de contornar isso e tu ficaste preso a isso.”(From an interview of Kahan conducted in 2005.)
i’m not sure if writing a blog post ten years later compensa for railing against a poor second grade teacher. Por parte dela, a minha filha, agora no Liceu, revirou os olhos quando comecei a falar da divisão às zero ao jantar. Então talvez essa coisa de “difícil de estar por perto” seja hereditária.
Kahan, W., “Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing’s s Sign Bit”, The State of the Art in Numerical Analysis, (Eds. Iserles and Powell), Clarendon Press, Oxford, 1987, disponível aqui.
Tags
Join Hacker NoonCreate your free conta para desbloquear a sua experiência de leitura personalizada.