なぜ出力は-3を期待して、3を与えています。cでそのような前処理を処理する方法は?
#include<stdio.h>
#include<math.h>
#define sq(x) ((x<0)?sqrt(-x):sqrt(x))
int main()
{
int x;
x=sq(-9);
printf("%d\n",x);
return 0;
}
なぜなら、#define "sq"は負の数かどうかをチェックし、平方根を計算する前に正の数に変換するからです。
sqrt(-(-9))であるsqrt(-x)を実行します(負の負数を取ることは正の数です)
したがって、sqrt(9)を実行します
待って、待って、待って。
ここで数学の基本的なルールを破ろうとしていますか?
-9の平方根は3iです。
これは、(-3)^2が9であるためです。負の数には「虚数」の平方根があります。sqrt(-1)はiです。-1ではありません。(-1)^2は1です。
あなたはこれを定義しています:
define sq(x) ((x<0)?sqrt(-x):sqrt(x))
-9を渡しているx<0
ので、trueなので、sqrt(9)
3を実行しています。
次に、3を印刷します。
コードは、言われていることを正確に実行していると思います。
sq(x)
最初にテストx < 0
します-あなたの場合、これは本当なので、sq(x)
呼び出しますsqrt(-(-9))
-これは3です。
試みられた解決策は(x < 0) ? -sqrt(-x) : sqrt(x)
、であり、これは負の根を返しx
ます(あなたの意図の私の最良の解釈)。
あなたが期待するなら-3
、あなたはおそらく意味しました
#define sq(x) ((x<0)?-sqrt(-x):sqrt(x))
しかし、なぜあなたは負の数の負の平方根が私を超えていると期待するのでしょうか。