为什么这会使用Floats返回正确的值而不是双倍?

时间:2013-01-19 20:22:53

标签: c types

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

我将返回类型更改为float并且此代码可以正常工作,但是在它返回垃圾之前它是双倍的。

1 个答案:

答案 0 :(得分:3)

问题必须出在您未向我们展示的某些代码中。

首先,这不是电源功能。您反复平方 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) = %.1f\n", 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获取垃圾。

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

但同样,这只是猜测,因为你从来没有给我们足够的信息来诊断问题。

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