2017-12-21 10 views
-3

2つの数値の逆正接を計算するプログラムを作成しています。コードを単純化するためにif:文を使用したいと思います。 ゼロを超えるゼロのatanがマイナスの無限大であるため、計算されたatanの絶対値が90より大きい場合、結果は90度に等しくなるような文を追加しました。 しかし、私のコードの出力は90ではなく-2147483648です。私のコードの問題は何ですか?どうもありがとうございました! 。C:+でif:as if文を使用する際の問題

#define _USE_MATH_DEFINES 
#include <iostream> 
#include <math.h> 
#include <vector> 
#include <stdlib.h> 

using namespace std; 

int main() 
{ 
    vector<int> abc(1); 
    int a=0,b=0; 
    abc[0]=abs((int)(atan((float)a/b) * 180/M_PI)) > 90 ? 90 : (int)(atan((float)a/b) * 180/M_PI); 
    cout<<abc[0]; 
    return 0; 
} 
+7

を使用してコンパイルすることを忘れないでください。ところで、長すぎて読めないので、あなたの指示をいくつかに分けてください。 –

+1

値はまさに32ビット整数の最小値です。ほとんどの場合、Cスタイルの整数へのキャストに問題があります。これは、自分のコードに論理エラーがあります。 –

+2

すべての警告とデバッグ情報でコンパイルします: 'g ++ -Wall -Wextra -g'と[GCC](http://gcc.gnu.org/)。次に**デバッガを使用してください。 –

答えて

6

正直言って、atan2を使用してください。ロジックをコーディングする手間を省くことができます。

また、atan2(0,0)は指定されたドメインエラーを表示します。原点から原点まで直線を描き、線と正のx軸との間の角度が何であるかを想像すると、それは文字通り任意の角度であり、従って定義されていない。

1

aとbの値はゼロです。この変数を初期化する。

0

元のコードprint -2147483648。 次のコードを試してください。期待どおりに90が印刷されます。 (私はあなたのコードに含まれるヘッダーの一部を書き直しました。)

#include <iostream> 
#include <cmath> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector<int> abc(1); 
    int a=0,b=0; 
    abc[0]=abs((int)(atan((float)a/b) * 180/M_PI)) > 90 ? 90 : (int)(atan((float)a/b) * 180/M_PI); 
    cout<<abc[0]; 
    return 0; 
} 

あなたの表現でより多くの括弧を追加

g++ main.cpp 
+0

私は、含まれているヘッダが異なることを除いて、コードは私の元のコードと非常に似ていると思います。 cmathライブラリを使用すると、なぜそれがうまくいくのか説明できますか? –

関連する問題