2017-05-19 3 views
2

以下のステートメントを実行している間、コンソールに誤った値が表示されます。私は初心者のように立ち往生した。表示Object-cでTan(90)の値が未定義にならない

NSLog(@"tan(90)=%f",tan(90*M_PI/180.0); 

出力:日焼け(90)= 16331239353195370.000000

+0

予想される結果は何ですか?文字列は 'NSLog(@" tan(90)=%f "、tan(90.0);' – shallowThought

+0

'を出力することを示唆しています(If/Elseを使って実行する必要があります) – pgr

+0

どうしてですか? – shallowThought

答えて

2

結果は正しいです。 M_PI/2.0doubleであり、π/ 2に非常に近いが、正確にはπ/ 2(πはdoubleで正確に表すことはできない)ではない。したがって、その接線は非常に大きいですが、無限ではありません。

schmitdt9's link to the tan docsは有用であるが、重要な注意点は、この一つである:

関数はπで数学極(1/2 + n)を有します。一般的な浮動小数点表現はπ/ 2を正確に表すことができないため、ポールエラーが発生する引数の値はありません。

「極」は「関数が無限大の入力」を意味します。

"どのように私はtan(90)をコンソールで定義されていないものとして表示するべきですか?"という答えには特別なケースが必要です。 0-360に渡されたものを正規化し、それが90か270かどうかを確認します。その場合はinfiniteを、それ以外の場合はtanとしてください。

0

tanは、C関数で、このページを参照してくださいhttp://en.cppreference.com/w/cpp/numeric/math/tan 特にそれが言われている。

ドメイン場合エラーが発生し、実装定義の値が返される (NaNがサポートされている場合)

だから私は数16331239353195370.000000は特別なマクロINFINITYあり、この場合に

編集インフィニティは を印刷について

をインフィニティ/エラーを意味と仮定して、あなたは

NSLog(@"%f", INFINITY); 

出力を行う場合

inf 
関連する問題