关于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;
}
我用vs2017试了一下
sizeof(long double) 和sizeof(double) 一样都是8字节。。
所以long double有效位数应该和double的一样吧,
REF:
https://bbs.csdn.net/topics/390397851 风扫地 发表于 2018-10-31 14:14
我用vs2017试了一下
sizeof(long double) 和sizeof(double) 一样都是8字节。。
所以long double有效位数 ...
我仔细查了一下,看来我的理解有问题,课本上说的可以在10的308方什么的,看来理解有问题,目前还没看明白,但是大概心里有个数了,先不管了,看看以后能不能学到这些问题。 sunman2006 发表于 2018-10-31 15:57
我仔细查了一下,看来我的理解有问题,课本上说的可以在10的308方什么的,看来理解有问题,目前还没看明 ...
那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数 claws0n 发表于 2018-10-31 16:25
那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数
那就对了,楼主刚好输入到1e-16,而这个数存在内存中是9.99999999e-17。 claws0n 发表于 2018-10-31 16:25
那个是最大值,但是真正的有效精度 float 是 7 位小数,double 是 15 位小数
看了一些资料,知道有效精度是16位了,但是还是不太明白为什么是这样,原理查半天看了也不太明白,明明可以很大,但是么为什么有效位数只有15位,不好理解,大神有没有简单容易理解的说明? 风扫地 发表于 2018-10-31 17:22
那就对了,楼主刚好输入到1e-16,而这个数存在内存中是9.99999999e-17。
具体是为什么呢?很疑惑。 a = a + b;
猜想是加了一个精度以下的数(b),对原来的数(a)的存储没有产生改变,所以死循环了。
看看这个能不能有帮助~
https://blog.csdn.net/u013566722/article/details/53606510
这个坑我就不进去了。。
{:10_245:} 风扫地 发表于 2018-11-9 11:08
a = a + b;
猜想是加了一个精度以下的数(b),对原来的数(a)的存储没有产生改变,所以死循环了。
咦,你发的这个文章不错唉,比较好动,现在大概明白原因了,是因为尾数位的限制造成的,尾数最大只能到52位,刚好是4开头的一个16位的数字。
页:
[1]