vim은 왜 0으로 정수 나누기를 허용합니까?


16

방금 vim이 0으로 나눌 수 있음을 발견했습니다.

:let a=42/0
:echo a

인쇄합니다 2147483647(의 값 a).

이것은 어딘가에 기록되어 있으며 왜 vim은 0으로 나누기를 허용합니까?


2
:echo 42/0.0다른 결과를 보십시오 :)
— VanLaser

답변:


9

이 동작은 평가 섹션에 설명되어 있습니다 .

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.

그래서 당신은 여기에 두 개의 숫자가 있습니다 : + 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/…
— Jacob Krall

내 질문을 편집했습니다
— nobe4

2147483647 확실히 무한대보다 0에 훨씬 가깝습니다. 따라서 작은 숫자로 무한대를 표현하는 것은 적어도 나에게는 도움이되지 않는 것 같습니다.
— René Nyffenegger

2

이 동작은 한계라는 것을 사용할 때 미적분학에서 유용합니다.

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

다음과 같이 쓸 수도 있습니다 : As n-> 0 ^ +, 1 / n-> + inf

n은 오른쪽에서 0에 가까워 질 때 함수 1 / n은 양의 무한대에 가까워집니다.

이 추론에 대한 시각적 설명을 보려면 http://www.wolframalpha.com/input/?i=limit+n-%3E0+of+1%2Fn으로 이동 하십시오.

Vim 스크립트와 관련하여 AFAIK는 논리 및 정수 산술보다 훨씬 많은 사람들을 수행하지 않습니다. 이 행동은 당시 좋은 생각처럼 보였으며,이 시점에서 단지 레거시 아티팩트 일뿐입니다.


마지막 단락의 출처가 있습니까? 0으로의 정수 나누기는 C에서 정의되지 않으며, 표시되는 동작은 프로세서 등에 따라 다릅니다.
— muru

아, 맞아 단락을 제거하고 있습니다.
— Shane
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.