3

我编写了以下函数来计算浮点数的 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);
    }
}

}

4

2 回答 2

6

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

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


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

ab的 GCD是最大数c使得a / cb / c是整数。

于 2013-01-12T20:43:43.770 回答
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));
}

所以你可以看到浮动不太准确。
你可以尝试双倍(但它也是:))或......阅读有关如何存储浮点数的信息

于 2013-01-12T20:41:07.493 回答