모듈러스가 다른 프로그래밍 언어에서 다른 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/450410

  •  19-08-2019
  •  | 
  •  

문제

print 2 % -18;

-->

-16

TCL

puts [expr {2 % -18}]

-->

-16

그러나 vbscript

wscript.echo 2 mod -18

-->

2

왜 차이인가?

도움이 되었습니까?

해결책

그만큼 Wikipedia 답변 여기에서 상당히 도움이됩니다.

짧은 요약은 모든 정수를 다음과 같이 정의 할 수 있다는 것입니다.

a = qn + r

이 모든 편지는 정수 인 곳입니다

0 <= | r | <| n |.

거의 모든 프로그래밍 언어는 (a/n) * n + (a%n) = a를 요구합니다. 따라서 모듈러스의 정의는 거의 항상 정수의 정의에 달려 있습니다. 음수 2/-18 = 0 또는 2/-18 = -1의 정수 분할에 대한 두 가지 선택이 있습니다. 언어에 대해 어떤 것이 진실인지에 따라 일반적으로 % 운영자가 변경됩니다.

이것은 2 = (-1) * -18 + (-16) 및 2 = 0 * -18 + 2이기 때문입니다.

Perl의 경우 상황이 복잡합니다. 매뉴얼 페이지 "사용 정수가 범위에있을 때"%"는 C 컴파일러가 구현 한 모듈러스 연산자에게 직접 액세스 할 수 있습니다. 사용 정수가 범위에있는 경우 Perl (예 : C)에 대한 옵션 중 하나를 선택할 수 있습니다. 사용 정수가 범위에 있지 않은 경우, 매뉴얼은 "$ b가 음수이면 $ a % $ b는 $ a보다 $ b의 가장 작은 배수를 $ a보다 작게 또는 낮습니다. 0). "

다른 팁

Wikipedia 's "모듈로 작동" 페이지는 그것을 잘 설명합니다. 나는 미묘하지만 중요한 실수를 할 가능성이 높기 때문에 여기서 더 잘하려고하지 않을 것입니다.

그것의 문지름은 "나머지"또는 "모듈러스"를 다른 방식으로 정의 할 수 있으며 다른 언어는 구현할 다른 옵션을 선택했다는 것입니다.

숫자와 제수를 나눈 후, 그 중 하나는 음수 인 경우, 당신은 그것들을 몫과 나머지로 분리하는 두 가지 방법이 있습니다. 또는 0으로 향합니다.

많은 언어는 단지 하나를 선택합니다.

나는 그것을 가리키는 것에 저항 할 수 없다 일반적인 lisp 둘 다 제공합니다.

물론 파이썬은 명시 적으로 알려줍니다

>>> divmod(2,-18)
(-1, -16)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top