2013-11-23 3 views
6

내가 매트랩, C++ 예를 들어구현 matlab에의 EPS (x)의 기능 ++

에 matlab에의 eps(x) 기능을 구현하기 위해 노력하고있어 :

>> eps(587.3888) 
ans = 1.1369e-13 
>> eps(single(587.3888)) 
ans = 6.1035e-05 

을 그러나, 나는 C에서이 작업을 수행 할 때 ++ 올바른 단 정밀도 응답을 얻을 수 없습니다. 나는 다음과 같은 출력을 얻을 프로그램을 실행

#include <limits> 
#include <iostream> 
#include <math.h> 

#define DEBUG(x) do { std::cerr << x << std::endl; } while (0) 
#define DEBUG2(x) do { std::cerr << #x << ": " << x << std::endl; } while (0) 

int main() { 

    float epsf = std::numeric_limits<float>::epsilon(); 
    DEBUG2(epsf); 
    double epsd = std::numeric_limits<double>::epsilon(); 
    DEBUG2(epsd); 

    float espxf = nextafter(float(587.3888), epsf) - float(587.3888); 
    double espxd = nextafter(double(587.3888), epsd) - double(587.3888); 
    DEBUG2(espxf); 
    DEBUG2(espxd); 

} 

: 출력이 nextafter 기능에만 출력을 사용하여 단일 및 이중 정밀도는 EPS 값이 올지라도 어떤 이유로 것처럼

$ ./a.out 
epsf: 1.19209e-07 
epsd: 2.22045e-16 
espxf: -1.13687e-13 
espxd: -1.13687e-13 

보인다 배정 밀도 값 epsxf에 대한 내 값은 Matlab에서와 같이 6.1035e-05 여야합니다.

의견이 있으십니까?

+0

MATLAB의 eps는 항상 긍정적 인 결과를 제공합니다. 위 코드는'x'가'epsf'보다 큰 경우 부정적인 결과를 낳습니다. [여기] (http://coliru.stacked-crooked.com/a/68546c8c401c0610) 고정 코드 :'double eps (float x) {float xp = std :: abs (x); double x1 = std :: nextafter (xp, xp + 1.0f); return x1 - xp; }' – legends2k

답변

6

<cmath>을 포함하고 std::nextafter을 호출하면 C++ 11 컴파일러를 사용하는 경우 코드가 작동합니다.

<math.h>을 포함하고 ::nextafter을 호출하면 함수의 C 버전이 호출됩니다. nextafter의 C 구현은 과부하를 지원하지 않으므로 C는 단 정밀도 결과에 nextafterf을 제공하고 4 배 정밀도에는 nextafterl을 제공합니다. (인수가 double으로 변환되기 때문에 float과 함께 nextafter을 호출하기 만하면됩니다.) C++ 11 컴파일러가 없으면 ::nextafterf을 호출하여 코드를 수정할 수 있습니다.

+0

와우, 정말 고마워! – kyle

1

라이브러리를 사용하십시오. Matlab의 eps 기능은 다른 언어로되어 있으며, 마지막 위치에있는 단위는 ULP입니다. float_distance에 대한

boost::math::float_distance(a, b) 

문서가 here입니다 : ULP에 Wikipedia 기사에 따르면, boost C++ library에서 다음 함수는 두 개의 더블 ab 사이의 부동 소수점 거리를 계산하는 데 사용할 수 있습니다.

+0

예, 부스트 구현을 알고 있었지만, 우리 클래스에서는 boost 라이브러리를 사용할 수 없습니다. – kyle

+0

전 세계에서이 답변의 투표율이 얼마나 낮은 지 궁금합니다. ULP의 개념을 설명했을뿐만 아니라 단 정밀도와 배정도 모두에서 작동하는 견고한 대체 솔루션을 제안했습니다. OP는 그가 부스트를 사용하지 않기를 바랐다. – horchler