(rontolisp) docs
← cl パッケージの関数

asin acos atan

(asin number) (acos number) (atan number) (atan y x)

逆三角関数で、いずれも角度をラジアン単位の浮動小数点数で返します。asin は逆正弦、acos は逆余弦、atan は逆正接です。atan は引数 2 つの (atan y x) 形式も取ります。これは C の atan2 で、ベクトル (x, y) の角度を全周にわたって返すもの、すなわち x + yi の偏角です。3 つともすべてのバックエンドで動き、どれも fdlibm の値です(インタプリタと JVM では StrictMath、WASM では同じアルゴリズム)。そのため桁はどこでも一致します。(asin 1) は正確に pi/2、(acos 1) は正確に 0.0 です。asin/acos の引数が [-1, 1] の外にあるときは実数直線を離れ、NaN ではなく複素平面の値を返します -- (asin 2) は #C(1.5707963267948966 -1.3169578969248166)、(acos -4) は #C(3.141592653589793 -2.0634370688955608) です。答えの型は値で決まるので、(let ((x 2d0)) (asin x)) はどのバックエンドでも複素数です。

複素数の引数に対しては複素平面で答えます。asin と acos は 2 つの平方根 sqrt(1-z) と sqrt(1+z) から組み立てるため、虚部が 0 で実部が [-1, 1] にある複素数は正確に実数の値を返します -- (asin (complex 0.5d0 0d0)) の虚部は丸め残差ではなく 0.0 です。どちらも [-1, 1] の外の実軸に分岐切断を持ち、切断上の値は 1 より上では第 4 象限、-1 より下では第 2 象限と連続する側を取ります。どちら側かは実部の符号で決まり、虚部のゼロの符号では動きません。したがって (asin #c(2d0 0d0)) と (asin #c(2d0 -0d0)) は同じ値です (sqrt と log はここが異なり、虚部のゼロの符号が側を選びます)。

(atan y x) はゼロの符号が意味を持つ場所で、phase と同じ象限の組み立てを再利用します。したがって任意の z について (atan (imagpart z) (realpart z)) は (phase z) です。軸上の値はどのバックエンドでも正確です: (atan 0d0 1d0) は 0.0、(atan -0d0 0d0) は -0.0、(atan 1d0 0d0) は pi/2、(atan 0d0 -1d0) は pi、(atan -0d0 -1d0) は -pi です。2 引数形式では両方の引数が実数でなければならず、複素数を渡すと計算せずに ATAN: The value #C(1.0 1.0) is not of type REAL を通知します。