0

GSL を使用してヒストグラムを作成しようとしています。分割 1470/100 の値をヒストグラムに追加しようとすると問題が発生します。これは 14.69999999 となり、ヒストグラムに追加されると下のビンに丸められます。私の質問は、1470/100 を 14.69999 ではなく 14.7 にする方法を教えてください。ありがとうございました

編集:

int minRange = 14;
double val;


val = minRange + j*0.05;


gsl_histogram_increment(hist, val);

val がヒストグラムに追加されると、14.7 ではなく 14.65 と見なされます。(この場合、j は 14 です)。

val に 1e-6 を追加して問題を解決しました。お手伝いありがとう

4

2 に答える 2

3

これは浮動小数点の精度の問題です。これを解決する良い方法は、ヒストグラム ポイントを整数値のすぐそばに設定することです。たとえば15 - eeは 10-6 のオーダーです。

于 2013-06-25T12:19:36.770 に答える
0

はい、

通常は 1e-6 を追加するとうまくいきますが、一般に、float を切り捨てるときはより注意する必要があります。

このブログでは、浮動小数点数を丸めたい場合に直面する可能性のあるすべての問題 (および単純なソリューションの落とし穴) について説明します。また、「1e-6の追加」の次のより堅牢な実装も提案しています

 float myround(float f)
 {
      if (f >= 0x1.0p23) return f;
      return (float) (unsigned int) (f + 0.49999997f);
 }

myround(0.49999997) = 0 および myround(0.49999999) = 1 であることをテストできます。

したがって、この質問を完全に解決したと呼ぶ前に、まずこのブログを読みます。

もう 1 つのポイントは、c++11 には最も近い整数を返す std::round という新しい関数があるため、 を比較して丸めを実装することもできstd::abs(x - std::round(x)) < epsilonますepsilon。繰り返しますが、これは単純な実装であり、myround ほど堅牢ではありません (double に適応させる必要があります)。

于 2013-08-23T22:31:34.910 に答える