2017-12-21 33 views
1

숫자가 소수인지 아닌지 테스트하는 메서드를 작성했습니다. 사용자가 입력 할 수있는 숫자의 범위를 최대화하기 위해 double을 사용하려고했습니다. 문제는 40 자리 정도의 매우 큰 소수를 테스트 한 후 내 메소드가 false를 반환한다는 것입니다. (이미 int 버전으로 로직을 테스트했으며, 가능한 한 잘 작동합니다). 나는 그것이 매우 높은 숫자에서 작동하지 않는 이유 때문에 정확성 오류입니다 알고이중 산술에서 innaccuracy 다루는가?

public static boolean isPrime(double number) { 

    double sqrt = Math.sqrt(number); 

    for(double i = 2; i<= sqrt; i++) { 
     if(number%i == 0) { 
      return false; 
     } 
    } 

하지만,이 문제가 : 여기 내 코드?

+0

BigDecimal을 사용해 보셨습니까? – PillHead

+0

이상 [BigInteger] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html). – vanje

+1

왜 double이 소수인지 확인 하시겠습니까? 소수는 필수적이어야합니다. sqrt는 가능한 가장 높은 요소의 상한을 설정하기 위해서만 필요합니다. – StuartLC

답변

5

정확도 오류 때문에 매우 높은 숫자에서 작동하지 않는 이유를 알고 있지만이 문제가 있습니까?

예. BigInteger을 사용하십시오.

longdouble보다 우수합니다. long은 2^63-1까지의 모든 정수를 정확하게 나타낼 수 있기 때문입니다. 반대로 double을 사용하면 2^53 + 1에서 정밀도가 손실되기 시작합니다. 그러나이 유형 중 어느 것도 40 (십진수) 숫자에 적합하지 않습니다.

BigInteger 산술 연산 속도가 상당히 느리지 만 힙 공간이 충분하다면 적어도^^ Integer.MAX_VALUE ...까지 올라갈 수 있습니다.