sunman2006 发表于 2018-10-31 13:50:43

关于c内部运算精度的问题!!!!!

我写了个求平方根的小程序,程序是写出来的,参数都是用long double型定义的,long double型的数不是可以很大吗?可以到2的正负2000次方,虽然结果也基本正确,但是为什么精度如果大于0.000000000000001,程序就没反应了呢?
上面的是精度是0.000000000000001的。
下面:

这个精度是:0.0000000000000001的,就比上面的多了一个0.

如后程序就没反应了,倒是也没死机,那位老大给看看啥原因,如何解决:
代码如下:

#include <stdio.h>
void main()
{

        long double mysqrt(long double,long double),a,b;
        while(1)

        {
                printf("请输入数字:");
                scanf("%lf",&a);
                printf("\n请输入精度:");
                scanf("%lf",&b);
                printf("\n近似平方根为:%40.30lf\n",mysqrt(a,b));

        }


}

long double mysqrt(long double x,long double k)
{

        long double i,j;
        long double temp=0,result=0;
        for(i=1;i>=k;i=i/10)
        {
                if(result*result==x)break;
                temp=result;
                printf("%40.30lf\n",result);       

                for(j=1;;j++)

                {
                        if(temp*temp==x)break;
                        if(x>temp*temp)
                        {                       
                                result=temp;
                                temp=temp+i;
                               
                        }


                        if(x<temp*temp)
                        {

                                break;
                        }

                }


        }

        return result;

}





风扫地 发表于 2018-10-31 14:14:40

我用vs2017试了一下
sizeof(long double) 和sizeof(double) 一样都是8字节。。
所以long double有效位数应该和double的一样吧,
REF:
https://bbs.csdn.net/topics/390397851

sunman2006 发表于 2018-10-31 15:57:52

风扫地 发表于 2018-10-31 14:14
我用vs2017试了一下
sizeof(long double) 和sizeof(double) 一样都是8字节。。
所以long double有效位数 ...

我仔细查了一下,看来我的理解有问题,课本上说的可以在10的308方什么的,看来理解有问题,目前还没看明白,但是大概心里有个数了,先不管了,看看以后能不能学到这些问题。

claws0n 发表于 2018-10-31 16:25:57

sunman2006 发表于 2018-10-31 15:57
我仔细查了一下,看来我的理解有问题,课本上说的可以在10的308方什么的,看来理解有问题,目前还没看明 ...

那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数

风扫地 发表于 2018-10-31 17:22:57

claws0n 发表于 2018-10-31 16:25
那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数

那就对了,楼主刚好输入到1e-16,而这个数存在内存中是9.99999999e-17。

sunman2006 发表于 2018-11-9 09:55:37

claws0n 发表于 2018-10-31 16:25
那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数

看了一些资料,知道有效精度是16位了,但是还是不太明白为什么是这样,原理查半天看了也不太明白,明明可以很大,但是么为什么有效位数只有15位,不好理解,大神有没有简单容易理解的说明?

sunman2006 发表于 2018-11-9 09:56:42

风扫地 发表于 2018-10-31 17:22
那就对了,楼主刚好输入到1e-16,而这个数存在内存中是9.99999999e-17。

具体是为什么呢?很疑惑。

风扫地 发表于 2018-11-9 11:08:39

a = a + b;

猜想是加了一个精度以下的数(b),对原来的数(a)的存储没有产生改变,所以死循环了。


看看这个能不能有帮助~
https://blog.csdn.net/u013566722/article/details/53606510



这个坑我就不进去了。。

{:10_245:}

sunman2006 发表于 2018-11-9 13:11:51

风扫地 发表于 2018-11-9 11:08
a = a + b;

猜想是加了一个精度以下的数(b),对原来的数(a)的存储没有产生改变,所以死循环了。


咦,你发的这个文章不错唉,比较好动,现在大概明白原因了,是因为尾数位的限制造成的,尾数最大只能到52位,刚好是4开头的一个16位的数字。
页: [1]
查看完整版本: 关于c内部运算精度的问题!!!!!