- 締切済み
C言語でのアークタンジェント
Visual Studio C+でヘッダーファイルmath.hを用いて、atan2(,)を使用したいのですが、返り値の設定が-pi~piになっていて困っています。 この返り値の設定を変更したいのですが、どのファイルを変更すればいいのか、どのように変更すればいいのかがわかりません。 誰かわかる人がいたらアドバイスをお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- cametan_42
- ベストアンサー率62% (162/261)
- Tacosan
- ベストアンサー率23% (3656/15482)
増減量に限界があるなら「増加したか減少したか」の判断は可能だと思いますけど, いかがなものでしょうか>#4. と思ったんだけど, よく考えたら「増減量に限界がないと仮定するとプログラムとして書けない」ことに気づいてしまった. 点が (0, 0) から (1/√2, 1/√2) に動いたときに, 角度として「0→π/4」なのか「0→9π/4」なのか「0→17π/4」なのかはたまたもっと大きく増えたのか, 判定のしようがない.
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
追記の追記。 >求める角度は0から正方向に増加していきます。しかし、たまに少し減少もします。 これは困りますね。本当に減少するとしたら、プログラムではどうにも出来ません。 「少しの減少を考慮しない、常に増加一方のプログラム」では「座標の計算誤差により、本当に角度が少し減少した」場合には、角度は「いきなり360度近く増加」してしまいます。 「少しの減少を考慮した、たまに小さく減少するプログラム」では「座標の計算誤差により、本当に角度が少し減少した」場合には正しく動きますが、本当に「いきなり360度近く増加した場合」には「小さく減少した」と勘違いしてしまいます。 どちらのプログラムも「座標の計算誤差により、本当に角度が少し減少した」のと「いきなり360度近く増加した」のは区別できません。 どちらの場合も「引数として渡されて来る座標値x,yは、同一の変化をする」(言い換えれば、どちらのケースでも、同じx,yが渡されて来る)ので、プログラムでは「絶対に区別出来ない」です。 それこそ、微分してみた結果を人間がチェックし「ここは誤差で減少した場所」「ここは本当に360度近く増えた場所」と、人間が数値を読んで、手で判断しなければなりません。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
コピペし間違ったので訂正。 #ifndef M_2_PI #define M_2_PI 0.636619772367581343076 /* 2πの定義 */ は #ifndef M_PI #define M_PI 3.14159265358979323846 /* πの定義 */ にして while (Value < BeforeValue) Value += M_2_PI; は while (Value < BeforeValue) Value += (M_PI * 2.0); にして下さい。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19840)
>この返り値の設定を変更したい 標準ライブラリ関数の動作(返り値など)を書き替えたい場合は、下記のように関数を自作しましょう。 その自作関数の中で標準ライブラリ関数を呼ぶ際に、呼び出し時の引数を加工してから呼んだり、標準ライブラリ関数から返って来た戻り値を加工してから呼び出し元に返せば、標準ライブラリ関数を好きなように改造出来ます。(呼ぶ関数名は、元の関数名と変わってしまいますが) /* --自作関数-- */ #ifndef M_2_PI #define M_2_PI 0.636619772367581343076 /* 2πの定義 */ #endif double My_atan2(double y,double x) { static double BeforeValue = -1.0; /* 初期値は負数なら何でも良い */ double Value = atan2(y,x); while (Value < BeforeValue) Value += M_2_PI; BeforeValue = Value; return Value; } と言う「自作関数」を作り、atan2の代わりに、この自作関数を呼びましょう。 なお http://okwave.jp/qa4634631.html で、内容的に同じ質問を重複して投稿してますので、片方を締め切るなどして、両方に回答が付かないようにして下さい。
お礼
ありがとうございました。
- php504
- ベストアンサー率42% (926/2160)
本体はライブラリの中なのでどうしようもないと思います 自作で関数を作るしかないでしょう ちなみに返り値を何にしたいのでしょうか
補足
回答ありがとうございました。 返り値は0~無限大に設定したいです。 今回困っている点は、求める角度は0から正方向に増加していきます。しかし、たまに少し減少もします。この求めた角度を微分して新たな値を得たいので、連続的に出力できるようにしたいです。 180°を超えたら200°、220°と変化させたいです。また角度が一周して(359°)になったら、次は380°、400°と変化させたいです。 説明が下手で分かりにくいと思いますが、アドバイスお願いします。
お礼
たくさんの回答ありがとうございます。 自分が一番悩んでいたところを上手に伝えられず申し訳ございませんでした。今、指摘していただいたところが一番の悩みでした。 本当にありがとうございます。