通常我们得到相同的结果(不完全相同,但几乎相同)以下代码(建议X> 0,Y> 0):
code 1 : fmod(X,Y)
code 2 : X - Y * trunc(X/Y)
但是对于某些价值,它们将会非常不同。
测试代码:
int main()
{
cout << std::boolalpha;
cout << std::setprecision(20);
double X = 30.508474576271183309;
double Y = 6.1016949152542370172;
cout << "X: " << X << " Y:" << Y << '\n';
cout << "X/Y: " << X / Y << '\n';
cout << "X - trunc(X/Y)*Y: " << X - trunc(X / Y)*Y << '\n';
cout << "fmod(X,Y): " << fmod(X, Y) << '\n';
system("pause");
return 0;
}
结果:
X: 30.508474576271183309 Y:6.1016949152542370172
X/Y: 5
X - trunc(X/Y)*Y: 0
fmod(X,Y): 6.1016949152542352408
环境:VS2017 Win10
更新1 :此问题与c++ fmod returns 0.2 for fmod(0.6,0.2)
不同如果将X设置为0.6,将Y设置为0.2,则代码1和代码2的结果会相同。但在这种情况下,它们会有所不同。
更新2 :我将使用其他方式来描述问题。
double X, X > 0, known
double Y, Y > 0, known
int quotient, quotient > 0, unknown
double remainder, remainder > 0, unknown
formula 1: X == Y * quotient + remainder
对于已知的X,Y,如果我想计算商和余数(并确保它们满足公式1),在c ++中,通常我们有两种方法可以做到:
Method 1: quotient = trunc(X/Y), remainder = fmod(X,Y);
Method 2: quotient = trunc(X/Y), remainder = X - Y * trunc(X/Y);
对于方法1,它将输出商和余数,但它们不满足公式1(对于特定的X和Y)。
更新3 :我在进行ADS-B CPR本地解码时遇到此问题。有一个名为&#34;计算纬度指数j&#34;如下
如果我们严格遵循它并在C ++中用fmod替换mod,那么我们将得到特定Lat_ref和dLat的错误结果。