2014-06-15 1 views
0

Math.cbrt(a)의 결과가 Math.pow(a, (1/3))이 아닌 이유는 무엇입니까?Math.cbrt() 및 Math.pow()의 차이

public class HelloWorld{ 

public static void main(String []args){ 

    int a=8; 

    System.out.println(Math.cbrt(a)); 

    System.out.println(Math.pow(a,(1/3))); 
} 
} 

SOLN

2.0 1.0

왜 일치하지 않는 이유는 무엇입니까? 내 수학이 잘못되었거나 구문이 잘못 되었나요, 아니면 pow와 관련이 있습니까?

+3

정수 계산이 다시 발생합니다! – awksp

+0

@ user3580294 설명해 주시겠습니까? –

+0

"속도를 낮추지 마십시오."- 죄송합니다. "하지 마세요"부분을 놓쳤습니다. 죄송합니다. –

답변

3
System.out.println(Math.pow(a,(1.0/3.0))); 

1/3는 위 그림과 같이 원하는 결과를 얻기 위해 복식을 double로 캐스팅하거나 사용할 필요 하나, 그래서 연산을 정수로 0 감사 할 것이다.

+0

'1.0' 또는'3.0'을 사용한다면 캐스트는 필요 없습니다. 또한, 요즘에는'float'을 사용하는 데에는별로 이유가 없습니다. 단지'double'을 사용하면 여분의 정밀도는 거의 항상 좋은 것입니다. – awksp

+0

위대한 설명! 나는 그 지위를 편집했다. – bstar55

+0

네가 두 번째 덧글을 올렸을 때 바로 편집했다. 이제 좋은 대답입니다. 어떤 "정수 산술"이 멋질 지에 대한 정교함. – awksp

1

Java 1/3 = 0에서는 정수로 정수를 나누기 때문입니다. 1/3.0을 사용하면 Math.pow에서 결과가 좋을 것입니다.

1

1/3의 표현식은 정수로 나눗셈을하여 0이됩니다. 그러면 pow가 pow(8, 0)으로 올바르게 호출됩니다. pow(a, (1.0/3.0))을 쓰십시오.

+0

1.0/3.0이어야합니다. – bstar55

+0

Ups ... 확실합니다. 결정된. – PMF

0

cbrt()를 사용하면 expression에 정확한 정확한 값을 제공하는 반면 pow()를 사용하면 정확한 값을 얻을 수 있습니다. 참조 용으로 = 64, 125, 216 또는 343을 사용하여 시도해보십시오. 이것은 pow() 문에 대한 정확한 값을 반환하지 않으며, 타입 캐스팅으로 int 값을 출력하려고하면 대부분의 경우 잘못된 값을 갖습니다. 이 답변을 통해 명확한 설명을 얻으시기 바랍니다.

+0

spec은'cbrt'가 어느 쪽의 방향에서도 * 1 ulp * 내에서 정확해야합니다. 축소 할 때 * 반올림이 수행됩니다. 내가 말할 수있는 한, 큰 완벽한 큐브를 "정확하게"둥글게 할 것이라는 보장은 없습니다. 'cbrt'는 아마도'pow'보다 * 정확해야하지만, 일반적으로 정확하게 만들 방법이 없습니다. – dfeuer

+0

'pow'는 비슷한 정밀도 보장을합니다. 그래서 차이는 매우 작을 것입니다. 아마 아마도 지수의 부정확 한 표현에 기인 할 것입니다. – dfeuer