std.math
初等的な数学関数です。初等的な数学関数 (冪乗、平方根、三角関数など) と、低水準の浮動小数点演算を提供するモジュールです。 数学的特殊関数は std.mathspecial に実装されています。 それぞれの機能は、浮動小数点演算の標準規格 IEEE754-2008 に比較的忠実に実装されています。関数名に関しても、C99式の小文字の名前ではなく、 camelCase 形式の名前となっています。全ての関数は、 無限大やNANを与えたときも規格通りに動作します。
C言語と違い、グローバルな 'errno' 変数はありません。従って、 これらの関数のほとんどは pure nothrow です。 Status:
Γ関数とエラー関数は、改善され std.mathspecial に移動されました。std.math では DMD2.055 から公式に非推奨となります。 feqrel と approxEqual の名前と意味論は改訂される予定です。 Source:
std/math.d
License:
Boost License 1.0 Authors:
Walter Bright, Don Clugston
- e
- log210
- log2e
- log102
- log10e
- ln 2
- ln 10
- π
- π / 2
- π / 4
- 1 / π
- 2 / π
- 2 / √π
- √2
- √½
- 絶対値の計算
複素数に関しては abs(z) = sqrt( z.re2 + z.im2 ) = hypot(z.re, z.im) です。
- 共役複素数
conj(x + iy) = x - iy
z * conj(z) = z.re2 - z.im2 は常に実数になります。
- x の余弦を計算します。x はラジアンで指定します。
Special Values x cos(x) invalid? NAN NAN yes ±∞ NAN yes
BUGS:
|x| >= 264 では結果は未定義です。
- x の正弦を計算します。x はラジアンで指定します。
Special Values x sin(x) invalid? NAN NAN yes ±0.0 ±0.0 no ±∞ NAN yes
BUGS:
|x| >= 264 では結果は未定義です。
- pure nothrow @safe creal sin(creal z);
pure nothrow @safe ireal sin(ireal y); - 複素数と虚数の正弦
sin(z) = sin(z.re)*cosh(z.im) + cos(z.re)*sinh(z.im)i
sin(θ) と cos(θ) の両方が必要な場合は、 expi(θ) を使う方が効率的です。
- pure nothrow @safe creal cos(creal z);
pure nothrow @safe real cos(ireal y); - 複素数と虚数の余弦
cos(z) = cos(z.re)*cosh(z.im) - sin(z.re)*sinh(z.im)i
- x の正接を計算します。x はラジアンで指定します。
Special Values x tan(x) invalid? NAN NAN yes ±0.0 ±0.0 no ±∞ NAN yes
- x の逆余弦を計算します。
返値は 0 から π の間となります。
Special Values x acos(x) invalid? >1.0 NAN yes <-1.0 NAN yes NAN NAN yes
- x の逆正弦を計算します。
返値は -π/2 から π/2 の間となります。
Special Values x asin(x) invalid? ±0.0 ±0.0 no >1.0 NAN yes <-1.0 NAN yes
- x の逆正接を計算します。
返値は -π/2 から π/2 の間となります。
Special Values x atan(x) invalid? ±0.0 ±0.0 no ±∞ NAN yes
- y/x の逆正接を計算します。
返値は -π から π の間となります。
Special Values y x atan(y, x) NAN anything NAN anything NAN NAN ±0.0 >0.0 ±0.0 ±0.0 +0.0 ±0.0 ±0.0 <0.0 ±π ±0.0 -0.0 ±π >0.0 ±0.0 π/2 <0.0 ±0.0 -π/2 >0.0 ∞ ±0.0 ±∞ anything ±π/2 >0.0 -∞ ±π ±∞ ∞ ±π/4 ±∞ -∞ ±3π/4
- x の双曲余弦を返します
Special Values x cosh(x) invalid? ±∞ ±0.0 no
- x の双曲正弦を返します
Special Values x sinh(x) invalid? ±0.0 ±0.0 no ±∞ ±∞ no
- x の双曲正接を返します
Special Values x tanh(x) invalid? ±0.0 ±0.0 no ±∞ ±1.0 no
- x の逆双曲余弦を返します。
数学的には、acosh(x) = log(x + sqrt( x*x - 1)) です
Special Values x acosh(x) NAN NAN <1 NAN 1 0 +∞ +∞
- x の逆双曲正弦を返します。
数学的には、asinh(x) = log( x + sqrt( x*x + 1 )) // if x >= +0 asinh(x) = -log(-x + sqrt( x*x + 1 )) // if x <= -0
Special Values x asinh(x) NAN NAN ±0 ±0 ±∞ ±∞
- x の逆双曲正接を返します。
返値は -1 から 1 の間となります。
数学的には、atanh(x) = log( (1+x)/(1-x) ) / 2 です
Special Values x acosh(x) NAN NAN ±0 ±0 -∞ -0
- 現在の丸めモードに従って、x を long 型の値へと丸めます。
x の整数値が
long.max より大きい場合、
結果は不定になります。
- FE_TONEAREST丸めモードで、x を long 型の値へと丸めます。
x の整数値が
long.max より大きい場合、
結果は不定になります。
- x の平方根を計算します
Special Values x sqrt(x) invalid? -0.0 -0.0 no <0.0 NAN yes +∞ +∞ no
- ex を計算します。
Special Values x exp(x) +∞ +∞ -∞ +0.0
- 2x を計算します。
Special Values x exp2(x) +∞ +∞ -∞ +0.0
- 自然対数の底 (e) の
x 乗、引く 1 を計算します。
非常に小さな x に対しては、expm1(x) は exp(x)-1 よりも正確です。
Special Values x ex-1 ±0.0 ±0.0 +∞ +∞ -∞ -1.0
- 2x を計算します。.
Special Values x exp2(x) +∞ +∞ -∞ +0.0 NAN NAN - cos(y) + i sin(y) を計算します。
多くのCPU (x86など) では、これは非常に効率的で、 別々に sin(y) と cos(y) を計算する場合のほぼ2倍の速度となります。 両方の値が必要な場合はこの関数を使うのが望ましいと言えるでしょう。
- 浮動小数点数値 value を符号・仮数部と、指数部に分解します
Returns:
value =x*2exp かつ .5 <= |x| < 1.0
となる返値 x と exp を計算します。
x と value の符号は一致します。
Special Values value returns exp ±0.0 ±0.0 0 +∞ +∞ int.max -∞ -∞ int.min ±NAN ±NAN int.min
- x の指数を符号付整数値として取り出します
x が特殊値の場合を除き、結果は cast(int)logb(x) と一致します
Special Values x ilogb(x) Range error? 0 FP_ILOGB0 yes ±∞ int.max no NAN FP_ILOGBNAN no
- n * 2exp を計算します
References:
frexp
- x の自然対数を計算します
Special Values x log(x) divide by 0? invalid? ±0.0 -∞ yes no <0.0 NAN no yes +∞ +∞ no no
- x の底10の対数を計算します
Special Values x log10(x) divide by 0? invalid? ±0.0 -∞ yes no <0.0 NAN no yes +∞ +∞ no no
- 1+x の自然対数を計算します
非常に小さい x については、log1p(x) の方が log(1 + x) よりも正確です。
Special Values x log1p(x) divide by 0? invalid? ±0.0 ±0.0 no no -1.0 -∞ yes no <-1.0 NAN no yes +∞ -∞ no no
- x の底2の対数
log2x を計算します
Special Values x log2(x) divide by 0? invalid? ±0.0 -∞ yes no <0.0 NAN no yes +∞ +∞ no no
- x の指数を符号付整数として取り出します
x が非正規化数の場合、正規化数であるかのように扱われます。 正で有限の x について:
1 <= x * FLT_RADIX-logb(x) < FLT_RADIX
Special Values x logb(x) divide by 0? ±∞ +∞ no ±0.0 -∞ yes
- x/y の計算の余りを返します
Returns:
i を x から y を完全に引き算できる回数としたときの、 x - i * y の値を返します。結果は x と同じ符号を持ちます。
Special Values x y modf(x, y) invalid? ±0.0 not 0.0 ±0.0 no ±∞ anything NAN yes anything ±0.0 NAN yes !=±∞ ±∞ x no
- 効率的に x * 2n を計算します
scalbn は、アンダーフローとオーバーフローを 通常の算術演算と同じように扱います
Special Values x scalb(x) ±∞ ±∞ ±0.0 ±0.0
- x の立方根を計算します
Special Values x cbrt(x) invalid? ±0.0 ±0.0 no NAN NAN yes ±∞ ±∞ no
- 絶対値 |x| を返します
Special Values x fabs(x) ±0.0 +0.0 ±∞ +∞
- 他の二辺の長さが x と y
の直角三角形の斜辺の長さを返します。
斜辺の長さとはつまり、
x と y のそれぞれの二乗の和の平方根です:
sqrt( + )
hypot(x, y), hypot(y, x), hypot(x, -y) はどれも同じ値になります
Special Values x y hypot(x, y) invalid? x ±0.0 |x| no ±∞ y +∞ no ±∞ NAN +∞ no
- x の誤差関数を返します
- x の余誤差関数 1 - erf(x) を返します
- ガンマ関数の自然対数です
引数のガンマ関数の絶対値の、 底 e (2.718...) での対数値を返します
実数に関しては、lgamma は log(fabs(gamma(x))) と同値です。
Special Values x lgamma(x) invalid? NAN NAN yes integer <= 0 +∞ yes ±∞ +∞ no
- ガンマ関数 Γ(x)
Γ(x) は、 階乗関数を実数や複素数に一般化したものです。 x! 同様、Γ(x+1) = x*Γ(x) が成り立ちます。
数学的には、z.re > 0 ならば Γ(z) = ∫0∞ tz-1e-t dt です
Special Values x Γ(x) invalid? NAN NAN yes ±0.0 ±∞ yes integer >0 (x-1)! no integer <0 NAN yes +∞ +∞ no -∞ NAN yes
References:
http://en.wikipedia.org/wiki/Gamma_function, http://www.netlib.org/cephes/ldoubdoc.html#gamma
- x を (正の無限大方向の) 次の整数に
切り上げた値を返します
- x を (負の無限大方向の) 次の整数に
切り捨てた値を返します
- 現在の丸めモードを用いて、
x を一番近い整数へと丸めます
rint 関数と違って、nearbyint では FE_INEXACT 例外が発生しません。
- 現在の丸めモードを用いて、
x を一番近い整数へと丸めます。
返値が x と等しくなかった場合、
FE_INEXACT 例外がセットされます。
nearbyint
も同じ操作を実行しますが、FE_INEXACT はセットされません。
- 現在の丸めモードを用いて、
x を一番近い整数へと丸めます。
これは、一般的に浮動小数点数を整数に変換する最も速い方法です。 この関数の返値は、xの小数部がちょうど 0.5 だった場合に 丸めモードに依存することに注意してください。 デフォルトの丸めモード (偶数に丸める) では、 lrint(4.5) == 4, lrint(5.5)==6 です。
- x を一番近い整数へと丸めます。
x の小数部がちょうど 0.5 だった場合、
返値は偶数となります。
- x を一番近い整数へと丸めます。
x の小数部がちょうど 0.5 だった場合、 返値は0から遠い方になります。
- x の小数部を落とし、整数部分を返します
"chop" 丸めと呼ばれる動作です。
- IEC 60559 に従い、剰余 x REM y を計算します
REM は、もっとも x / y に近くなるよう整数 n を決めたときの x - y * n の値です。 |n - x / y| == 0.5 の時は、n は偶数とします。 結果がゼロの場合、符号は x と同じになります。 それ以外の場合は、結果は x / y の符号に一致します。 剰余関数は精度モードには影響されません。
remquo は上記の n を引数に返します。
Special Values x y remainder(x, y) n invalid? ±0.0 not 0.0 ±0.0 0.0 no ±∞ anything NAN ? yes anything ±0.0 NAN ? yes != ±∞ ±∞ x ? no
Note:
remquo はWindows版では非対応
- IEEE 例外状態フラグ ('sticky bits')
これらのフラグは、浮動小数点演算に関して例外的な状況が発生したことを示します。
NaN や無限大が発生したこと、不正確な計算結果になっていること、
計算途中にsignaling NaNに当たったこと、などを示します。
浮動小数点数例外を有効にしていれば(unmaskedならば)、
これらのフラグがセットされるかわりに、ハードウェア例外が発生します。
Example:
real a=3.5; // すべてのフラグをゼロにする resetIeeeFlags(); assert(!ieeeFlags.divByZero); // ゼロ除算 a/=0.0L; assert(a==real.infinity); assert(ieeeFlags.divByZero); // NaN の作成 a*=0.0L; assert(ieeeFlags.invalid); assert(isNaN(a)); // 関数 func() の呼び出しが // 状態フラグを変えないことの確認 IeeeFlags f = ieeeFlags; func(); assert(ieeeFlags == f);
- 結果が正確に表現できず、丸めが発生したことを示します。 (例: x = sin(0.1); } )
- アンダーフローにより 0 ができたことを示します。(例: x = real.min*real.epsilon/2;)
- オーバーフローにより無限大ができたことを示します。(例: x = real.max*2;)
- ゼロ除算により無限大ができたことを示します。(例: x = 3/0.0; )
- NaN ができたことを示します。(例: x = real.infinity * 0.0; )
{ // ハードウェア例外を division by zero, overflow to infinity, // invalid operations に対して有効に FloatingPointControl fpctrl; fpctrl.enableExceptions(FloatingPointControl.severeExceptions); double y = x*3.0; // x が未初期化ならばハードウェア例外 // fpctrl.rounding = FloatingPointControl.roundUp; // このスコープを抜けるところで再度ハードウェア例外は無効化されます。 // 元々の丸めモードも復元されます。 }
- Severe = overflow, division by zero, and invalid exceptions.
- 特定のハードウェア例外を有効 (unmasked) にします。複数の例外を OR で同時指定も可能です。
- 特定のハードウェア例外を無効 (masked) にします。複数の例外を OR で同時指定も可能です。
- 浮動小数点演算の丸めモードを変更します。
- 現在有効 (unmasked) な例外の種類を返します。
- 現在アクティブな丸めモードを返します。
== とほぼ同様ですが、正のゼロと負のゼロが区別され、 同じビットパターンを持つ NAN 同士は等しいとされるという違いがあります。
float に対しては、埋め込み可能な最大の payload は 0x3F_FFFF です。 doubles では 0x3_FFFF_FFFF_FFFF、 80-bit や 128-bit の real では、0x3FFF_FFFF_FFFF_FFFF が最大です。
Returns:
ulong で payload を返す
float に対しては、埋め込み可能な最大の payload は 0x3F_FFFF です。 doubles では 0x3_FFFF_FFFF_FFFF、 80-bit や 128-bit の real では、0x3FFF_FFFF_FFFF_FFFF が最大です。
realとして表現可能な、xより大きい最小の数を返します。 つまり、IEEE数直線で次の数を返します。
x | nextUp(x) |
---|---|
-∞ | -real.max |
±0.0 | real.min_normal*real.epsilon |
real.max | ∞ |
∞ | ∞ |
NAN | NAN |
realとして表現可能な、xより小さい最大の数を返します。 つまり、IEEE数直線で直前の数を返します。
x | nextDown(x) |
---|---|
∞ | real.max |
±0.0 | -real.min_normal*real.epsilon |
-real.max | -∞ |
-∞ | -∞ |
NAN | NAN |
y > x の時、結果は x より大きいxの次の浮動小数点値です。 y < x の時、結果は x より小さいxの次の浮動小数点値です。 x == y の時、結果は y です。
Remarks:
この関数は一般に使い勝手が良いとは言えません。 ほとんどの場合、より高速な nextUp() や nextDown() を使う方が良いでしょう。
x が有限で結果が無限になるとき、FE_INEXACT と FE_OVERFLOW 例外がセットされます。 結果が非正規化数で、x と y が等しくないとき、 FE_INEXACT例外と FE_UNDERFLOW例外 がセットされます。
Returns:
x, y | fdim(x, y) |
---|---|
x > y | x - y |
x <= y | +0.0 |
BUGS:
現在は正しく実装されていません - 丸めは2回行われます。
Returns:
x と y が等しい仮数部のビット数を返します。 例えば、0x1.F8p+60 と 0x1.F1p+60 は5bit等しいことになります。
x | y | feqrel(x, y) |
---|---|---|
x | x | real.mant_dig |
x | >= 2*x | 0 |
x | <= x/2 | 0 |
NAN | any | 0 |
any | NAN | 0 |
Horner則 A(x) = a0 + x(a1 + x(a2 + x(a3 + ...))) を使用しています
Params:
real[] A | 係数 a0, a1, ... の配列 |