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.

마지막 숫자 -2147483648NaN값 을 나타내는 데 사용됩니다 .

이것은 그 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.