fmod与除法

时间:2017-08-30 07:41:39

标签: c++

通常我们得到相同的结果(不完全相同,但几乎相同)以下代码(建议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;如下

enter image description here

如果我们严格遵循它并在C ++中用fmod替换mod,那么我们将得到特定Lat_ref和dLat的错误结果。

0 个答案:

没有答案