nar*_*tra 6 c algorithm floating-accuracy
我写了一个程序来计算最多2位小数的第n个根.例如,81的第4个根是3.,125的第3个根是5.Its工作得很好,除了4的第2个根.它给出输出1.99而不是2.这是代码.
#include<stdio.h>
int main(int argc, char **argv)
{
double root1(int,int);
int n;
int num1;
double root;
printf("\n\n-----------This is the programme to find the nth root of a number-----------\n\n");
printf("Enter a nuber greater then 1 : ");
scanf("%d",&num1);
if(num1>1)
{
printf("Enter the value for 'n'(the root to be calculated) : ");
scanf("%d",&n);
root = root1(num1,n);
printf("%d th Root of %d is %f\n\n", n,num1,root);
}
else
printf("wrong entry");
return 0;
}
double root1(int a, int b)
{
int j;
double i,k;
double incre = 0.01;
for(i=1; i<=a; i = i+incre)
{
for(j=0;j<b;j++)
{
k=k*i;
}
if(a<k)
{
return(i-incre);
break;
}
else
k=1;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几个小时,但无法纠正它.谁能调试这个?我会非常感激的.
与大多数浮点问题一样,答案是C的工作精度有限.浮点数是二进制的.它们不能精确地表示十进制数1.99 - 它可能是一个接近的值,如1.990000000023.....
这些问题的标准链接:每个计算机科学家应该知道浮点数
幸运的是,这是一个简单的解决方案(但并不完美!).找到(num*10000.0)的根,使用增量1.这当然是你真正想要的根的100倍.因此,最后两位数字是您想要的"小数位".您会发现40000.0的根目录恰好是200.0.这样1.0可以完美地表示.
你在这方面为精确度付出的代价是你在另一端失去它 - 乘以10000意味着你会因为数字越大而失去精确度.简单的解决方案很少没有缺点,抱歉.
那是因为计算机无法正确处理实数.
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems