2012-02-19 16 views
3

math.hライブラリのsin()およびcos()という関数を使用しているプログラムを作成しています。しかし、私はファンキーな結果を得ていることに気付きました。複数回の周りに検索すると私の数学をチェックした後、私はこれで簡単なチェックを行うことを決めた。問題点

int main() 
{ 
    cout << "sin(45.0) = " << sin(45) << endl; 
    cout << "cos(45.0) = " << cos(45) << endl; 

    return 0; 
} 

をそして私はこの出力を得る:

sin(45) = 0.850904 
cos(45) = 0.525322 

これらが等しい右すべきですか? math.hライブラリに関する特別なことはありますか?私は何か間違っているのですか?ここ

はWolframAlphaで式である:

sin(45)

cos(45)

答えて

9

古いCヘッダーではなく、C++でcmathを使用する必要があります。

std::sin()およびstd::cos()はいずれも、角度を表す浮動小数点値をradianとします。それが簡単にあなたがラジアンに程度を変換できるようにするためであろう(C++標準には存在しませんが)

The GCC version of this file includes a handy constant for π、:

#include <cmath> 
#include <iostream> 

double degrees_to_radian(double deg) 
{ 
    return deg * M_PI/180.0; 
} 

int main() 
{ 
    std::cout << "sin(45.0) = " << std::sin(degrees_to_radian(45)) << std::endl; 
    std::cout << "cos(45.0) = " << std::cos(degrees_to_radian(45)) << std::endl; 
} 

See it run!

+1

90度で精密な問題! http://ideone.com/KOxs8d – Patric

5

三角関数はradiansはなく度を使用します。

+0

これは恥ずかしいです。しかし、ありがとう:) –

8

sinおよびcosラジアン単位の入力は度ではありません。
はこれを試してみてください。
sin(degrees * pi/180)

2

sin()cos()はラジアンではない学位として、あなたのパラメータを扱います。

0

その奇妙な私は0ときを取得することはできませんので、 90度のラジアン値であるcos(1.5707963267948966)を使用します。

long double degrees = 90.0; 
    long double radians = glm::radians(degrees); 
    long double result = cos(radians); 

結果は6.1232339957367660e-017で、冗談ではありません。 glmも正しくラジアンを計算しており、googleと比較して確認しています。 私は、それが何らかの形で丸めの問題ではなく、そうでないことを確認するために長いdoubleを使用しました。ちょうどこの情報が何とか役立つかもしれないと思った

+0

'1.5707963267948966 'は10桁の近似値であるため、' cos(1.5707963267948966) 'を評価するときにゼロにならない理由はです。 90度をラジアンに変換する式は['90 *(pi/180)']です(https://www.wolframalpha.com/input/?i=90*(pi%2F180))。 piはコンピュータによって完全に表現することはできないので、丸めが必要な切り捨てがあります。だから、あなたは本当にゼロに近づくでしょうが、正確にはゼロにはなりません。これはあなたの結果で見ることができます - '6.1232339957367660e-017' - 本当にゼロに近いです。 –

+0

オハイオ州は、6.1232339957367660e-017が本当にゼロに近いことを認識していませんでした。答えがありがとうございました。 – Tomster954

+0

問題はありません、うれしく思っています! –