• ベストアンサー

arcsin関数が無いPC言語

表題の通りの質問です。 (以下arcsin,arctanはそれぞれsin,tanの逆関数です) ネットで検索しますと、arctanを使って arcsin(x)=arctan(x/√(1-x*x)) とする例をよく見かけますが、 この場合x=±1のときに正しい計算が行われません。 条件分岐で回避する方法もありますが、 もっとスマートに一つの式で計算できないでしょうか? もし条件分岐以外に方法がない場合 x=±1とそれ以外に分ける他の分岐法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ashi_oto
  • ベストアンサー率40% (9/22)
回答No.1

arcsin(x) = 2 * arctan(x / (1 + √(1 - x * x))) とかいかがですか?

sak_sak
質問者

お礼

素晴らしいです。 半角(2倍角)の公式の利用ですね。 ありがとうございました。

sak_sak
質問者

補足

こういうセンス(知識?)はどうしたら身に付くものでしょうか? おすすめの本などありましたら教えてください。

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

arctan にはしばしば 2引数のものがあったりする (例: C の atan2) ので, これがあれば終了... なんだけど, 2引数の arctan があって arcsin がない言語ってのも変かも. おまけ: #3 では [x] の中身は必ず正です....

  • y_akkie
  • ベストアンサー率31% (53/169)
回答No.3

#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])

sak_sak
質問者

補足

[x]は整数部とのことですが、いわゆるガウス記号(int)のことでしょうか? -1<x<0の場合[x]はいくつになりますか? 正か負かで場合分けしないといけませんか? でも整数部分の関数を使うアイデアは良いヒントになりそうです。 ありがとうございました。

  • y_akkie
  • ベストアンサー率31% (53/169)
回答No.2

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)とすれば不具合は解消されるのではないでしょうか。

関連するQ&A