2017-11-29 13 views
0

약간의 질문이 있습니다. 자바에서 13^30 mod 31을 계산하면 25라는 결과가 나오는 이유는 무엇입니까? 결과는 1이어야합니다. 대답은 미리 Thx입니다. p.s. 나는 당신이 double의에서 이러한 작업의 결과를 저장하는 https://www.compilejava.net/매개 변수 13 및 30이 실패한 Pow() 함수

import java.lang.Math; 
public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 
    System.out.println(calculateModulo()); 

    } 

    public static String calculateModulo(){ 

    String res = new String(); 

    for (int i = 1; i < 31; i++){ 
     for (int j = 1; j < 31; j++){ 

      double var = Math.pow((double)i, (double)j); 


     if (j == 30) { 
      System.out.println("adding: "+i); 
      res = res + " " + i; 
      } 
      if (var % 31 == 1) { 
      System.out.println("The number " + i +" to the power of "+j +" modulo 31 results in "+var % 31); 
      break; 
      } 

     } 
    } 
    System.out.println(Math.pow(13,30)+"   "+(Math.pow(13,30)%31)); // why is the output of this "2.619995643649945E33   25.0" 
    return res; 
    } 
} 
+1

숫자가 너무 커서 내부적으로 정확하게 저장할 수 없습니다. 그래서 당신이 얻는 것은 둥근 결과입니다. 당신은'BigInteger' 클래스로 행운을 시험해 보거나 그 숫자의 모듈러스를 계산하는 더 지능적인 방법을 고안 할 수 있습니다. – Sirko

+0

아마도 @ 존 Skeet 게시물 https://stackoverflow.com/questions/11317875/finding-really-big-power-of-a-number보세요. 다른 모든 것이 pow와 같이 단순한 함수를 만드는 데 실패하면 많은 수로 작동합니다. 원하는 방식으로 생각할 수 있습니다. – SimperT

답변

1

에 코드를 썼다. double은 64 바이트 길이입니다. 13 의 결과를 정확하게 64 바이트에 저장할 수 없습니다. 그리고 아니요, 컴파일러는 트릭을 사용하여 이것을 계산할 수 없습니다. Is floating point math broken?

BigInteger을 사용해보십시오 참고 :이 위해 에게 BigInteger를를 사용해야하므로

BigInteger a = new BigInteger("13"); 
BigInteger b = a.pow(30); 
BigInteger c = b.mod(new BigInteger("31")); 
System.out.println(c); 
1

는 13^30 후 얻을 수는 너무 INT에서 개최하는 크고 두 배입니다. 이 값을 실제로 계산하는 경우 다음과 같이 할 수 있습니다.

BigInteger bf = new BigInteger("13"); 
BigInteger bf1 = new BigInteger("30"); 
BigInteger bf2 = new BigInteger("31"); 
BigInteger p =bf.pow(30); 
System.out.println(p.mod(bf2));