Acabei de descobrir que o vim obviamente permite a divisão por zero:
:let a=42/0
:echo a
imprime 2147483647
(que é o valor de a
).
Isso está documentado em algum lugar e por que o vim permite a divisão por zero?
Acabei de descobrir que o vim obviamente permite a divisão por zero:
:let a=42/0
:echo a
imprime 2147483647
(que é o valor de a
).
Isso está documentado em algum lugar e por que o vim permite a divisão por zero?
Respostas:
Esse comportamento está documentado na seção eval :
When dividing a Number by zero the result depends on the value:
0 / 0 = -0x80000000 (like NaN for Float)
>0 / 0 = 0x7fffffff (like positive infinity)
<0 / 0 = -0x7fffffff (like negative infinity)
(before Vim 7.2 it was always 0x7fffffff)
Aqui está o porquê:
42 / 0 tends to +infinity
E como o Vim representa o maior número disponível?
2147483647
Vejo :h limits
Além disso, a float2nr
documentação da função declara:
When the value of {expr} is out of range for a |Number| the
result is truncated to 0x7fffffff or -0x7fffffff. NaN results
in -0x80000000.
Então você tem aqui seus 2 números: + 2147483647
e - 2147483647
.
O último número -2147483648
é usado para representar o NaN
valor.
Isso é confirmado pela eval
seção (mea culpa: @cuonglm postou antes de mim):
When dividing a Number by zero the result depends on the value:
0 / 0 = -0x80000000 (like NaN for Float)
>0 / 0 = 0x7fffffff (like positive infinity)
<0 / 0 = -0x7fffffff (like negative infinity)
Como o @VanLaser afirmou, isso funciona apenas para números inteiros. Para o número de ponto flutuante, você tem mais consistência:
1/0.0 = inf
1/0.0 + 1 = inf
1/0.0 - 1 = inf
-1/0.0 = -inf
-1/0.0 - 1 = -inf
-1/0.0 + 1 = -inf
Esse comportamento é útil no cálculo ao usar algo chamado limite.
Lim n -> 0 ^ + de 1 / n = + inf
Também pode ser escrito como: Como n -> 0 ^ +, 1 / n -> + inf
É lida assim. Como n se aproxima de zero da direita, a função 1 / n se aproxima do infinito positivo.
Para ver uma explicação visual desse raciocínio, vá para http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn
Quanto ao script Vim, especificamente, o AFAIK poucas pessoas fazem muito mais do que lógica e aritmética de números inteiros com ele. Pode ser que esse comportamento pareça uma boa ideia na época e seja apenas um artefato legado neste momento.
:echo 42/0.0
ver outro resultado :)