2012-02-09 4 views
1

Java에서 피치 검출 프로그램을 작성하고 for 루프의 각 반복에서 두 배를 비교하여 샘플 배열에서 가장 큰 크기의 점을 결정합니다.이중 비교 문제

이에 대한 코드는 다음과 같습니다

double magnitude = 0.0; 
double maxMag = 0.0; 

int j = 0; 
    for (int i = 0; i < 2640; i += 2) { 
     magnitude = calcMag(sample[i], sample[i + 1]) 
       * (i < outputLength/2 ? calcMag(sample[i * 2], 
         sample[i * 2 + 1]) : 1.0) 
       * (i < outputLength/3 ? calcMag(sample[i * 3], 
         sample[i * 3 + 1]) : 1.0) 
       * (i < outputLength/4 ? calcMag(sample[i * 4], 
         sample[i * 4 + 1]) : 1.0) 
       * (i < outputLength/5 ? calcMag(sample[i * 5], 
         sample[i * 5 + 1]) : 1.0); 

     if (magnitude > maxMag) { 
      maxMag = magnitude; 
      peakIndex = j; 
     } 

     j++; 
    } 

디버거를 사용하여 변수를보고, "크기"와 "maxMag"의 비교는 제대로 처음 (maxMag가 제로의 경우) 만에서 작동 그 점은 매 순간마다 크기가 false 일 때라도 false로 평가됩니다. (크기> maxMag이) 거짓

예 비교 값 :

크기 = 2.828262485980501E20

maxMag = 1.3167436120685821E28

나는 나이 동안보고 및 잠재적 위해 주위를 둘러 보았다 봤는데 double을 비교하는 문제 (Double to no avail의 비교 방법을 시도해 보았습니다). 그래서 지금 여기에있는 누군가가 내가 잘못하고있는 것에 대해 밝힐 수 있는지 궁금합니다.

감사

+3

예에서 'magnitude'는 실제로 'maxMag'보다 작습니다. maxMag의 끝에있는 "magnitude"와 "E28"끝에 "E20"을 주목하십시오. –

+2

예제 값 *은 반드시 'magnitude> maxMag'를 false로 설정해야합니다. 크기는 2.82 * 10^20이며 maxMag는 1.31 * 10^28입니다. 크기가 2로 시작하고 maxMag가 1로 시작한다는 사실에 속지 마십시오. 모든 숫자를 쓰는 대신 과학적 표기법을 사용합니다. –

답변

1

번호는 표현 고장이

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000 그래서

2.828262485980501E20 < 1.3167436120685821E28

프로그램 출력이 올바른 진수 여기에 과학적 표기법으로 작성되어 있습니다.

+0

명확한 설명 주셔서 감사합니다 :) – nihilo90

1

하지만

maxMag = 1.3167436120685821E28 

이 지수는 "E"이후에보다 큰

magnitude = 2.828262485980501E20 

봐입니다!

0

magnitudemaxMag보다 크지 않습니다.

magnitude은 10 승 20 승입니다. maxMag은 10의 28 승수입니다.