数字的第n个根

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)

我已经尝试了几个小时,但无法纠正它.谁能调试这个?我会非常感激的.

Ric*_*ard 10

您需要阅读"每个计算机科学家应该知道的关于浮点算术的内容".

浮点数 - 通常用于表示非整数的浮点数 - 本质上是有限的.这些限制允许良好的性能,但代价是这种异常.


MSa*_*ers 5

与大多数浮点问题一样,答案是C的工作精度有限.浮点数是二进制的.它们不能精确地表示十进制数1.99 - 它可能是一个接近的值,如1.990000000023.....

这些问题的标准链接:每个计算机科学家应该知道浮点数

幸运的是,这是一个简单的解决方案(但并不完美!).找到(num*10000.0)的根,使用增量1.这当然是你真正想要的根的100倍.因此,最后两位数字是您想要的"小数位".您会发现40000.0的根目录恰好是200.0.这样1.0可以完美地表示.

你在这方面为精确度付出的代价是你在另一端失去它 - 乘以10000意味着你会因为数字越大而失去精确度.简单的解决方案很少没有缺点,抱歉.

  • 一样.它也不能代表数字"0.01".它会像`0.009999999999984 ...`.因此,0.01 + 0.01将为"0.019999999999968 ...".并且0.01 + 0.01 + 0.01 + 0.01(乘以199)将导致198个舍入误差. (2认同)

Fed*_*oca 5

那是因为计算机无法正确处理实数.

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

  • 更具体地说,计算机无法处理*无限精度*.所有对象(包括所有数字,包括所有浮点数)都由一组有限的字节表示. (3认同)
  • @Loadmaster:更具体地说:计算机像人类一样处理无限精确:象征性地. (3认同)