std.math
- const real E;
- e
- const real LOG2T;
- log210
- const real LOG2E;
- log2e
- const real LOG2;
- log102
- const real LOG10E;
- log10e
- const real LN2;
- ln 2
- const real LN10;
- ln 10
- const real PI;
- π
- const real PI_2;
- π / 2
- const real PI_4;
- π / 4
- const real M_1_PI;
- 1 / π
- const real M_2_PI;
- 2 / π
- const real M_2_SQRTPI;
- 2 / √π
- const real SQRT2;
- √2
- const real SQRT1_2;
- √½
- real abs(real x);
long abs(long x);
int abs(int x);
real abs(creal z);
real abs(ireal y);
- 絶対値の計算
複素数に関しては、 abs(z) = sqrt( z.re2 + z.im2 )
= hypot(z.re, z.im) です
- creal conj(creal z);
ireal conj(ireal y);
- 共役複素数
conj(x + iy) = x - iy
z * conj(z) = z.re2 - z.im2
は常に実数になります
- real cos(real x);
- xの余弦を計算します。x はラジアンです。
特殊な値の場合
x | cos(x) | invalid? |
NAN | NAN | yes |
±∞ | NAN | yes |
BUGS:
|x| >= 264 の場合結果は不定です
- real sin(real x);
- xの正弦を計算します。x はラジアンです。
特殊な値の場合
x | sin(x) | invalid? |
NAN | NAN | yes |
±0.0 | ±0.0 | no |
±∞ | NAN | yes |
BUGS:
|x| >= 264 の場合結果は不定です
- creal sin(creal z);
ireal sin(ireal y);
- 複素数と虚数の正弦
sin(z) = sin(z.re)*cosh(z.im) + cos(z.re)*sinh(z.im)i
sin(θ) と cos(θ) の両方が必要な場合は、
expi(θ) を使う方が効率的です。
- creal cos(creal z);
real cos(ireal y);
- 複素数と虚数の余弦
cos(z) = cos(z.re)*cosh(z.im) - sin(z.re)*sinh(z.im)i
- real tan(real x);
- xの正接を計算します。x はラジアンです。
特殊な値の場合
x | tan(x) | invalid? |
NAN | NAN | yes |
±0.0 | ±0.0 | no |
±∞ | NAN | yes |
- real acos(real x);
- x の逆余弦を返します。
返値は 0 から π の間です。
特殊な値の場合
x | acos(x) | invalid? |
>1.0 | NAN | yes |
<-1.0 | NAN | yes |
NAN | NAN | yes |
- real asin(real x);
- x の逆正弦を返します。
返値は -π/2 から π/2 の間です。
特殊な値の場合
x | asin(x) | invalid? |
±0.0 | ±0.0 | no |
>1.0 | NAN | yes |
<-1.0 | NAN | yes |
- real atan(real x);
- x の逆正接を返します。
返値は -π/2 から π/2 の間です。
特殊な値の場合
x | atan(x) | invalid? |
±0.0 | ±0.0 | no |
±∞ | NAN | yes |
- real atan2(real y, real x);
- y / x の逆正接を返します。
返値は -π から π の間です。
特殊な値の場合
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 |
- real cosh(real x);
- x の双曲余弦を返します
特殊な値の場合
x | cosh(x) | invalid? |
±∞ | ±0.0 | no |
- real sinh(real x);
- x の双曲正弦を返します
特殊な値の場合
x | sinh(x) | invalid? |
±0.0 | ±0.0 | no |
±∞ | ±∞ | no |
- real tanh(real x);
- x の双曲正接を返します
特殊な値の場合
x | tanh(x) | invalid? |
±0.0 | ±0.0 | no |
±∞ | ±1.0 | no |
- real acosh(real x);
- x の逆双曲余弦を返します
数学的には acosh(x) = log(x + sqrt( x*x - 1))
特殊な値の場合
x | acosh(x) |
NAN | NAN |
<1 | NAN |
1 | 0 |
+∞ | +∞ |
- real asinh(real x);
- x の逆双曲正弦を返します
数学的には
asinh(x) = log( x + sqrt( x*x + 1 )) asinh(x) = -log(-x + sqrt( x*x + 1 ))
特殊な値の場合
x | asinh(x) |
NAN | NAN |
±0 | ±0 |
±∞ | ±∞ |
- real atanh(real x);
- x の逆双曲正接を返します
返値は -1 から 1 の間です
数学的には atanh(x) = log( (1+x)/(1-x) ) / 2
特殊な値の場合
x | acosh(x) |
NAN | NAN |
±0 | ±0 |
-∞ | -0 |
- long rndtol(real x);
- 現在の丸めモードに従って、x をlong型の値へと丸めます。
x の整数値が
long.max より大きい場合、
結果は不定になります。
- real rndtonl(real x);
- FE_TONEAREST丸めモードで、x をlong型の値へと丸めます。
x の整数値が
long.max より大きい場合、
結果は不定になります。
- float sqrt(float x);
double sqrt(double x);
real sqrt(real x);
- x の平方根を計算します
特殊な値の場合
x | sqrt(x) | invalid? |
-0.0 | -0.0 | no |
<0.0 | NAN | yes |
+∞ | +∞ | no |
- real exp(real x);
- ex を計算します
-∞ | +0.0 |
NAN | NAN |
- real expm1(real x);
- 自然対数の底 (e) の x 乗、引く1
を計算します
非常に小さな x については、expm1(x) の方が
exp(x)-1 よりも正確です
特殊な値の場合
x | ex-1 |
±0.0 | ±0.0 |
+∞ | +∞ |
-∞ | -1.0 |
NAN | NAN |
- real exp2(real x);
- 2x を計算します
特殊な値の場合
x | exp2(x) |
+∞ | +∞ |
-∞ | +0.0 |
NAN | NAN |
- creal expi(real y);
- cos(y) + i sin(y) を計算
多くのCPU (x86など) では、これは非常に効率的で、
別々に sin(y) と cos(y) を計算する場合のほぼ2倍の速度となります。
両方の値が必要な場合はこの関数を使うのが望ましいと言えるでしょう。
- real frexp(real value, out int exp);
- 浮動小数点数値 value を符号・仮数部と、指数部に分解します
Returns:
value =x*2exp かつ
.5 <= |x| < 1.0 となる
返値x と exp を計算します。
x と value の符号は一致します。
特殊な値の場合
value | returns | exp |
±0.0 | ±0.0 | 0 |
+∞ | +∞ | int.max |
-∞ | -∞ | int.min |
±NAN | ±NAN | int.min |
- int ilogb(real x);
- x の指数を符号付整数値として取り出します
x が特殊値の場合を除き、結果は
cast(int)logb(x) と一致します
特殊な値の場合
x | ilogb(x) | Range error? |
0 | FP_ILOGB0 | yes |
±∞ | int.max | no |
NAN | FP_ILOGBNAN | no |
- real ldexp(real n, int exp);
- n * 2exp を計算します
References:
frexp
- real log(real x);
- x の自然対数を計算します
特殊な値の場合
x | log(x) | divide by 0? | invalid? |
±0.0 | -∞ | yes | no |
<0.0 | NAN | no | yes |
+∞ | +∞ | no | no |
- real log10(real x);
- x の底10の対数を計算します
特殊な値の場合
x | log10(x) | divide by 0? | invalid? |
±0.0 | -∞ | yes | no |
<0.0 | NAN | no | yes |
+∞ | +∞ | no | no |
- real log1p(real x);
- (1 + x)の自然対数を計算します
非常に小さい x については、log1p(x) の方が
log(1 + x) よりも正確です。
特殊な値の場合
x | log1p(x) | divide by 0? | invalid? |
±0.0 | ±0.0 | no | no |
-1.0 | -∞ | yes | no |
<-1.0 | NAN | no | yes |
+∞ | -∞ | no | no |
- real log2(real x);
- x の底2の対数
log2x を計算します
特殊な値の場合
x | log2(x) | divide by 0? | invalid? |
±0.0 | -∞ | yes | no |
<0.0 | NAN | no | yes |
+∞ | +∞ | no | no |
- real logb(real x);
- x の指数を符号付整数として取り出します
x が非正規化数の場合、正規化数であるかのように扱われます。
正で有限の x について:
1 <= x * FLT_RADIX-logb(x) < FLT_RADIX
特殊な値の場合
x | logb(x) | divide by 0? |
±∞ | +∞ | no |
±0.0 | -∞ | yes |
- real modf(real x, inout real y);
- x/y の計算の余りを返します
Returns:
i を x から y を完全に引き算できる回数としたときの、
x - i * y の値を返します。 結果は x と同じ符号を持ちます
特殊な値の場合
x | y | modf(x, y) | invalid? |
±0.0 | not 0.0 | ±0.0 | no |
±∞ | anything | NAN | yes |
anything | ±0.0 | NAN | yes |
!=±∞ | ±∞ | x | no |
- real scalbn(real x, int n);
- 効率的に x * 2n を計算します
scalbn は、アンダーフローとオーバーフローを
通常の算術演算と同じように扱います
特殊な値の場合
x | scalb(x) |
±∞ | ±∞ |
±0.0 | ±0.0 |
- real cbrt(real x);
- x の立方根を計算します
特殊な値の場合
x | cbrt(x) | invalid? |
±0.0 | ±0.0 | no |
NAN | NAN | yes |
±∞ | ±∞ | no |
- real fabs(real x);
- 絶対値 |x| を返します
特殊な値の場合
x | fabs(x) |
±0.0 | +0.0 |
±∞ | +∞ |
- real hypot(real x, real y);
- 他の二辺の長さが x と y の直角三角形の
斜辺の長さを返します。
斜辺の長さとはつまり、
x と y のそれぞれの自乗の和の平方根です:
sqrt(x² + y²)
hypot(x, y), hypot(y, x),
hypot(x, -y) はどれも同じ値になります
特殊な値の場合
x | y | hypot(x, y) | invalid? |
x | ±0.0 | |x| | no |
±∞ | y | +∞ | no |
±∞ | NAN | +∞ | no |
- real erf(real x);
- x の誤差関数を返します
- real erfc(real x);
- x の余誤差関数 1 - erf(x) を返します
- real lgamma(real x);
- ガンマ関数の自然対数です
引数のガンマ関数の絶対値の、
底 e (2.718...) での対数値を返します
実数に関しては、lgamma は log(fabs(gamma(x))) と同値です
特殊な値の場合
x | lgamma(x) | invalid? |
NAN | NAN | yes |
integer <= 0 | +∞ | yes |
±∞ | +∞ | no |
- real tgamma(real x);
- ガンマ関数 Γ(x)
Γ(x) は、
階乗関数を実数や複素数に一般化したものです。
x! 同様、 Γ(x+1) = x*Γ(x) が成り立ちます
数学的には、z.re > 0 ならば
Γ(z) = ∫0∞ tz-1e-t dt です
特殊な値の場合
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
- real ceil(real x);
- x を (正の無限大方向の) 次の整数に
切り上げた値を返します
- real floor(real x);
- x を (負の無限大方向の) 次の整数に
切り捨てた値を返します
- real nearbyint(real x);
- 現在の丸めモードを用いて、
x を一番近い整数へと丸めます
rint 関数と違って、nearbyint
は FE_INEXACT 例外が発生しません。
- real rint(real x);
- 現在の丸めモードを用いて、
x を一番近い整数へと丸めます。
返値が x と等しくなかった場合、
FE_INEXACT 例外が発生します。
nearbyint
も同じ操作を実行しますが、FE_INEXACT はセットされません。
- long lrint(real x);
- 現在の丸めモードを用いて、
x を一番近い整数へと丸めます。
これは、一般的に浮動小数点数を整数に変換する最も速い方法です。
この関数の返値は、xの小数部がちょうど 0.5 だった場合に
丸めモードに依存することに注意してください。
デフォルトの丸めモード (偶数に丸める) では、
lrint(4.5) == 4, lrint(5.5)==6 です。
- real round(real x);
- x を一番近い整数へと丸めます。
x の小数部がちょうど 0.5 だった場合、
返値は偶数となります。
- long lround(real x);
- x を一番近い整数へと丸めます。
x の小数部がちょうど 0.5 だった場合、
返値は0から遠い方になります。
Note:
Windows版では非対応
- real trunc(real x);
- x の小数部を落とし、整数部分を返します
"chop" 丸めと呼ばれる動作です。
- real remainder(real x, real y);
real remquo(real x, real y, out int n);
- IEC 60559 に従い、剰余 x REM y を計算します
REMは、x - y * n をもっとも x / y に
近くなるように整数nを決めた時の値です。
|n - x / y| == 0.5 の場合は、nは偶数とします。
結果がゼロの場合、符号ビットは x と同じになります。
それ以外の場合は、符号は x / y と同じです。
丸めモードは remainder 関数の動作に影響しません。
remquo は上記のnを引数に返します
特殊な値の場合
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:
Windows版では非対応
- int isnan(real e);
- e が NaN なら非ゼロを返します
- int isfinite(real e);
- e が有限(無限でないか NAN)なら非ゼロを返します
- int isnormal(X)(X x);
- x が正規化数 (ゼロ,非正規化数,無限,NANのいずれでもない数) なら非ゼロを返します
- int issubnormal(float f);
int issubnormal(double d);
int issubnormal(real x);
- 数値が非正規化数かどうかを返します。
非正規化数は、指数部が0で、仮数部のMSBが0の数です。
- int isinf(real x);
- x が ±∞ なら非ゼロを返します。
- bool isIdentical(real x, real y);
- x と y のバイナリ表現が等しいか?
== とほぼ同様ですが、正のゼロと負のゼロが区別され、
同じビットパターンを持つ NAN 同士は等しいとされるという違いがあります。
- int signbit(real x);
- x の符号ビットがセットされていれば 1、いなければ 0 を返します
- real copysign(real to, real from);
- from の符号ビットを to にセットした値を返します
- real nan(char[] tagp);
- tagp[] の情報を埋め込んだ Quiet NAN を作ります
BUGS:
DMD は常に real.nan を返し、情報は無視されます。
real
nextUp(real
x);
double
nextUp(double
x);
float
nextUp(float
x);
- x より大きい x の次の浮動小数点値を計算します。
realとして表現可能な、xより大きい最小の数を返します。
つまり、IEEE数直線で次の数を返します。
Special Values
x | nextUp(x) |
-∞ | -real.max |
±0.0 | real.min*real.epsilon |
real.max | ∞ |
∞ | ∞ |
NAN | NAN |
Remarks:
この関数は次期 IEEE 754R 標準に含まれています。
real
nextDown(real
x);
double
nextDown(double
x);
float
nextDown(float
x);
- x より小さい x の次の浮動小数点値を計算します。
realとして表現可能な、xより小さい最大の数を返します。
つまり、IEEE数直線で直前の数を返します。
Special Values
x | nextDown(x) |
∞ | real.max |
±0.0 | -real.min*real.epsilon |
-real.max | -∞ |
-∞ | -∞ |
NAN | NAN |
Remarks:
この関数は次期 IEEE 754R 標準に含まれています。
- real nextafter(real x, real y);
- y の方向にある、x の次に表現可能な値を返します。
y > x の時、結果はxの次に大きい浮動小数点値です。
y < x の時、結果はxの次に小さい浮動小数点値です。
x == y の時、結果はyです
xが有限で結果が無限になるとき、FE_INEXACT例外とFE_OVERFLOW例外がセットされます
結果が非正規化数で、x と y が等しくないとき、
FE_INEXACT例外と FE_UNDERFLOW例外
がセットされます。
- real fdim(real x, real y);
- x と y の正の距離を返します。
Returns:
特殊な値の場合
x, y | fdim(x, y) |
x > y | x - y |
x <= y | +0.0 |
- real fmax(real x, real y);
- x と y の大きいほうを返します
- real fmin(real x, real y);
- x と y の小さいほうを返します
- real fma(real x, real y, real z);
- (x * y) + z を返します。
丸めは現在の丸めモードに従って一度だけ行われます。
BUGS:
現在は正しく実装されていません - 丸めは2回行われます。
- real pow(real x, uint n);
real pow(real x, int n);
- 整数乗の高速な実装です
- real pow(real x, real y);
- xy を計算します
特殊な値の場合
x | y | pow(x, y) | div 0 | invalid? |
anything | ±0.0 | 1.0 | no | no |
|x| > 1 | +∞ | +∞ | no | no |
|x| < 1 | +∞ | +0.0 | no | no |
|x| > 1 | -∞ | +0.0 | no | no |
|x| < 1 | -∞ | +∞ | no | no |
+∞ | > 0.0 | +∞ | no | no |
+∞ | < 0.0 | +0.0 | no | no |
-∞ | 奇整数 > 0.0 | -∞ | no | no |
-∞ | > 0.0, 奇整数以外 | +∞ | no | no |
-∞ | 奇整数 < 0.0 | -0.0 | no | no |
-∞ | < 0.0, 奇整数以外 | +0.0 | no | no |
±1.0 | ±∞ | NAN | no | yes |
< 0.0 | finite, nonintegral | NAN | no | yes |
±0.0 | 奇整数 < 0.0 | ±∞ | yes | no |
±0.0 | < 0.0, 奇整数以外 | +∞ | yes | no |
±0.0 | 奇整数 > 0.0 | ±0.0 | no | no |
±0.0 | > 0.0, 奇整数以外 | +0.0 | no | no |
- int feqrel(X)(X x, X y);
- どのくらいの精度まで x と y が等しいかを返します
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 |
- real poly(real x, real[] A);
- 多項式 A(x) = a0 + a1x + a2x² + a3x³ ... を計算します
Horner則 A(x) = a0 + x(a1 + x(a2 + x(a3 + ...))) を使用しています
Params:
real[] A |
係数 a0, a1, ... の配列 |
Copyright © 1999-2009 by Digital Mars, All Rights Reserved