programing

Java의 계수를 음수로 동작시키는 가장 좋은 방법은?

bestcode 2022. 9. 4. 15:20
반응형

Java의 계수를 음수로 동작시키는 가장 좋은 방법은?

할 때 자바에서

a % b

a가 음수일 경우 음수 결과를 반환하고 b로 반환해야 합니다.이 문제를 해결하는 가장 좋은 방법은 무엇입니까?내가 생각할 수 있는 유일한 방법은

a < 0 ? b + a : a % b

이 값은 % b = a - a / b * b처럼 동작합니다. 즉, 나머지가 됩니다.

(a % b + b) % b 할 수 있습니다.


이 표현은 의 결과로서 기능합니다.(a % b)반드시 보다 낮다b어떤 경우에도a긍정 또는 부정입니다.추가 중b부정적인 가치관을 배려하다a,부터(a % b)사이의 음의 값입니다.-b그리고.0,(a % b + b)반드시 보다 낮다b긍정적입니다.마지막 모듈로는 혹시 모르니까a처음부터 긍정적이었어요.a긍정적이다(a % b + b)보다 커질 것이다b.그러므로,(a % b + b) % b보다 작게 하다b(부정적인 영향을 주지 않음)a값)을 참조해 주세요.

Java 8에서는 Math.floorMod(int x, int y) 및 Math.floorMod(long x, long y)사용할 수 있습니다.두 방법 모두 피터의 답변과 동일한 결과를 반환합니다.

Math.floorMod( 2,  3) =  2
Math.floorMod(-2,  3) =  1
Math.floorMod( 2, -3) = -1
Math.floorMod(-2, -3) = -2

아직 Java 8을 사용하지 않는(또는 사용할 수 없는) 사람들을 위해 Guava 11.0 이후 이용 가능한 IntMath.mod()사용하여 구했다.

IntMath.mod( 2, 3) = 2
IntMath.mod(-2, 3) = 1

주의사항: Java 8의 Math.floor Mod()와 달리 제수(두 번째 파라미터)는 음수일 수 없습니다.

수론에서 결과는 항상 긍정적이다.모든 프로그래머가 수학자는 아니기 때문에 컴퓨터 언어에서는 항상 그렇지는 않다고 생각합니다.제 의견으로는 언어의 디자인 결함이라고 생각합니다만, 지금은 변경할 수 없습니다.

= MOD(-4,180) = 176 = MOD(176,180) = 176

왜냐하면 180 * (-1) + 176 = -4는 180 * 0 + 176 = 176과 같기 때문이다.

http://mathworld.wolfram.com/Congruence.html 의 클럭의 예에서는, duration_of_time mod cycle_length 가 -45 분이라고 하는 것이 아니고, 15 분이라고 하는 것이 됩니다.단, 두 응답 모두 기본 방정식을 만족시킵니다.

Java 8에는Math.floorMod단, 매우 느립니다(실장에는 복수의 분할, 곱셈 및 조건이 있습니다).그러나 JVM에 최적화된 스터브가 내장되어 있어 속도가 크게 향상될 수 있습니다.

이 작업을 수행하는 가장 빠른 방법은floorMod다른 , 것은 입니다.%op.

n이 양수이고 x가 무엇이든 될 수 있다고 가정합니다.

int remainder = (x % n); // may be negative if x is negative
//if remainder is negative, adds n, otherwise adds 0
return ((remainder >> 31) & n) + remainder;

:n = 3:

x | result
----------
-4| 2
-3| 0
-2| 1
-1| 2
 0| 0
 1| 1
 2| 2
 3| 0
 4| 1

다음 사이의 균일한 분포만 필요한 경우0 ★★★★★★★★★★★★★★★★★」n-1연산자가 mod 연산자.x는 는 ' ' 근처에 군집하지 않는다.0, 병렬화, 느린 병렬화 등이 있기 에, 더 %계산은 결과에 의존하지 않기 때문에 다른 부분과 병렬로 이루어집니다.

return ((x >> 31) & (n - 1)) + (x % n)

의 결과에는 「」가 .n = 3:

x | result
----------
-5| 0
-4| 1
-3| 2
-2| 0
-1| 1
 0| 0
 1| 1
 2| 2
 3| 0
 4| 1
 5| 2

입력이 int의 전체 범위에서 랜덤일 경우 두 솔루션의 분포는 동일합니다.0에 .n - 1후자의 용액에서.

대체 방법은 다음과 같습니다.

a < 0 ? b-1 - (-a-1) % b : a % b

이것은 다른 공식 [(% b + b) % b]보다 빠르거나 빠르지 않을 수 있다.다른 공식과 달리 분기를 포함하지만 하나 적은 모듈로 연산을 사용합니다.컴퓨터가 < 0을 올바르게 예측할 수 있다면 아마 성공입니다.

(편집: 수식을 수정했습니다.)

언급URL : https://stackoverflow.com/questions/4412179/best-way-to-make-javas-modulus-behave-like-it-should-with-negative-numbers

반응형