2014-07-15 10 views
0

정수를 반환하는 java 함수가 있습니다. 나는 그것이 돌아 오게 될 것을 알기 때문에 그것이 올바르게 작동하는지 그렇지 않은지를 안다.괄호와 연산 순서

나는 결과가 괜찮이

miuf = miuf_ant * nf_ant/nf - ((double) ((t - 1) * hist[t - 1])/(double) nf);` 

처럼 작성하는 경우 : 어쨌든, for 루프의 어느 시점에서 코드 줄이있다. 나는이

miuf = (miuf_ant * (nf_ant/nf) - ((double) ((t - 1) * hist[t - 1])/(double) nf)); 

처럼 작성하는 경우

결과는 방법이 꺼져 있습니다.

nf_ant, nftint의이며, 나머지는 double들입니다.

몇 번의 반복을 위해 디버거에서이 두 표현식을 평가했으며 결과는 일반적으로 0.3 정도 다릅니다. 왜 이런 일이 일어나고 왜 그 일이 일어나고 다른 일은 일어나지 않습니까?

+1

분명하지 않습니까? 작업 순서에 대한 자체 규칙을 설정했습니다. – moatist

+0

@Pascal Cuoq 수학적으로이 두 저술은 동일합니다. 그런 의견을 가지고 오지 마라. 내가 헷갈 렸던 프로그래밍 부분 (결과가 어떻게 평가되는지)은 내가 물었습니다. 단순한. – learningProgramming

답변

1

nf_antnfint들 경우, 문제는 그 두 번째 버전 정수 나누기를 수행하는 경우하지 포인트 부문 부동. 먼저 그 중 하나를 캐스팅해야합니다.

이의 다음 두 표현식을 비교 해보자

miuf_ant * nf_ant/nf 
miuf_ant * (nf_ant/nf) 

첫 번째 자바의 규칙을 다음과 동일하다 :

여기에 발생하는 제품이 먼저 평가하는 것이 무엇
(miuf_ant * nf_ant)/nf 

, miuf_antdouble이기 때문에 결과도 double이됩니다. 그 다음에, 부서에 대해서도 같은 일이 일어납니다.

두 번째 나누기 연산자가 모두 int이기 때문에 결과는 int이기 때문에 효과적으로 결과를 잘림으로써 작업에 대한 선입관을 잃게됩니다. 이 선결 물 손실은 제품에 전달됩니다.

+0

"수학적으로 의도하지 않은 피연산자"라고 말하는 대신에 두 번째 경우의 정밀도가 떨어지는 것을 언급하십시오. 그러면 대답을 드릴 것입니다. 다르게 설명되어 있습니다. – learningProgramming

1

두 번째 경우는 nf_ant/nf이 정수 계산에서 계산됩니다. 괄호는 자체적으로 평가된다는 의미입니다. 이 나머지 손실은 차이의 원인입니다.

첫 번째 경우에는 부동 소수점 형식 인 miuf_ant이 미리 곱해집니다. */이 같은 우선 순위를 가지므로 3 개의 인수는 모두 계산 전에 부동 소수점으로 승격됩니다.

+0

알았어. 두 번째 경우는 nf_ant와 nf가 둘 다 int이고 괄호 안에 앉아 있기 때문에 int로 평가되고 정밀도가 떨어집니다. 첫 번째 경우에는 double에 int가 곱해지고 결과가 double으로 변환됩니다. 그 결과는 다른 int ant로 나뉘어 결과가 다시 double로 바뀝니다. 이렇게하면 나는 정밀도를 잃지 않는다. 고맙습니다. – learningProgramming

+0

그것은 공식적으로'int'가 실제로 평가되기 전에 부동 소수점으로 승격된다는 사실을 제외하고는 거의 같습니다. C 및 C++에서도 마찬가지입니다. 나는 다른 언어를 말할 수 없다. – Bathsheba

+0

그들은 승격되었지만 소수점 뒤에 0이 붙어 있으므로 거기에 있어야하는 모든 자리를 잃어 버립니다. – learningProgramming