#include<stdio.h>
int main()
{
int i;
double result=0,x,p,a;
do
{
printf("请输入任意非负数:\n") ;
scanf("%lf",&a);
if(a>=0)
{
for(i=0;i<=a/2;i++)
{
if(i*i<=a&&(i+1)*(i+1)>a)
{
result=i;
break;
}
}
for(p=0.1;p!=0;p=0.1*p)
{
for(i=0;i<=9;i++)
{
x=result+p*i;
if(x*x<=a&&(x+p)*(x+p)>a)
{
result=x;
break;
}
}
}
printf("%lf\n",result);
}
else
{
printf("Error!\n");
}
printf("按任意键继续或F6(Ctrl+z)键结束\n");
}
while(getch());
}
以上是模拟sqrt()函数的一个小程序
但是总感觉取值范围很奇怪
谁来告诉我下a的取值范围
最好能解释下理由
还有为什么输出的结果总是精确到小数后6位
感激不尽
那么实际运算中的a的允许范围该怎么求呢?
我想了半天也找不出范围
只试出来了大概在2^31左右
可以插入一些打印语句,看是否超界。
例如:
for(i=0;i<=a/2;i++) -- i 的限制,打印 a/2,a/2 不能超过 int 的极限。
打印 (x+p)*(x+p) ,不能超过double 的极限
打印 x*x, 不能超过double 的极限.
任何1个超界,计算都要停止或得错误的值。
a的取值范围该怎么求?
好像没有double型的取值范围那么大。
我试到2^31开始运算就开始变慢了,再高点貌似就求不出答案了,等了一会儿也没见到答案,不知是求不出来还是数字太大运算速度慢下来了
双精度实数只能提供15-16位有效数字,数值的范围随机器系统而异。理论上约为10的负308次方到10的308次方。数据大了运算变慢,甚至无法运算是正常现象。因为运算的复杂度与规模相关。