问题描述
在我的流体模拟过程中,物理时间以0, 0.001, 0.002, ..., 4.598, 4.599, 4.6, 4.601, 4.602, ...
. 现在我想0.1, 0.2, ..., 4.5, 4.6, ...
从这个时间序列中选择 time = 然后做进一步的分析。所以我写了下面的代码来判断是否fractpart
命中为零。
但是我很惊讶,我发现以下两种除法方法得到了两种不同的结果,我该怎么办?
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