计算最大公约数

时间:2013-01-12 20:12:59

标签: c greatest-common-divisor

我编写了以下函数来计算浮点数的GCD,但是当我为输入(111.6,46.5)运行它时,函数中fmod(a,b)的计算在2之后开始给出错误的结果递归调用。我无法在这里找到错误。任何人都可以在这里找到问题吗?

float gcd(float a, float b){
if (a>b) {
    if(b==0){
        return a;
    }
    else {
        return gcd(b, fmod(a,b));
    }
}
else {
    if (a==0) {
        return b;
    }
    else {
        return gcd(fmod(b,a), a);
    }
}

}

2 个答案:

答案 0 :(得分:6)

由于表示浮点值的方式,源文本“111.6”将转换为111.599999999999994315658113919198513031005859375,源文本“46.5”将转换为46.5。然后您的gcd函数返回7.62939453125e-06。这是两个输入值的正确GCD。

请注意,第一个值是14627635/131072。所有浮点数都是某个整数(在一定范围内)乘以或除以2的幂。用二进制浮点精确表示111.6是不可能的。由于你不能完全代表111.6,你不能用它做精确的算术。浮点主要用于近似算术。做精确的算术需要非常小心。


  

谈论实数的GCD(与整数相反)是什么意思?

a b 的GCD是最大的数字 c ,以便 a / c b / c 是整数。

答案 1 :(得分:0)

float gcd(float a, float b){
    printf("a=%f b=%f\n",a,b);
if (a>b) {
    if(b==0){
        return a;
    }
    else {
        return gcd(b, fmod(a,b));
    }
}
else {
    if (a==0) {
        return b;
    }
    else {
        return gcd(fmod(b,a), a);
    }
}
}
main(){
    printf("%f\ndddeellliiimmiitteerr\n",gcd(1116,465));
    printf("%f\n",gcd(111.6,46.5));
}

所以你可以看到漂浮不那么准确。你可以尝试加倍(但也是:))或......读一下浮动存储的方式