7

eps(x)C++ でMatlab の関数を実装しようとしています。

たとえば、Matlab では次のようになります。

>> 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);

}

プログラムを実行すると、次の出力が得られます。

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

単精度と倍精度の eps 値が正しいにもかかわらず、何らかの理由でnextafter関数を使用した出力が倍精度値のみを出力するようです。私の値epsxfは、Matlab にあるように 6.1035e-05 にする必要があります。

何かご意見は?

4

2 に答える 2

3

ライブラリを使用します。他の言語でのMatlab のeps機能は ULP と呼ばれ、ユニットが最後に配置されています。ULPに関するウィキペディアの記事によると、 boost C++ ライブラリの次の関数を使用して、2 つの doubleaとの間の浮動小数点距離を計算できますb

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

のドキュメントfloat_distanceこちらです。

于 2013-11-23T23:16:11.577 に答える