0

問題があります。シミュレーションを実行する前に、クラス「invKin」でこの関数を取得して、いくつかのパラメーターを設定しました。

void IK_mm4::set_timesetting(double *T_horiz_, double *delta_t_)
{
  T_horiz  = T_horiz_;
  delta_t  = delta_t_;

  k_end = (int)floor((*T_horiz)/(*delta_t));

  cout << "k_end = " << k_end <<endl;
}

それは私のメインファイルで呼び出されます

...
double delta_t = 5e-3;
double *T_desired = new double(5.0);
...
invKin.set_timesetting(T_desired,&delta_t);
...

問題は今です。私の大学のPCでは、すべてが正常であり、k_endの値は「1000」です。私の自宅のPCでは、システムはどういうわけか値「999」を返しています。* T_desiredの値を「0.05」に変更すると、coutは両方のPCで「10」の正しい値を示します。

変数を使用することをすでに確認しました

double k_end_test = (*T_horiz)/(*delta_t);

それは「1000」の正しい解を与えています。エラーは、floor関数またはint変換にある必要があります。私が行った場合

int k_end_test2 = (int)(k_end_test);

また

double k_end_test2 = floor(k_end_test);

結果は常に「999」です。

誰かがこれがどこから来ることができるかについての考えを持っていますか?

どんなヒントにも感謝しています!ありがとう!

4

1 に答える 1

4

これは、限定精度表現の性質です。

たとえば、精度が 10 進数 6 桁であるとします。doubleもちろん、これは使用するものではありませんが、概念はまったく同じです。1/3.33333310 進精度 6 桁です。そう30 * (1/3)です9.99999。整数に切り捨てると9、 ではなくになり10ます。これがあなたが見ている問題です。

この動作が望ましくない場合は、浮動小数点を使用しないでください。

に渡す値に小さな「デルタ」を追加するだけで十分な場合がありますfloor

于 2013-01-23T10:42:40.300 に答える