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의 비교 방법을 시도해 보았습니다). 그래서 지금 여기에있는 누군가가 내가 잘못하고있는 것에 대해 밝힐 수 있는지 궁금합니다.
감사
예에서 'magnitude'는 실제로 'maxMag'보다 작습니다. maxMag의 끝에있는 "magnitude"와 "E28"끝에 "E20"을 주목하십시오. –
예제 값 *은 반드시 'magnitude> maxMag'를 false로 설정해야합니다. 크기는 2.82 * 10^20이며 maxMag는 1.31 * 10^28입니다. 크기가 2로 시작하고 maxMag가 1로 시작한다는 사실에 속지 마십시오. 모든 숫자를 쓰는 대신 과학적 표기법을 사용합니다. –