C语言 为什么这会返回带有浮点数的正确值,而不是双精度值


float Raise2power(double base, int exponent){
    if(exponent==0){
        return 1;
    }
    else {
        while (--exponent){
            base*=base;
        }
        return base;
    }
}

我将返回类型更改为 float,这段代码有效,但是当它在返回垃圾之前是双倍时。

问题一定出在您没有向我们展示的某些代码中。

首先,这不是幂函数。你反复平方base.

当我将您的函数合并到一个小的完整程序中时:

#include <stdio.h>
float Raise2power(double base, int exponent){
   if(exponent==0){
       return 1;
   }
   else {
        while (--exponent){
           base*=base;
        }
        return base;
   }
}
int main(void) {
    int i;
    for (i = 0; i <= 5; i ++) {
        printf("Raise2power(10.0, %d) = %.1fn", i, Raise2power(10.0, i));
    }
    return 0;
}

我得到这个输出:

Raise2power(10.0, 0) = 1.0
Raise2power(10.0, 1) = 10.0
Raise2power(10.0, 2) = 100.0
Raise2power(10.0, 3) = 10000.0
Raise2power(10.0, 4) = 100000000.0
Raise2power(10.0, 5) = 10000000272564224.0

当我将float Raise2power更改为double Raise2power时,我得到以下输出:

Raise2power(10.0, 0) = 1.0
Raise2power(10.0, 1) = 10.0
Raise2power(10.0, 2) = 100.0
Raise2power(10.0, 3) = 10000.0
Raise2power(10.0, 4) = 100000000.0
Raise2power(10.0, 5) = 10000000000000000.0

向我们展示一个完整的程序及其输出。

更新:在评论中,您说您已经修复了该错误,它现在可以工作了。我怀疑这两件事是无关的;你向我们展示的代码中的任何内容都不应该产生垃圾值——除非你在其他地方做错了什么。

我最好的猜测是,您已将函数定义为在一个地方返回float,但在另一个地方将其声明为返回double,反之亦然。编译器在看到调用时,会假定结果是一种类型,而实际上它是另一种类型。

要么,要么你调用了函数,根本没有可见的声明。对于C99之前的编译器(如Microsoft编译器(,编译器将假定返回类型为int,这再次会产生垃圾。但是,您应该为floatdouble获得垃圾.

避免此类问题的方法是在头文件中声明函数,并在定义函数的.c文件中#include该头(以便编译器可以检查一致性(和包含对函数调用的任何源文件中。

但同样,这只是猜测,因为您从未向我们提供足够的信息来诊断问题。

推荐阅读:http://sscce.org/

最新更新