编程计算子午圈曲率半径,卯酉圈曲率半径和纬线圈半径,我编的程序没有错误可是计算不出来,求指教~

#include<stdio.h>
#include<math.h>
#define a 6378245
#define b 6356863

void main()
{
int M,N,r,x;

double y,z,v,w;
double f;
printf(" 子午圈曲率半径 卯酉圈曲率半径 纬线圈半径\n");

f=sqrt((a*a-b*b)/a*a);
y=f*f;
z=sin(x)*sin(x);
v=sqrt(1-y*z);
w=(1-y*z);

for(x=0;x<=60;x++)
{M=a*(1-y)/(w*v);
N=a/v;
r=a*cos(x)/v;
printf("纬度=%d, %d, %d, %d\n",x,M,N,r);
}
}

#include<stdio.h>
#include<math.h>
#define a 6378245
#define b 6356863

void main()
{
int M,N,r,x;

double y,z,v,w;
double f;
printf(" 子午圈曲率半径 卯酉圈曲率半径 纬线圈半径\n");

f=sqrt((a*a-b*b)/a*a);
y=f*f;

for(x=0;x<=60;x++)
{
z=sin(x)*sin(x);
v=sqrt(1-y*z);
w=(1-y*z);
M=a*(1-y)/(w*v);
N=a/v;
r=a*cos(x)/v;
printf("纬度=%d, %d, %d, %d\n",x,M,N,r);
}

getchar();
}追问

x就是纬度啊,在循环的时候从0开始加。

追答

嗯 你的z,y,w的计算依赖于x,需要在循环里每次用新值来计算。
现在好像结果不对,溢出异常啊。数据太大了

追问

应该是从f开始的,f估计溢出了,可是long是最大的了吧。

追答

不是,sqrt出错。
第一个数据能计算出来的。我调试下

你公式有不对的
f=sqrt((a*a-b*b)/a*a);
y=f*f;
这里f和y是定值,可以在循环之前的外面执行

v=sqrt(1-y*z);
当z>0时,y*z都大于1了,你这里对负数求平方根了

你复查下公式吧

追问

应该不会啊,z是小于一的数的平方,f是小于一的数开放,y,z两个都小于一

追答

f=sqrt((a*a-b*b)/a*a);
这里应该是f=sqrt((a*a-b*b)/(a*a));
为了避免a*a这种超大数,改成这样:
f=sqrt(1-b*1.0/a*b/a);

追问

虽然没能计算出正确的答案,但是能算出值了。

温馨提示:答案为网友推荐,仅供参考
相似回答