Program Tip

Mod Zero를 할 수 없습니까?

programtip 2021. 1. 8. 22:13
반응형

Mod Zero를 할 수 없습니까?


X % 0잘못된 표현입니까?

저는 항상 X % 0X와 같아야 한다고 생각 했습니다. 0으로 나눌 수 없기 때문에 당연히 나머지 X (남은 모든 것)가 답이되지 않습니까?


C ++ Standard (2003)는 §5.6 / 4에서 말합니다.

[...] / 또는 %의 두 번째 피연산자가 0이면 동작이 정의되지 않습니다 . [...]

즉, 다음 표현식은 undefined-behavior (UB)를 호출합니다.

X / 0; //UB
X % 0; //UB

그것은 -5 % 2같지 않습니다 -(5 % 2)(Petar가 그의 대답에 대한 그의 의견에서 제안한 것처럼). 구현에 따라 정의됩니다. 사양에는 (§5.6 / 4),

[...] 두 피연산자가 음수가 아니면 나머지는 음수가 아닙니다. 그렇지 않은 경우 나머지 부호는 구현 정의 입니다.


이 대답은 수학자를위한 것이 아닙니다. 이 대답은 동기 부여를 시도합니다 (수학적 정밀도를 희생).

수학자 : 여기를 참조하십시오.

프로그래머 : 나눗셈은 0입니다 undefined. 따라서 mod나눗셈에 의존하는는이기도 undefined합니다.


이것은 긍정적 X이고 D; 정수 부분과 분수 부분으로 구성됩니다.

(X / D) =   integer    +  fraction
        = floor(X / D) + (X % D) / D

재정렬하면 다음을 얻을 수 있습니다.

(X % D) = D * (X / D) - D * floor(X / D)

대입 0을 위해 D:

(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)

분할 이후로는 0이다 undefined:

(X % 0) = 0 * undefined - 0 * floor(undefined)
        = undefined - undefined
        = undefined

X % D입니다 정의 다수 0 <= R < D존재하도록, Q그래서

X = D*Q + R

따라서이면 D = 0그러한 숫자가 존재할 수 없습니다 (왜냐하면 0 <= R < 0)


나는 X % 0당신 의 나머지를 얻으려면 먼저 X / 0무한대를 산출하는 것을 계산해야하고 나머지 무한대를 계산하려고 시도하는 것은 실제로 불가능하다고 생각합니다.

그러나 당신의 생각에 맞는 최선의 해결책은 다음과 같은 일을하는 것입니다.

REMAIN = Y ? X % Y : X

개념적으로 문제를 이해하기 쉬운 또 다른 방법 :

인수 부호 문제를 잠시 무시하면 a % b쉽게 a - ((a / b) * b). 0 a / b이면 표현식 은 정의되지 않으므로이 경우 b전체 표현식도 마찬가지 여야합니다.

결국, 모듈러스는 사실상 분할 연산이므로 a / b정의되지 않은 경우 a % b에도 예상 할 수있는 불합리하지 않습니다 .


X % Y는 정수 [0, Y) 범위의 결과를 제공합니다. X % 0은 0보다 크거나 같고 0보다 작은 결과를 제공해야합니다.


float (B) = b = 0.0, 즉 정의되지 않았거나 두 구현간에 다르게 정의 된 유형 float 식별 mod (a, b)에 대해 (A % B)의 "0으로 나누기"사례를 피할 수 있습니다. 산술 오류를 위해 논리 오류 (하드 크래시)를 피하십시오 ...

계산함으로써 mod([a*b],[b])==b*(a-floor(a))
OF INSTREAD
컴퓨팅mod([a],[b])

여기서 [a * b] == 시간 경과에 따른 x 축 [b] == 시소 곡선의 최대 값 (도달되지 않음) == 시소 함수의 1 차 도함수

https://www.shadertoy.com/view/MslfW8

참조 URL : https://stackoverflow.com/questions/7370154/cant-mod-zero

반응형