6

小数点以下 2 桁までの数の n 乗根を計算するプログラムを作成しました。たとえば、81 の 4 乗根は 3 です。125 の 3 乗根は 5 です。4 の 2 乗根を除いて、うまく機能します。出力は 2 ではなく 1.99 になります。コードは次のとおりです。

#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;
    }
}

何時間も試しましたが、修正できません。誰でもこれをデバッグできますか?? とても感謝しています。

4

9 に答える 9

10

「すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと」を読む必要があります。

非整数を表すために通常使用される浮動小数点数には、本質的に制限があります。これらの制限により、優れたパフォーマンスが可能になりますが、そのような異常が犠牲になります。

于 2010-08-16T15:28:11.937 に答える
5

答えは、ほとんどの浮動小数点問題と同様に、C は限られた精度で動作するということです。そして、フロートはバイナリです。10 進数の 1.99 を正確に表すことはできません1.990000000023....

これらの問題の標準リンク: What Every Computer Scientist Should Know About Floating-Point

幸いなことに、簡単な解決策があります (ただし、完全ではありません!)。1 ずつ増やして (num*10000.0) の根を求めます。もちろん、これは本当に必要なルートの 100 倍になります。したがって、最後の 2 桁は、必要な「小数点以下の桁数」です。40000.0 のルートは正確に 200.0 であることがわかります。これは1.0完全に表現できるため機能します。

その端での精度に対して支払う代償は、反対側でそれを失うことです.10000を掛けると、数値が大きくなると精度が失われます. 申し訳ありませんが、簡単な解決策に欠点がないことはめったにありません。

于 2010-08-16T15:18:42.930 に答える
5

これは、コンピュータが実数を適切に処理できないためです。

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

于 2010-08-16T15:19:27.953 に答える
2

k=1 を取る;

#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=1;
    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;
    }
}
于 2011-06-30T04:51:43.563 に答える
2

0.01 の精度が必要な場合は、0.005 以下のステップが必要で、丸めを実行します。最善の方法は、単に pow(num1, 1/n) を使用することです:-)

于 2010-08-16T15:20:53.753 に答える
1

Mソルターズが言ったこと。値をincre小さくして、値が徐々に 2.0 に近づく様子を確認してください。返されるものよりも高い「内部」精度 (つまり、インクリメント) を持ち、内部結果を 2 桁に丸めることができます。このようにして、これらの丸めの問題をカバーすることができます (ただし、これはテストされていない疑いにすぎません)。

于 2010-08-16T15:21:27.030 に答える
0
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
double n,m;
cin>>n;
cin>>m;
m= pow(m, (1/n));
cout<<m;
return 0;
}

なぜそのような巨大なコードを書くのか.これは、double を int に変更するまで完全に機能します。

于 2014-08-14T16:57:20.563 に答える
0

より小さな「増分」値が機能するはずです。私は 0.001 を使用し、root1 は 4 の平方根に対して 2.00 を返しました。

また、答えを小数点以下 2 桁まで表示したい場合は、ルートを出力するときに %.2f を使用します。

于 2010-08-16T15:35:47.180 に答える
0

double は必ずしも浮動小数点数を正確に表現できるとは限りません。代わりに 10 進データ型を使用してみてください (c にそのような考えがある場合は、申し訳ありませんが思い出せません)。C# には decimal があり、Java には浮動小数点数を正確に表す BigDecimal クラスがあります。

于 2010-08-16T15:21:10.877 に答える