2010-04-23 4 views
4

두배의 목록을 기반으로 고조파 평균을 계산하는 방법을 만들었습니다. 하지만 테스트를 실행하면 출력 결과가 같아도 계속 실패합니다.비쥬얼 스튜디오 2008 단위 테스트가 계속 실패합니다

내 조화 평균 방법 :

public static double GetHarmonicMean(List<double> parameters) 
{ 
    var cumReciprocal = 0.0d; 
    var countN = parameters.Count; 

    foreach(var param in parameters) 
    { 
     cumReciprocal += 1.0d/param; 
    } 

    return 1.0d/(cumReciprocal/countN); 
} 

내 시험 방법 :

[TestMethod()] 
public void GetHarmonicMeanTest() 
{ 
    var parameters = new List<double> { 1.5d, 2.3d, 2.9d, 1.9d, 5.6d }; 
    const double expected = 2.32432293165495; 
    var actual = OwnFunctions.GetHarmonicMean(parameters); 
    Assert.AreEqual(expected, actual); 
} 

테스트를 실행 한 후 다음과 같은 메시지가 표시되고 :

Assert.AreEqual 실패

. 예상 : < 2.32432293165495>. 실제 : < 2.32432293165495>.

나를 위해 모두 동일한 값입니다.

누군가 설명 할 수 있습니까? 아니면 내가 잘못하고있는거야?

+1

오류 메시지 텍스트에 반올림이있을 수 있습니다. 또 다른 노트에서, 당신의 메소드는 Linq를 사용할 수 있습니다 :'return 1.0d/parameters.Average (d => 1.0d/d)),' –

+0

위대한, linq이 일을 생각하지 않았다. – Gerbrand

답변

7

Assert.AreEqual에 대한 이중 과부하는 doubles의 부정확성을 허용하는 "delta"매개 변수를 사용합니다. 이 매개 변수에 작은 값을 지정해야합니다.

1

GetHarmonicMean 메서드가 정확히 2.32432293165495를 반환하도록하는 것은 매우 어렵습니다. Double은 소수점 이하 14 자리보다 훨씬 정확합니다. 예 :

2.32432293165495 - 2.32432293165495 - your_result = .0000000000000000... - 이것은 0이 아닙니다.

1

이중 값은 표시 될 때 반올림되므로 반올림 오류가 계속 나타나지 않도록 용량 한계에 약간 못 미치는 숫자가 표시됩니다. 값이 같아 보이지만 실제로는 같은 값을 갖지 않습니다.

당신은 값을 계산 한 후 왕복 형식을 사용하여 표시 할 수 있습니다 :이 방법으로 만든 텍스트 표현을 구문 분석 할 때, 그것을 만든 동일한 double 값을 생성하기 위해 보장된다

value.ToString("r") 

. 코드에 넣으면 정확한 일치를 얻을 수 있습니다.

그러나 일반적으로 정확하게 일치하는 것을 원할 경우 거의 없기 때문에 일반적으로 두 값을 정확히 비교해서는 안됩니다. 또한 정확하게 일치하는 테스트는이 상황에서 실제로 원하는 결과가 아닐 수도 있습니다. 정확히 일치하는 나머지 구현에 따라 달라지기 때문입니다. 다른 알고리즘을 사용하면 다른 반올림 오류가 발생하여 약간 다른 결과가 발생합니다.

관련 문제