0
float Raise2power(double base, int exponent){
    if(exponent==0){
        return 1;
    }
    else {
        while (--exponent){
            base*=base;
        }
        return base;
    }
}

戻り値の型を float に変更したところ、このコードは機能しますが、double のときにガベージが返されました。

4

1 に答える 1

3

問題は、表示されていないコードにあるに違いありません。

まず、それは累乗関数ではありません。あなたは繰り返し二乗 baseしています。

あなたの機能を小さな完全なプログラムに組み込むとき:

#include <stdio.h>

float Raise2power(double base, int exponent){
   if(exponent==0){
       return 1;
   }
   else {
        while (--exponent){
           base*=base;
        }
        return base;
   }
}

int main(void) {
    int i;
    for (i = 0; i <= 5; i ++) {
        printf("Raise2power(10.0, %d) = %.1f\n", i, Raise2power(10.0, i));
    }
    return 0;
}

私はこの出力を得る:

Raise2power(10.0, 0) = 1.0
Raise2power(10.0, 1) = 10.0
Raise2power(10.0, 2) = 100.0
Raise2power(10.0, 3) = 10000.0
Raise2power(10.0, 4) = 100000000.0
Raise2power(10.0, 5) = 10000000272564224.0

に変更float Raise2powerするとdouble Raise2power、次の出力が得られます。

Raise2power(10.0, 0) = 1.0
Raise2power(10.0, 1) = 10.0
Raise2power(10.0, 2) = 100.0
Raise2power(10.0, 3) = 10000.0
Raise2power(10.0, 4) = 100000000.0
Raise2power(10.0, 5) = 10000000000000000.0

完全なプログラムとその出力を示してください。

更新:コメントで、バグを修正し、現在は機能していると述べています。これら 2 つのことは無関係だと思います。あなたが私たちに示したコードでは、ガベージ値を生成するべきではありません-どこかで何か間違ったことをしていない限り.

私の最善の推測は、ある場所で戻るように関数を定義したが、別の場所で戻ると宣言したか、またはその逆であるということです。コンパイラは、呼び出しを確認すると、結果が 1 つの型であると想定しますが、実際には別の型です。floatdouble

それか、目に見える宣言なしで関数を呼び出しました。C99 より前のコンパイラ (Microsoft など) の場合、コンパイラは戻り値の型が であると想定しますがint、これもガベージを生成します。floatしかし、その後、 forまたは for のいずれかでガベージを取得する必要がありますdouble

この種の問題を回避する方法は、ヘッダー ファイルで関数を宣言すること#includeです。そのヘッダー.cは、関数を定義するファイル (コンパイラが一貫性をチェックできるようにするため) と、関数の呼び出しを含むソース ファイルの両方で宣言します。 .

ただし、問題を診断するのに十分な情報が提供されていないため、これは推測にすぎません。

推奨読書: http://sscce.org/

于 2013-01-19T21:14:30.150 に答える