C 为什么返回正确的浮点值而不是双倍值?
我将返回类型更改为float,这段代码可以工作,但在返回垃圾之前它是double。问题一定出在您没有向我们展示的某些代码中 首先,这不是幂函数。您重复地调整C 为什么返回正确的浮点值而不是双倍值?,c,types,C,Types,我将返回类型更改为float,这段代码可以工作,但在返回垃圾之前它是double。问题一定出在您没有向我们展示的某些代码中 首先,这不是幂函数。您重复地调整基准 当我将您的功能合并到一个完整的小程序中时: float Raise2power(double base, int exponent){ if(exponent==0){ return 1; } else { while (--exponent){ base*
基准
当我将您的功能合并到一个完整的小程序中时:
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:这就是你的问题;当编译器处理对函数的调用时,它不知道该函数是如何定义的。你应该得到一个警告。如果你做了,你应该注意它;如果没有,则需要修复调用编译器的方式,以便它提供更多警告。