なぜvimはゼロによる整数除算を許可するのですか?


16

vimが明らかにゼロによる除算を許可することを発見しました。

:let a=42/0
:echo a

印刷します2147483647(これはの値ですa)。

これはどこかで文書化されており、なぜvimはゼロによる除算を許可するのですか?


2
:echo 42/0.0別の結果を見てみてください:)
VanLaser

回答:


9

この動作は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

理由は次のとおりです。

42 / 0 tends to +infinity

そして、Vimは利用可能な最大数をどのように表しますか?

2147483647

見る :h limits

さらに、float2nr機能のドキュメントには次のように記載されています。

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

ここに2つの数字があります:+ 2147483647そして- 2147483647

最後の番号-2147483648は、NaN値を表すために使用されます。

これはeval、それに関するセクションで確認されています(mea culpa:@cuonglmが直前に投稿しました):

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が述べたように、これは整数でのみ機能し、浮動小数点数ではより一貫性があります:

 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

その場合、負の数を0で除算するのが最小数ではないのはなぜですか?- > vi.stackexchange.com/questions/4623/...
ジェイコブ・クラール

質問を編集しました
-nobe4

2147483647は確かに無限大よりもゼロにはるかに近いです。したがって、このような小さな数で無限大を表すことは、少なくとも私には役に立たないようです。
ルネナイフェネガー

2

この動作は、Limitと呼ばれるものを使用するときにCalculusで役立ちます。

リムn-> 0 ^ + of 1 / n = + inf

これは次のように書くこともできます:As n-> 0 ^ +、1 / n-> + inf

このように読み取られます。nが右からゼロに近づくにつれて、関数1 / nは正の無限大に近づきます。

この推論の視覚的な説明を見るには、http://www.wolframalpha.com/input/?i = limit + n-%3E0 + of + 1%2Fnにアクセスして ください。

特にVim-scriptに関しては、多くの人がロジックと整数演算以上のことをしていません。この動作は、当時は良いアイデアのように見え、この時点では単なるレガシーアーティファクトである可能性があります。


最後の段落のソースはありますか?ゼロによる整数除算はCでは未定義であり、表示される動作はプロセッサなどに依存します。
muru

ああ、あなたは正しい。段落を削除しています。
シェーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.