留恋流年 发表于 2017-6-21 12:28:59

求助!C语言中计算精度问题

本帖最后由 留恋流年 于 2017-6-22 00:34 编辑

断断续续两天时间,目测逻辑上应该没问题啊,最终结论 r 应该不等于 f1 且 k1<1

有些公式会影响代码阅读。
但是这不重要,我确定公式没问题

那么问题来了

在C语言中,double的精度会在计算过程丢失吗?
同样的公式,我用笔算,人力有限,只保留了4位小数。而double好像是15位有效数字。然后经过多次的运算,误差就越来越大。笔算结果和程序输出
自然就不一样。

那么,可能会造成笔算a-b=1   而程序计算结果 a-b=0.000001 的情况吗???

求解答

贴代码

#include<stdio.h>
#include<math.h>
#define PI 3.1415926
#define t PI/180
int main(void)
{
               
        int i;
        double p0,p1,p2,a0,b0,m,n,l,a5;         
        double A,B,C,r,s,f1,f2,k1,j;      /*定义变量 */
        double u1=1.0/45,u2,x0=1.0,xm=2.0,ym=1.414,y0=1.0; /*定自变量、函数与转角的比例尺*/
        double a,b,a1,b1,k;
        u2=(sqrt(2)-1)/85;
        int ii,jj;
        double x,y;
        printf("各结点处的有关各值如下:\n");
        for(ii=0;ii<3;ii++)       
        {
                x=(1.0/2.0*(xm+x0))-(1.0/2.0*(xm-x0)*cos((2*(ii+1)-1)*PI/6));
                y=sqrt(x);
                a=(x-x0)/u1;
                b=(y-y0)/u2;
                printf("x[%d]=%-12lf y[%d]=%-12lf α[%d]=%-12lf ψ[%d]=%-12lf\n",ii+1,x,ii+1,y,ii+1,a,ii+1,b);
        }       
        printf("\n\n");

          for (jj=0;jj<10;jj++)
       {
               printf("please input a0: \n");
                scanf("%lf",&a0);
                printf("please input ψ0: \n");
                scanf("%lf",&b0);//        a0=85;b0=30;

               for(i=0;i<3;i++)
               {
                       a1=cos((b+b0)*t);
                       a1=cos((b+b0-a-a0)*t);
                       b1=cos((a+a0)*t);
                }
                p0=((b1- b1)*(a1-a1)-(b1-b1)*(a1-a1))/((a1-a1)*(a1-a1)-(a1-a1)*(a1-a1));
                p1=(b1-b1-(a1-a1)*p0)/(a1-a1);
                p2=b1-a1*p0-a1*p1;
               
                m=p0;
                n=-m/p1;
                l=sqrt(m*m+n*n+1-2*n*p2);
               
                printf("p0=%-12lf p1=%-12lf p2=%-12lf \n m=%-12fn=%-12lfl=%-12f\n",p0,p1,p2,m,n,l);
                printf("\n");
                printf("检查偏差值△ψ,数据如下:\n");                //前面基本没有问题,最后的检查时 r 应该不等于 f1 且 k1<1
                for (ii=0;ii<3;ii++)
                {
                        printf("当α=%lf时:\n",a);
                       A=sin((a+a0)*t);
                        B=cos((a+a0)*t)-n;
                        C=(1+m*m+n*n-l*l)/(2*m)-n*cos((a+a0)*t)/m;
                        j=x0+u1*a;
               
                        printf("A=%-12lf   B=%-12lf   C=%-12lf\n",A,B,C);
               
                        s=sqrt(A*A+B*B-C*C);
                       
                        if((B+C)<0.0)
                        {f1=2*(atan((A-s)/(B+C)))/(t)-b0;}        //f1=ψ
                        else if((B+C)>0.0)
                        {f1=2*(atan((A+s)/(B+C)))/(t)-b0;}
                        r=(sqrt(j)-y0)/u2;                                        //r=ψ'   
                        k=f1-r;
                        printf("ψ=%-12lf ψ'=%-12lf △ψ=%-12lf\n\n",f1,r,k);
               
                }
                if(labs(k)<1&&labs(k)<1&&labs(k)<1)
                {
                       printf("当初始角αo=%.2lf,ψo=%.2lf时:△ψ<1°则初始角合格!\n",a0,b0);
                       break;
                }
                printf("试取初始角不合格!请继续试取下一组\n");
       }
       
               
       for(i=0,a5=0;a5<=45;i++,a5+=0.5)
        {
               
                printf("当α=%lf时:\n",a5);
               A=sin((a5+a0)*t);
               B=cos((a5+a0)*t)-n;
               C=(1+m*m+n*n-l*l)/(2*m)-n*cos((a5+a0)*t)/m;
               j=x0+u1*a5;
               
               printf("A=%-12lfB=%-12lfC=%-12lf\n",A,B,C);
               
               s=sqrt(A*A+B*B-C*C);
               if((B+C)>0)
               f1=2*(atan(A+s)/(B+C))/(t)-b0;        //f1=ψ的正值
               else if((B+C)<0)f1=2*(atan((A-s)/(B+C)))/(t)-b0;//f1=ψ的负值

                r=(sqrt(j)-y0)/u2;                //r=ψ'   
               k1=f1-r;
               
               printf("ψ=%-12lf ψ'=%-12lf △ψ=%-12lf\n",f1,r,k1);
               
                printf("\n\n");
               
        }
        return 0;
}

        {

留恋流年 发表于 2017-6-22 00:35:47

啊啊啊啊,老师,求助啊啊@小甲鱼

小甲鱼 发表于 2017-6-22 01:16:02

留恋流年 发表于 2017-6-22 00:35
啊啊啊啊,老师,求助啊啊@小甲鱼

在C语言中,double的精度会在计算过程丢失吗?
99% 的语言中,浮点数的精度都不是 100% 精确的!C 语言也不例外,千万不要拿浮点数作为判断的条件。

留恋流年 发表于 2017-6-22 10:00:33

小甲鱼 发表于 2017-6-22 01:16
99% 的语言中,浮点数的精度都不是 100% 精确的!C 语言也不例外,千万不要拿浮点数作为判断的条件。

请问老师,那应该怎么做?真的不懂了。。。。。
页: [1]
查看完整版本: 求助!C语言中计算精度问题