Perché vim consente la divisione di numeri interi per zero?


16

Ho appena scoperto che Vim ovviamente consente la divisione per zero:

:let a=42/0
:echo a

stampe 2147483647(che è il valore di a).

Questo è documentato da qualche parte e perché vim consente la divisione per zero?


2
Prova :echo 42/0.0a vedere un altro risultato :)
VanLaser

Risposte:


9

Questo comportamento è documentato nella sezione valutazione :

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

Ecco perché:

42 / 0 tends to +infinity

E in che modo Vim rappresenta il maggior numero disponibile?

2147483647

Vedere :h limits

Inoltre, la float2nrdocumentazione della funzione afferma:

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

Quindi hai qui i tuoi 2 numeri: + 2147483647e - 2147483647.

L'ultimo numero -2147483648viene utilizzato per rappresentare il NaNvalore.

Ciò è confermato dalla evalsezione su di esso (mea culpa: @cuonglm lo ha pubblicato poco prima di me):

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)

Come affermato da @VanLaser, questo funziona solo per numeri interi, per i numeri in virgola mobile hai maggiore coerenza:

 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

In tal caso, perché la divisione di un numero negativo per 0 non è il numero minimo? -> vi.stackexchange.com/questions/4623/…
Jacob Krall

Ho modificato la mia domanda
nobe4,

2147483647 è certamente molto più vicino allo zero che all'infinito. Quindi, rappresentare l'infinito con un numero così piccolo non sembra utile, almeno non per me.
René Nyffenegger,

2

Questo comportamento è utile in Calculus quando si utilizza qualcosa chiamato Limit.

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

Questo può anche essere scritto come: Come n -> 0 ^ +, 1 / n -> + inf

Viene letto in questo modo. Mentre n si avvicina a zero da destra, la funzione 1 / n si avvicina all'infinito positivo.

Per vedere una spiegazione visiva di questo ragionamento, vai a http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn

Per quanto riguarda specificamente lo script Vim, AFAIK non molte persone fanno molto di più della logica e dell'aritmetica intera. Potrebbe accadere che questo comportamento sembrasse una buona idea in quel momento, ed è solo un artefatto ereditato a questo punto.


Hai una fonte per l'ultimo paragrafo? La divisione intera per zero non è definita in C, qualsiasi comportamento che vedi dipende dall'elaboratore, ecc.
Muru,

Oh, hai ragione. Sto rimuovendo il paragrafo.
Shane,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.