C 为什么返回正确的浮点值而不是双倍值?

C 为什么返回正确的浮点值而不是双倍值?,c,types,C,Types,我将返回类型更改为float,这段代码可以工作,但在返回垃圾之前它是double。问题一定出在您没有向我们展示的某些代码中 首先,这不是幂函数。您重复地调整基准 当我将您的功能合并到一个完整的小程序中时: float Raise2power(double base, int exponent){ if(exponent==0){ return 1; } else { while (--exponent){ base*

我将返回类型更改为float,这段代码可以工作,但在返回垃圾之前它是double。

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

首先,这不是幂函数。您重复地调整
基准

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

float Raise2power(double base, int exponent){
    if(exponent==0){
        return 1;
    }
    else {
        while (--exponent){
            base*=base;
        }
        return base;
    }
}
当我将
float Raise2power
更改为
double Raise2power
时,我得到以下输出:

#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
向我们展示完整的程序及其输出

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

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

要么是这样,要么调用函数时根本没有可见声明。对于C99之前的编译器(如Microsoft的),编译器将假定返回类型为
int
,这同样会产生垃圾。但是对于
float
double
,您应该得到垃圾

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

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


推荐阅读:

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

首先,这不是幂函数。您重复地调整
基准

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

float Raise2power(double base, int exponent){
    if(exponent==0){
        return 1;
    }
    else {
        while (--exponent){
            base*=base;
        }
        return base;
    }
}
当我将
float Raise2power
更改为
double Raise2power
时,我得到以下输出:

#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
向我们展示完整的程序及其输出

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

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

要么是这样,要么调用函数时根本没有可见声明。对于C99之前的编译器(如Microsoft的),编译器将假定返回类型为
int
,这同样会产生垃圾。但是对于
float
double
,您应该得到垃圾

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

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


建议阅读:

对于
提高功率(10,3)
,此代码是否会返回
10000
而不是
1000
?这不是功率函数。您重复地平方
base
。除了错误的逻辑之外,您的函数产生类似的结果,无论返回类型是
float
还是
double
。对于
Raise2power(10,3)
,此代码不会返回
10000
而不是
1000
?这不是幂函数。您反复平方
base
。除了不正确的逻辑之外,无论返回类型是
float
还是
double
,您的函数都会产生类似的结果。捕获错误后,它在Visual Studio中可以正常工作。在cygwin安装或gcc中如何设置Netbeans可能是一个问题。谢谢大家抓住了这个漏洞。你的权利我以为它在头文件中,但不是,但它在新代码中。@West:这就是你的问题;当编译器处理对函数的调用时,它不知道该函数是如何定义的。你应该得到一个警告。如果你做了,你应该注意它;如果没有,您需要修复调用编译器的方式,以便它提供更多警告。捕获错误后,它在Visual Studio中可以正常工作。在cygwin安装或gcc中如何设置Netbeans可能是一个问题。谢谢大家抓住了这个漏洞。你的权利我以为它在头文件中,但不是,但它在新代码中。@West:这就是你的问题;当编译器处理对函数的调用时,它不知道该函数是如何定义的。你应该得到一个警告。如果你做了,你应该注意它;如果没有,则需要修复调用编译器的方式,以便它提供更多警告。