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?
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?
Risposte:
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)
Ecco perché:
42 / 0 tends to +infinity
E in che modo Vim rappresenta il maggior numero disponibile?
2147483647
Vedere :h limits
Inoltre, la float2nr
documentazione 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: + 2147483647
e - 2147483647
.
L'ultimo numero -2147483648
viene utilizzato per rappresentare il NaN
valore.
Ciò è confermato dalla eval
sezione 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
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.
:echo 42/0.0
a vedere un altro risultato :)