0

私はすべてが正常に機能しています。コード-

#include <stdio.h>
#include <math.h>

int quadtest(unsigned long long int a, unsigned long long int b, unsigned long long int c,     unsigned int n)
{
    if ((pow(a,n)+pow(b,n))==pow(c,n))
        return 1;
    else
        return 0;
}

main()
{
unsigned long long int a;
unsigned long long int b;
unsigned long long int c;
unsigned int n;

n=3;
for(n; n<50; n++)
{

//printf("\nn=%u",n);
    for(c=2; c<500; c++)
    {

        printf("\ntrying now c=%llu and n=%u",c,n);     
        for(b=2; b<500; b++)
        {
            for(a=2; a<500; a++)
            {
                quadtest(a,b,c,n);
                if (quadtest(a,b,c,n)==1)
                {   
                    printf("\n|||||||||||||||||||||||WORKS|||||||||||||||||||||||||||||||||");
                    break;
                }
                //printf("\na=%llu, n=%u b=%llu c=%llu",a,n,b,c);   

            }
        if (quadtest(a,b,c,n)==1)
        break;}

        if (quadtest(a,b,c,n)==1)
        break;
    }
    if (quadtest(a,b,c,n)==1)
    break;
}       
if (quadtest(a,b,c,n)==1)
printf("\nthe correct values are a=%llu,b=%llu,c=%llu,n=%u",a,b,c,n);
else
printf("\nfermats theory is correct");
}

私の立場からすると、すべてを正しくコーディングしました(50と500の範囲のみを使用したため、文字通り1日もかからずに実際にコンピューターで実行できました)。

そこで、Cygwin(使用する必要があります)でプログラムをコンパイルしました。約15分かかり、「正しい値はa = 381、b = 2、c = 381、n=7」で停止しました。これは明らかに正しくない。問題が何であるか、またはこれを修正する方法がわかりません。それはメモリと関係があると思いますが、それでも修正が何であるかはわかりません。

4

2 に答える 2

2

pow()double ( return double )を扱っているため、次のように an を使用して比較することをお勧めEPSILONします。「小さい」double (例: double EPSILON = 0.001) を作成し、2 つの変数の差を計算して double と比較します。

double a,b;
if(abs(a - b)) < EPSILON){
     /* your code here..
}

機能を使用することが重要なabs()ので、心配する必要はありません(a > b) || (b < a)

より良い結果を得るために、より小さい を選択できますEPSILON

これを書きます:

if ((pow(a, n) + pow(b, n) - pow(c, n)) < EPSILON) {
    return 1;
于 2013-03-10T22:39:11.863 に答える
1

pow()はdouble引数を取り、doubleを返します。doubleの精度には制限があります(通常は64ビットを使用します)。(x + 1.0)==xとなるようなdoublexが存在します。381 ** 7は非常に大きな整数であるため、これは基本的にあなたが遭遇しているものです。

この種の計算を正しく行うには、大きな整数に対して正確な計算を行う方法が必要です。必要なものは、一般に「bignum」ライブラリとして知られています。GMPはそのようなものの1つです、あなたはそれをチェックしたいかもしれません。

于 2013-03-10T22:17:09.310 に答える