c语言 double输出一个很大的负数

开始是用float,但是精度有些不够,改用double后,输出的就是很大的负数,为什么?
#include <stdio.h>
#include <math.h>
static int r,l,r1,l1,r2,l2;
static double PI=3.14159;
void input_data1(int x[],int p)
{
int a,b,c;
for(int i=0;i<p;i++)
{

printf("\n第%d个观测角为:",i+1);
scanf("%d %d %d",&a,&b,&c);
x[i]=a*3600+b*60+c;

}
printf("输入完毕!\n");
}
void input_data2(double x[])
{
printf("输入观测边长个数:\n");
scanf("%d",&l);
l1=l;
for(int i=0;i<l1;i++)
{

printf("\n第%d个观测边为:",i+1);
scanf("%lf",&x[i]);

}
printf("输入完毕!\n");
}
void output_data1(int x[30])
{
int a,b,c;

for(int i=0;i<r;i++)
{
a=x[i]/3600;
b=x[i]%3600/60;
c=x[i]%3600%60;

printf("%d %d %d ",a,b,c);

}
printf("\n");
}
void output_data2(double x[30],int p)
{

for(int i=0;i<p;i++)
{

printf("%lf ",x[i]);
printf("\n");

}
printf("\n");
}
void observe(int y[30])
{
int x[30];
printf("输入观测角的个数:\n");
scanf("%d",&r);
input_data1(x,r);
int a,b,c;
printf("输入方位角");
scanf("%d %d %d",&a,&b,&c);
y[0]=a*3600+b*60+c;
for (int i=0;i<r;i++)
{
y[i+1]=x[i]+y[i]-648000;
if (y[i+1]<0)
{
y[i+1]+=1296000;
}
if (y[i+1]>1296000)
{
y[i+1]-=1296000;
}
}
output_data1(y);

// output_data1(b);

}
void combine(int a[],int b[],int p,int q)
{
int i;int j=1;
for(i=p;i<p+q-1;i++)
{
a[i]=b[j];
}
}
void angle_radian(int a[],double b[],int p)
{
for(int i=0;i<p;i++)
{
b[i]=(a[i]/3600)*PI/180;
}
}
void coordinat(double a[],double b[],double dx[],double dy[],double X0[],double Y0[],int p)
{
printf("输入起始点坐标X,Y:");
scanf("%f %f",&X0[0],&Y0[0]);
for (int i=1;i<p;i++)
{
dx[i]=b[i]*cos(a[i]);
dy[i]=b[i]*sin(a[i]);
X0[i]=X0[i-1]+dx[i];
Y0[i]=Y0[i-1]+dy[i];
}
output_data2(X0,r1);
output_data2(Y0,r1);

}
void main()
{
int a[30];//坐标方位角
int a1[30];
double S[30]={0};//观测边长
double ar[30];
double dx[30];
double dy[30];
double X0[30];
double Y0[30];
observe(a);
r1=r;
// observe(a1);
// r2=r;
angle_radian(a,ar,r1);
input_data2(S);
output_data2(S,l1);
coordinat(ar,S,dx,dy,X0,Y0,r1);
// combine(a,a1,r1,r2);
// r=r1+r2-1;
// output_data1(a);
}
数值什么的随便输吧,但是最后就变成很大的负数,原来是float的时候是可以的

你把scanf,printf 中的"%lf"和"%f" ,都写成一致的"%f" 。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-28
应该是溢出了
第2个回答  2012-02-28
可能是溢出了吧,需要看清不同范围

c语言 double输出一个很大的负数
你把scanf,printf 中的"%lf"和"%f" ,都写成一致的"%f" 。

C语言,请问这个结果出来为啥是特别大的负数QAQ
你这种情况是溢出了,你可以用double或者long double试一下。看一下计算机组成原理你就直到为什么会溢出了。

为什么总输出一个很大的负数 C语言
原因:scanf用法不对,分析如下 1,代码中有一点错误 scanf ("i=%1f",&i);原型是int scanf(constchar*format,...);format为格式说明字符串,这个跟printf里面的不同,不能有多余杂质 故正确用法是scanf ("%1f",&i);特别注意的地方是,浮点型不能指点位数 进一步修改为scanf ("%f",&i);到...

C语言问题,输出结果总是负数,求教
你定义的类型不一致,前边定义是双精度double的实数,后边输出用的是%f单精度的浮点型,这两个数精度差太多,在C++里double输出用的是%lf,你看看这里是不是,要么把前边类型改成float,要么后边输出改成%lf

C语言问题(得到一个绝对值特别大的负数)
{ int sort1(int array[],int n);int sort2(int array[],int n);int t,i,j,m,n;double ave,sum=0;\/\/sum用来计算总分,所以你必须赋个初值,不然怎么样 int a[100];scanf("%d",&t);\/\/输入评委数 for(i=0;i<t;i++){ scanf("%d",&a[i]);\/\/根据评委数t, 把所有评分依次...

c语言输入三个小数后输出好大的负数
h>int main(void) {float a, b, c;scanf("%f%f%f",&a,&b,&c);\/\/读入时,无论是float还是double都不要指定宽度,否则是给自己找麻烦if (a > b) { if(b > c)printf("%.1f %.1f %.1f\\n", c, b, a);else if (a > c) printf("%.1f %.1f %.1f\\n", b, c, a)...

c语言 如何输入,输出一个double型数。为什么我的输出的总是带负号的一 ...
double x11;scanf("%lf",&x11);\/\/输入用%lf 不用加数字的

【C语言】有没有大佬知道这个程序为什么会输出一个负数?
程序会输出负数的原因是,在这个程序中你没有对每次运算的结果进行检查,因此当乘积超出了long类型的最大值时,就会产生溢出,导致结果为负数。为了避免这个问题,你可以在每次运算后检查结果是否已经超出了long类型的范围,并在必要时退出循环。可以这样改:include<stdio.h> main(){ long i;i=chengji(...

c语言问题,为什么会输出负数
这个问题有多种可能,不一而足。算法有错误,最终计算结果是负数。输出自然会是负数。例如:int a=1;int b=a-2;printf("b=%d",b);\/\/输出结果:b=-1超过变量类型的最大取值范围,发生溢出。例如Turbo C里int是16位,取值范围-32768~32767。如果计算过程当中,数值超过32767,由于补码的关系。

C语言,为啥总是输出负数
C语言,为啥总是输出负数 #include<stdio.h>#defineRATE10.13230#defineRATE20.15040#defineRATE30.30025#defineRATE40.34025#defineBREAK1360#defineBREAK2468#defineBREAK3720#defineCOST1(RATE1*BREAK1)#de... #include <stdio.h>#define RATE1 0.13230#define RATE2 0.15040#define RATE3 0.30025#define RATE4 ...

相似回答