¿Por qué vim permite la división de enteros por cero?


16

Acabo de descubrir que vim obviamente permite la división por cero:

:let a=42/0
:echo a

impresiones 2147483647(que es el valor de a).

¿Está documentado en alguna parte y por qué vim permite la división por cero?


2
Intenta :echo 42/0.0ver otro resultado :)
VanLaser

Respuestas:


9

Este comportamiento está documentado en la sección 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

Aquí es por qué:

42 / 0 tends to +infinity

¿Y cómo representa Vim el mayor número disponible?

2147483647

Ver :h limits

Además, la float2nrdocumentación de la función establece:

When the value of {expr} is out of range for a |Number| the
result is truncated to 0x7fffffff or -0x7fffffff.  NaN results
in -0x80000000.

Entonces tienes aquí tus 2 números: + 2147483647y - 2147483647.

El último número -2147483648se usa para representar el NaNvalor.

Esto se confirma en la evalsección (mea culpa: @cuonglm lo publicó justo antes que yo):

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 dijo @VanLaser, esto solo funciona para números enteros, para el número de coma flotante tiene más consistencia:

 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

En ese caso, ¿por qué la división de un número negativo por 0 no es el número mínimo? -> vi.stackexchange.com/questions/4623/…
Jacob Krall

He editado mi pregunta
nobe4

2147483647 ciertamente está mucho más cerca de cero que de infinito. Por lo tanto, representar el infinito con un número tan pequeño no parece útil, al menos no para mí.
René Nyffenegger

2

Este comportamiento es útil en Cálculo cuando se usa algo llamado Límite.

Lim n -> 0 ^ + de 1 / n = + inf

Esto también se puede escribir como: Como n -> 0 ^ +, 1 / n -> + inf

Se lee así. Cuando n se aproxima a cero desde la derecha, la función 1 / n se aproxima a infinito positivo.

Para ver una explicación visual de este razonamiento, vaya a http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn

En cuanto a Vim-script específicamente, AFAIK no mucha gente hace mucho más que lógica y aritmética de enteros con él. Podría ser el caso de que este comportamiento parecía una buena idea en ese momento, y es simplemente un artefacto heredado en este momento.


¿Tienes una fuente para el último párrafo? La división de enteros por cero no está definida en C, cualquier comportamiento que vea depende del procesador, etc.
muru

Oh tienes razon. Estoy quitando el párrafo.
Shane
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.