Por que o vim permite divisão inteira por zero?


16

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?


2
Tente :echo 42/0.0ver outro resultado :)
VanLaser

Respostas:


9

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)

15

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 float2nrdocumentaçã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: + 2147483647e - 2147483647.

O último número -2147483648é usado para representar o NaNvalor.

Isso é confirmado pela evalseçã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

Nesse caso, por que a divisão de um número negativo por 0 não é o número mínimo? -> vi.stackexchange.com/questions/4623/…
Jacob Krall

Eu editei minha pergunta
nobe4

2147483647 certamente está muito mais próximo de zero do que do infinito. Portanto, representar o infinito com um número tão pequeno não parece útil, pelo menos não para mim.
René Nyffenegger 4/09/15

2

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.


Você tem uma fonte para o último parágrafo? Integer divisão por zero é indefinida em C, qualquer comportamento que você vê é dependente do processador, etc.
Muru

Oh, você está certo. Estou removendo o parágrafo.
Shane
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.