2017-11-04 3 views
-3

제대로 구현하고 있는지 잘 모르겠습니다. boosted라는 함수를 작성하여 주어진 값에 대해 float를 리턴하지만이 오류가 발생합니다.부스트를 사용하는 방법을 모르지만 선생님이 코드를 제공했는데 오류가 발생했습니다.

terminate called after throwing an instance of 

    'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::domain_error> >' 
     what(): Error in function boost::math::cdf(const chi_squared_distribution<double>&, double): Chi Square parameter was -nan, but must be > 0 ! 
    Aborted 

누군가 내가 이것을 얻는 이유와 그것을 얻는 방법을 설명 할 수 있습니까? 교사용 웹 사이트 http://staffwww.fullcoll.edu/aclifton/cs133/assignment5.html 과 그 기능을위한 코드를 제공했습니다.

  1. 정수 나누기 : float numWords = v.size()/65536;
  2. (C2)가 (expected - hashes[i])/expected

의 요약에 예상되는이 시도 :

float boosted (vector <int>& v){ 
    float c2 = 0; 
    float numWords = v.size()/65536; 
    for(int i = 0; i < v.size(); i++) 
     c2 = pow(numWords - v[i], 2)/numWords; 

    boost::math::chi_squared c2d(65535.0); 
    return boost::math::cdf(c2d, c2); 
} 
+0

선생님은 숙제를해야합니까? – mikep

+0

'v.size()/65536'는 정수 나누기를 수행하므로, 'v'에 65536 개가 넘는 원소가 없으면 numwords는 0이됩니다. c2 = pow (numWords - v [i], 2)/numWords;는 숫자가 아닌 0으로 나눈 값이됩니다. – user4581301

+0

흥미로운 재미있는 사실,'pow'는 pi와 같은 손쉽게 불쾌한 계산을하도록 고안되었으며, 종종 숫자를 제곱 (squaring)하기 위해 과도한 잔인 함을 느낍니다. 거의 항상 승수를 스스로 수행하는 것이 좋습니다. – user4581301

답변

1

나는 코드와 함께 몇 가지 문제를 참조하십시오

float boosted (vector <int>& v){ 
    float c2 = 0; 
    float numWords = v.size()/65536.0; 
    for(int i = 0; i < v.size(); i++) 
     c2 += pow(numWords - v[i], 2)/numWords; 

    boost::math::chi_squared c2d(65535.0); 
    return boost::math::cdf(c2d, c2); 
} 

또한 numWords의 이름을 expected (또는 그 이상)으로 변경해야합니다.

관련 문제