使用双变量类型时遇到问题。在子函数中,返回值为mid = 1.0306534300317196
。但是将此值分配给coord[0]
时。但是coord[0]=-1.#IND000000000000
。
我真的不明白为什么这是错的。
请帮我清除它。谢谢!
#include <stdio.h>
double x[11];
double m[11];
double coord[9];
double abs(double a, double b){
if(a>b)
return a-b;
else return b-a;
}
double findCoord(double left, double right) {
double mid = (left + right)/2;
//double oldmid =0;
double f_left = 0;
double f_right = 0;
f_left= f_left + m[0]/((mid-x[0]) * (mid-x[0]));
f_right= f_right + m[1]/((x[1]-mid) * (x[1]-mid));
// check errors of value ?????
if(abs(f_right,f_left)<0.000000001)
return mid;
// check by F
if (f_left==f_right)
return mid;
if (f_left > f_right){
left=mid;
findCoord(left, right);
}
if (f_left < f_right){
right=mid;
findCoord(left, right);
}
}
int main(void)
{
x[0]=1;
x[1]=2;
m[0]=1;
m[1]=1000;
coord[0]=findCoord(x[0], x[1]);
printf("%.10f \n", coord[0]);
while(1);
return 0;//Your program should return 0 on normal termination.
}
答案 0 :(得分:1)
您的代码应该使用
return findcoord(left,right);
而不是
findcoord(left,right);
函数findcoord中的用于递归调用,否则函数返回的递归调用的值会丢失!
答案 1 :(得分:1)
对于findCoord func中的最后两个条件,你不返回任何东西,只给出调用函数。返回语句只是将中间值返回到其先前的调用函数。在递归系统中,函数调用自身很多次。根据你的代码,它只返回前一步的中间值,但不是所有以前的调用。所以,使用
$('body').on('click'
答案 2 :(得分:0)
findCoord()
会返回abs(f_right,f_left)<0.000000001
或f_left==f_right
的值。如果这两个都不成立,则不返回任何值。
确保findCoord()
中的所有代码路径都返回一个值。
答案 3 :(得分:0)
尝试使用-Wall选项编译代码。它会给你一些重要的警告
test.c:23:8: warning: conflicting types for built-in function ‘abs’
double abs(double a, double b){
^
test.c: In function ‘findCoord’:
test.c:52:1: warning: control reaches end of non-void function [-Wreturn-type]
}
这些警告意味着:
解决方案可能是
double myabs(double a, double b){
if(a>b)
return a-b;
else return b-a;
}
double findCoord(double left, double right) {
double mid = (left + right)/2;
//double oldmid =0;
double f_left = 0;
double f_right = 0;
f_left= f_left + m[0]/((mid-x[0]) * (mid-x[0]));
f_right= f_right + m[1]/((x[1]-mid) * (x[1]-mid));
// check errors of value ?????
if(myabs(f_right,f_left)<0.000000001)
return mid;
// check by F
if (f_left==f_right)
return mid;
if (f_left > f_right){
left=mid;
return findCoord(left, right);
}
if (f_left < f_right){
right=mid;
return findCoord(left, right);
}
return 0; // Gcc happy :)
}