- ベストアンサー
arcsin関数が無いPC言語
表題の通りの質問です。 (以下arcsin,arctanはそれぞれsin,tanの逆関数です) ネットで検索しますと、arctanを使って arcsin(x)=arctan(x/√(1-x*x)) とする例をよく見かけますが、 この場合x=±1のときに正しい計算が行われません。 条件分岐で回避する方法もありますが、 もっとスマートに一つの式で計算できないでしょうか? もし条件分岐以外に方法がない場合 x=±1とそれ以外に分ける他の分岐法はありますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
arcsin(x) = 2 * arctan(x / (1 + √(1 - x * x))) とかいかがですか?
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
arctan にはしばしば 2引数のものがあったりする (例: C の atan2) ので, これがあれば終了... なんだけど, 2引数の arctan があって arcsin がない言語ってのも変かも. おまけ: #3 では [x] の中身は必ず正です....
- y_akkie
- ベストアンサー率31% (53/169)
#2です。すみません、以下でも実際に計算するときに0割りが発生してしまうので、不具合が生じてしまいます。 arcsin(x) = (1-x^2)*(arctan(x/√1-x*x)+ x^2*(2*arctan(1)-arctan(√(1-x^2)/x) なので、[x]を用いて以下のように定義します。 なお、[x]はxの整数部となります。 arcsin(x) = (1-x^2)*(arctan(x/(√1-x*x + [x^2]))+ x^2*(2*arctan(1)-arctan(√(1-x^2)/(x+[1-x^2])
補足
[x]は整数部とのことですが、いわゆるガウス記号(int)のことでしょうか? -1<x<0の場合[x]はいくつになりますか? 正か負かで場合分けしないといけませんか? でも整数部分の関数を使うアイデアは良いヒントになりそうです。 ありがとうございました。
- y_akkie
- ベストアンサー率31% (53/169)
tan((π/2)-A) = 1/tanAという公式(性質?)を利用すれば、 与式を以下のように変換する事が可能ではないでしょうか。 arcsin(x) = 2*arctan(1)-arctan(√(1-x^2)/x) となります。だが、今度は、x=0の時は計算できないといった不具合が 生じる事になります。 なので、 arcsin(x) = (1-x^2)*(arctan(x/√1-x*x)+ x^2*(2*arctan(1)-arctan(√(1-x^2)/x)とすれば不具合は解消されるのではないでしょうか。
お礼
素晴らしいです。 半角(2倍角)の公式の利用ですね。 ありがとうございました。
補足
こういうセンス(知識?)はどうしたら身に付くものでしょうか? おすすめの本などありましたら教えてください。