問題の説明
私の流体シミュレーション中、物理的な時間は次のように進行してい0, 0.001, 0.002, ..., 4.598, 4.599, 4.6, 4.601, 4.602, ...
ます。ここで、この時系列からtime =を選択0.1, 0.2, ..., 4.5, 4.6, ...
して、さらに分析を行います。fractpart
そこで、ヒットがゼロかどうかを判断するために次のコードを作成しました。
しかし、私は非常に驚いて、次の2つの除算方法で2つの異なる結果が得られていることに気付きました。どうすればよいですか?
double param, fractpart, intpart;
double org = 4.6;
double ddd = 0.1;
// This is the correct one I need. I got intpart=46 and fractpart=0
// param = org*(1/ddd);
// This is not what I want. I got intpart=45 and fractpart=1
param = org/ddd;
fractpart = modf(param , &intpart);
Info<< "\n\nfractpart\t=\t"
<< fractpart
<< "\nAnd intpart\t=\t"
<< intpart
<< endl;
なぜそれがこのように起こるのですか?
そして、皆さんが私を少し容認するなら、私は大声で叫ぶことができます:「C ++委員会はこれについて何かをすることができますか?これは混乱しているからです。」:)
カットオフエラーの影響を回避するために正しい余りを取得するための最良の方法は何ですか?fmodはより良い解決策ですか?ありがとう
の答えに応答する
デビッドシュワルツ
double aTmp = 1;
double bTmp = 2;
double cTmp = 3;
double AAA = bTmp/cTmp;
double BBB = bTmp*(aTmp/cTmp);
Info<< "\n2/3\t=\t"
<< AAA
<< "\n2*(1/3)\t=\t"
<< BBB
<< endl;
そして、私は両方を手に入れました、
2/3 = 0.666667
2*(1/3) = 0.666667