0

私は現在、ほぼ 1 年間行ってきた個人的なプロジェクトに取り組んでいます。Windows 環境に移植しようとしていますが、成功しています。私はすぐに Windows バージョンを人々に提供しようとしているので、新しい機能を追加したり、何ヶ月も前から存在していたバグを見つけたりしながら、Windows で開発を続けることにしました。最近、三角法に大きく依存する機能を追加しようとしたときに、奇妙なことに、渡したパラメーターに関係なく、3 つの三角関数すべてが同じ値 (1072693887) を返すことがわかりました。ご想像のとおり、これはシステムにかなり奇妙なバグを引き起こしています。

math.h が含まれていますが、私の知る限り、この関数を含む他のファイルはありません。(おそらく、シンボルが定義されている場所を見つけるためのデバッガー コマンドがありますか? 私はそのようなものを見つけることができませんでしたが、おそらく何かを見逃していました。) 他の場所で質問したり、Google で検索したりしましたが、役に立ちませんでした...

他の誰かが以前にこの問題について聞いたことがありますか、またはそれを修正する方法を知っていますか?

4

4 に答える 4

5

編集:この回答は関係ありません。コメントを参照してください。


これはおそらく数値の不安定性によるものです。

このような大きな値をsin()cos()、または周期三角関数のいずれかに渡すときは、 による暗黙のモジュロがあることを覚えておく必要があります2*pi

を使用している場合float、 の不確実性は1072693887よりもはるかに大きくなり2*piます。したがって、どんな結果が得られてもゴミです。

ただし、何が起こっているかを正確に確認するには、いくつかのコードを確認する必要があります。

編集:ここにイラストがあります:

sin(1072693886) =  0.6783204666
sin(1072693887) = -0.2517863119
sin(1072693888) = -0.9504019164

しかし、データ型がfloatの場合、 の不確実性1072693887+/- ~64...

于 2011-11-20T18:27:36.923 に答える
2

1072693887 は 16 進数で 3FF207FF であり、IEEE 単精度浮動小数点で 1.8908690 を表します。あなたの問題は単なる表現の問題ではありませんか?つまり、結果を整数としてキャストまたは表示していますか?

于 2011-11-20T18:37:40.180 に答える
0

私が知っているのは、GDB がその結果が 1072693887 であること、3 つのトリガー関数すべてで発生していること (そして、3 つすべてのアーク バージョンが -1072693887 を返すだけであること) を私が渡すパラメーターに関係なく伝えていることだけです。

GDBの問題かもしれません。値を手動でコンソールに出力するとどうなりますか?

于 2011-11-20T20:55:37.850 に答える
0

数学ライブラリは問題ありません。

関数がラジアンを入力として期待していることに気付きましたか?

例:

double param = 90.0;
double rads = param * M_PI/180;
std::cout << std::fixed << "Angle : " << param << " sin : " << sin (rads) << " cos " << cos(rads);

出力:

Angle : 90.000000 sin : 1.000000 cos 0.000000-0.304811
于 2011-11-20T18:51:05.143 に答える