鱼C论坛

 找回密码
 立即注册
查看: 1575|回复: 8

[已解决]关于c内部运算精度的问题!!!!!

[复制链接]
发表于 2018-10-31 13:50:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

这个是0.000000000000001的

这个是0.000000000000001的

上面的是精度是0.000000000000001的。
下面:
2.png
这个精度是: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 16:25:57
sunman2006 发表于 2018-10-31 15:57
我仔细查了一下,看来我的理解有问题,课本上说的可以在10的308方什么的,看来理解有问题,目前还没看明 ...

那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-31 14:14:40 | 显示全部楼层
我用vs2017试了一下
sizeof(long double) 和sizeof(double) 一样都是8字节。。
所以long double有效位数应该和double的一样吧,
REF:
https://bbs.csdn.net/topics/390397851
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-31 15:57:52 | 显示全部楼层
风扫地 发表于 2018-10-31 14:14
我用vs2017试了一下
sizeof(long double) 和sizeof(double) 一样都是8字节。。
所以long double有效位数 ...

我仔细查了一下,看来我的理解有问题,课本上说的可以在10的308方什么的,看来理解有问题,目前还没看明白,但是大概心里有个数了,先不管了,看看以后能不能学到这些问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-31 16:25:57 | 显示全部楼层    本楼为最佳答案   
sunman2006 发表于 2018-10-31 15:57
我仔细查了一下,看来我的理解有问题,课本上说的可以在10的308方什么的,看来理解有问题,目前还没看明 ...

那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-31 17:22:57 | 显示全部楼层
claws0n 发表于 2018-10-31 16:25
那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数

那就对了,楼主刚好输入到1e-16,而这个数存在内存中是9.99999999e-17。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-9 09:55:37 | 显示全部楼层
claws0n 发表于 2018-10-31 16:25
那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数

看了一些资料,知道有效精度是16位了,但是还是不太明白为什么是这样,原理查半天看了也不太明白,明明可以很大,但是么为什么有效位数只有15位,不好理解,大神有没有简单容易理解的说明?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-9 09:56:42 | 显示全部楼层
风扫地 发表于 2018-10-31 17:22
那就对了,楼主刚好输入到1e-16,而这个数存在内存中是9.99999999e-17。

具体是为什么呢?很疑惑。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-9 11:08:39 | 显示全部楼层
a = a + b;

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


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



这个坑我就不进去了。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-9 13:11:51 | 显示全部楼层
风扫地 发表于 2018-11-9 11:08
a = a + b;

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

咦,你发的这个文章不错唉,比较好动,现在大概明白原因了,是因为尾数位的限制造成的,尾数最大只能到52位,刚好是4开头的一个16位的数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 20:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表