Vim neden tamsayının sıfıra bölünmesine izin veriyor?


16

Az önce vim'in sıfıra bölmeye izin verdiğini keşfettim:

:let a=42/0
:echo a

yazdırır 2147483647(değeri a).

Bu bir yerde belgelenmiş mi ve vim neden sıfıra bölünmeye izin veriyor?


2
:echo 42/0.0Başka bir sonuç görmeye çalışın :)
VanLaser

Yanıtlar:


9

Bu davranış, eval bölümünde belgelenmiştir :

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

İşte nedeni:

42 / 0 tends to +infinity

Ve Vim mevcut en büyük sayıyı nasıl temsil ediyor?

2147483647

Görmek :h limits

Ayrıca, float2nrfonksiyon belgeleri şunları belirtir:

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

Burada 2 numaranız var: + 2147483647ve - 2147483647.

Son sayı -2147483648, NaNdeğeri temsil etmek için kullanılır .

Bu, evalüzerindeki bölüm tarafından onaylandı (mea culpa: @cuonglm hemen önümde yayınladı ):

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)

@VanLaser'ın belirttiği gibi, bu sadece tamsayı için çalışır, kayan nokta sayısı için daha tutarlısınız:

 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

Bu durumda, negatif bir sayının neden 0'a bölünmesi minimum sayı değildir? -> vi.stackexchange.com/questions/4623/…
Jacob Krall


2147483647 kesinlikle sıfıra sonsuzdan çok daha yakındır. Yani, bu kadar küçük bir sayı ile sonsuzluğu temsil etmek en azından bana değil, yararlı görünmüyor.
René Nyffenegger

2

Bu davranış, Hesaplama'da Limit adı verilen bir şey kullanırken yararlıdır.

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

Bu ayrıca şu şekilde de yazılabilir: As n -> 0 ^ +, 1 / n -> + inf

Bu şekilde okunur. N sağdan sıfıra yaklaştıkça 1 / n fonksiyonu pozitif sonsuza yaklaşır.

Bu gerekçenin görsel bir açıklamasını görmek için http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn adresine gidin.

Özellikle Vim-script'e gelince, AFAIK pek çok insan onunla mantık ve tamsayı aritmetiğinden daha fazlasını yapmaz. Bu davranış o sırada iyi bir fikir gibi görünebilir ve bu noktada sadece eski bir eserdir.


Son paragraf için kaynağınız var mı? Tamsayı sıfıra bölme C'de tanımlanmamıştır, gördüğünüz herhangi bir davranış işlemciye bağlıdır, vb.
muru

Oh, haklısın. Paragrafı kaldırıyorum.
Shane
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.