D 1.0   D 2.0
About Japanese Translation

Last update Sun Dec 19 23:27:26 2010

std.math

Jump to: E FloatingPointControl IeeeFlags LN10 LN2 LOG10E LOG2 LOG2E LOG2T M_1_PI M_2_PI M_2_SQRTPI NaN PI PI_2 PI_4 SQRT1_2 SQRT2 abs acos acosh approxEqual asin asinh atan atan2 atanh cbrt ceil conj copysign cos cosh disableExceptions divByZero enableExceptions enabledExceptions erf erfc exp exp2 expi expm1 fabs fdim feqrel floor fma fmax fmin frexp getNaNPayload hypot ieeeFlags ilogb inexact invalid isFinite isIdentical isInfinity isNaN isNormal isSubnormal ldexp lgamma log log10 log1p log2 logb lrint lround math modf nearbyint nextDown nextUp nextafter overflow poly pow remainder remquo resetIeeeFlags rint rndtol rndtonl round rounding scalbn severeExceptions sgn signbit sin sinh sqrt tan tanh tgamma trunc underflow

初等的な数学関数です。

初等的な数学関数 (冪乗、平方根、三角関数など) と、低水準の浮動小数点演算を提供するモジュールです。 数学的特殊関数は 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

real E;
e

real LOG2T;
log210

real LOG2E;
log2e

real LOG2;
log102

real LOG10E;
log10e

real LN2;
ln 2

real LN10;
ln 10

real PI;
π

real PI_2;
π / 2

real PI_4;
π / 4

real M_1_PI;
1 / π

real M_2_PI;
2 / π

real M_2_SQRTPI;
2 / √π

real SQRT2;
√2

real SQRT1_2;
√½

Num abs(Num)(Num x);
real abs(Num)(Num y);
絶対値の計算

複素数に関しては abs(z) = sqrt( z.re2 + z.im2 ) = hypot(z.re, z.im) です。

pure nothrow @safe creal conj(creal z);
pure nothrow @safe ireal conj(ireal y);
共役複素数

conj(x + iy) = x - iy

z * conj(z) = z.re2 - z.im2 は常に実数になります。

pure nothrow @safe real cos(real x);
x の余弦を計算します。x はラジアンで指定します。

Special Values
x cos(x) invalid?
NAN NAN yes
±∞ NAN yes


BUGS:
|x| >= 264 では結果は未定義です。

pure nothrow @safe real sin(real x);
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

pure nothrow @trusted real tan(real x);
x の正接を計算します。x はラジアンで指定します。

Special Values
x tan(x) invalid?
NAN NAN yes
±0.0 ±0.0 no
±∞ NAN yes


pure nothrow @safe real acos(real x);
pure nothrow @safe double acos(double x);
pure nothrow @safe float acos(float x);
x の逆余弦を計算します。 返値は 0 から π の間となります。

Special Values
x acos(x) invalid?
>1.0 NAN yes
<-1.0 NAN yes
NAN NAN yes


pure nothrow @safe real asin(real x);
pure nothrow @safe double asin(double x);
pure nothrow @safe float asin(float x);
x の逆正弦を計算します。 返値は -π/2 から π/2 の間となります。

Special Values
x asin(x) invalid?
±0.0 ±0.0 no
>1.0 NAN yes
<-1.0 NAN yes


pure nothrow @safe real atan(real x);
pure nothrow @safe double atan(double x);
pure nothrow @safe float atan(float x);
x の逆正接を計算します。 返値は -π/2 から π/2 の間となります。

Special Values
x atan(x) invalid?
±0.0 ±0.0 no
±∞ NAN yes


pure nothrow @trusted real atan2(real y, real x);
pure nothrow @safe double atan2(double y, double x);
pure nothrow @safe float atan2(float y, float x);
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


pure nothrow @safe real cosh(real x);
pure nothrow @safe double cosh(double x);
pure nothrow @safe float cosh(float x);
x の双曲余弦を返します

Special Values
x cosh(x) invalid?
±∞ ±0.0 no


pure nothrow @safe real sinh(real x);
pure nothrow @safe double sinh(double x);
pure nothrow @safe float sinh(float x);
x の双曲正弦を返します

Special Values
x sinh(x) invalid?
±0.0 ±0.0 no
±∞ ±∞ no


pure nothrow @safe real tanh(real x);
pure nothrow @safe double tanh(double x);
pure nothrow @safe float tanh(float x);
x の双曲正接を返します

Special Values
x tanh(x) invalid?
±0.0 ±0.0 no
±∞ ±1.0 no


pure nothrow @safe real acosh(real x);
pure nothrow @safe double acosh(double x);
pure nothrow @safe float acosh(float x);
x の逆双曲余弦を返します。

数学的には、acosh(x) = log(x + sqrt( x*x - 1)) です

Special Values
x acosh(x)
NAN NAN
<1 NAN
1 0
+∞ +∞


pure nothrow @safe real asinh(real x);
pure nothrow @safe double asinh(double x);
pure nothrow @safe float asinh(float x);
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
±∞ ±∞


pure nothrow @safe real atanh(real x);
pure nothrow @safe double atanh(double x);
pure nothrow @safe float atanh(float x);
x の逆双曲正接を返します。 返値は -1 から 1 の間となります。

数学的には、atanh(x) = log( (1+x)/(1-x) ) / 2 です



Special Values
x acosh(x)
NAN NAN
±0 ±0
-∞ -0


pure nothrow @safe 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 の平方根を計算します

Special Values
x sqrt(x) invalid?
-0.0 -0.0 no
<0.0 NAN yes
+∞ +∞ no


pure nothrow @safe float exp(float x);
pure nothrow @safe double exp(double x);
pure nothrow @safe real exp(real x);
ex を計算します。

Special Values
x exp(x)
+∞ +∞
-∞ +0.0


float exp2(float x);
double exp2(double x);
real exp2(real x);
2x を計算します。

Special Values
x exp2(x)
+∞ +∞
-∞ +0.0


pure nothrow @trusted real expm1(real x);
自然対数の底 (e) の x 乗、引く 1 を計算します。

非常に小さな x に対しては、expm1(x) は exp(x)-1 よりも正確です。

Special Values
x ex-1
±0.0 ±0.0
+∞ +∞
-∞ -1.0


pure nothrow @trusted real exp2(real x);
2x を計算します。.

Special Values
x exp2(x)
+∞ +∞
-∞ +0.0
NAN NAN

pure nothrow @trusted creal expi(real y);
cos(y) + i sin(y) を計算します。

多くのCPU (x86など) では、これは非常に効率的で、 別々に sin(y) と cos(y) を計算する場合のほぼ2倍の速度となります。 両方の値が必要な場合はこの関数を使うのが望ましいと言えるでしょう。

pure nothrow @trusted real frexp(real value, out int exp);
浮動小数点数値 value を符号・仮数部と、指数部に分解します

Returns:
value =x*2exp かつ .5 <= |x| < 1.0
となる返値 xexp を計算します。
xvalue の符号は一致します。

Special Values
value returns exp
±0.0 ±0.0 0
+∞ +∞ int.max
-∞ -∞ int.min
±NAN ±NAN int.min


nothrow @trusted int ilogb(real x);
x の指数を符号付整数値として取り出します

x が特殊値の場合を除き、結果は cast(int)logb(x) と一致します

Special Values
x ilogb(x) Range error?
0 FP_ILOGB0 yes
±∞ int.max no
NAN FP_ILOGBNAN no


pure nothrow @safe real ldexp(real n, int exp);
n * 2exp を計算します

References:
frexp

pure nothrow @safe real log(real x);
x の自然対数を計算します

Special Values
x log(x) divide by 0? invalid?
±0.0 -∞ yes no
<0.0 NAN no yes
+∞ +∞ no no


pure nothrow @safe real log10(real x);
x の底10の対数を計算します

Special Values
x log10(x) divide by 0? invalid?
±0.0 -∞ yes no
<0.0 NAN no yes
+∞ +∞ no no


pure nothrow @safe real log1p(real x);
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


pure nothrow @safe real log2(real x);
x の底2の対数 log2x を計算します

Special Values
x log2(x) divide by 0? invalid?
±0.0 -∞ yes no
<0.0 NAN no yes
+∞ +∞ no no


nothrow @trusted real logb(real x);
x の指数を符号付整数として取り出します

x が非正規化数の場合、正規化数であるかのように扱われます。 正で有限の x について:

1 <= x * FLT_RADIX-logb(x) < FLT_RADIX

Special Values
x logb(x) divide by 0?
±∞ +∞ no
±0.0 -∞ yes


nothrow @trusted real modf(real x, ref real y);
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


nothrow @trusted real scalbn(real x, int n);
効率的に x * 2n を計算します

scalbn は、アンダーフローとオーバーフローを 通常の算術演算と同じように扱います

Special Values
x scalb(x)
±∞ ±∞
±0.0 ±0.0


nothrow @trusted real cbrt(real x);
x の立方根を計算します

Special Values
x cbrt(x) invalid?
±0.0 ±0.0 no
NAN NAN yes
±∞ ±∞ no


pure nothrow @safe real fabs(real x);
絶対値 |x| を返します

Special Values
x fabs(x)
±0.0 +0.0
±∞ +∞


pure nothrow @safe real hypot(real x, real y);
他の二辺の長さが xy の直角三角形の斜辺の長さを返します。 斜辺の長さとはつまり、 xy のそれぞれの二乗の和の平方根です:

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


nothrow @trusted real erf(real x);
x の誤差関数を返します

error function

nothrow @trusted real erfc(real x);
x の余誤差関数 1 - erf(x) を返します

complementary error function

nothrow @trusted real lgamma(real x);
ガンマ関数の自然対数です

引数のガンマ関数の絶対値の、 底 e (2.718...) での対数値を返します

実数に関しては、lgamma は log(fabs(gamma(x))) と同値です。

Special Values
x lgamma(x) invalid?
NAN NAN yes
integer <= 0 +∞ yes
±∞ +∞ no


nothrow @trusted real tgamma(real x);
ガンマ関数 Γ(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

nothrow @trusted real ceil(real x);
x を (正の無限大方向の) 次の整数に 切り上げた値を返します

nothrow @trusted real floor(real x);
x を (負の無限大方向の) 次の整数に 切り捨てた値を返します

nothrow @trusted real nearbyint(real x);
現在の丸めモードを用いて、 x を一番近い整数へと丸めます

rint 関数と違って、nearbyint では FE_INEXACT 例外が発生しません。

pure nothrow @trusted real rint(real x);
現在の丸めモードを用いて、 x を一番近い整数へと丸めます。 返値が x と等しくなかった場合、 FE_INEXACT 例外がセットされます。 nearbyint も同じ操作を実行しますが、FE_INEXACT はセットされません。

pure nothrow @trusted long lrint(real x);
現在の丸めモードを用いて、 x を一番近い整数へと丸めます。

これは、一般的に浮動小数点数を整数に変換する最も速い方法です。 この関数の返値は、xの小数部がちょうど 0.5 だった場合に 丸めモードに依存することに注意してください。 デフォルトの丸めモード (偶数に丸める) では、 lrint(4.5) == 4, lrint(5.5)==6 です。

nothrow @trusted real round(real x);
x を一番近い整数へと丸めます。 x の小数部がちょうど 0.5 だった場合、 返値は偶数となります。

nothrow @trusted long lround(real x);
x を一番近い整数へと丸めます。

x の小数部がちょうど 0.5 だった場合、 返値は0から遠い方になります。

nothrow @trusted real trunc(real x);
x の小数部を落とし、整数部分を返します

"chop" 丸めと呼ばれる動作です。

nothrow @trusted real remainder(real x, real y);
nothrow @trusted 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 の符号に一致します。 剰余関数は精度モードには影響されません。

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版では非対応

struct IeeeFlags;
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);

bool inexact();
結果が正確に表現できず、丸めが発生したことを示します。 (例: x = sin(0.1); } )

bool underflow();
アンダーフローにより 0 ができたことを示します。(例: x = real.min*real.epsilon/2;)

bool overflow();
オーバーフローにより無限大ができたことを示します。(例: x = real.max*2;)

bool divByZero();
ゼロ除算により無限大ができたことを示します。(例: x = 3/0.0; )

bool invalid();
NaN ができたことを示します。(例: x = real.infinity * 0.0; )

void resetIeeeFlags();
全ての浮動小数点例外フラグを false にします。

IeeeFlags ieeeFlags();
現在の状態フラグのスナップショットを返します。

struct FloatingPointControl;
浮動小数点演算ハードウェアを制御します。

IEEE754 の丸めモードや、 ハードウェア例外の設定を変更します。

デフォルトでは、丸めモードは roundToNearest で、 ハードウェア例外は全て無効です。多くのアプリケーションでは、division by zero, overflow, invalid operation 例外を有効にするとデバッグが楽になるでしょう。 この3つは、利便性のために、まとめて severeExceptions で設定できます。 特に注意として、invalidException が有効だと、 未初期化の浮動小数点変数が使用されると常にハードウェア例外が発生するようになります。

すべての変更は一時的な物です。 スコープを抜ける時点で、元の状態に戻されます。

Example:
  {
    // ハードウェア例外を division by zero, overflow to infinity,
    // invalid operations に対して有効に

    FloatingPointControl fpctrl;
    fpctrl.enableExceptions(FloatingPointControl.severeExceptions);

    double y = x*3.0; // x が未初期化ならばハードウェア例外
    //
    fpctrl.rounding = FloatingPointControl.roundUp;

    // このスコープを抜けるところで再度ハードウェア例外は無効化されます。
    // 元々の丸めモードも復元されます。
  }

severeExceptions
Severe = overflow, division by zero, and invalid exceptions.

void enableExceptions(uint exceptions);
特定のハードウェア例外を有効 (unmasked) にします。複数の例外を OR で同時指定も可能です。

void disableExceptions(uint exceptions);
特定のハードウェア例外を無効 (masked) にします。複数の例外を OR で同時指定も可能です。

void rounding(RoundingMode newMode);
浮動小数点演算の丸めモードを変更します。

static uint enabledExceptions();
現在有効 (unmasked) な例外の種類を返します。

static RoundingMode rounding();
現在アクティブな丸めモードを返します。

pure nothrow @trusted bool isNaN(real x);
e が NaN なら非ゼロを返します

pure nothrow @trusted int isFinite(real e);
e が有限(無限大やNANでない)なら非ゼロを返します

int isNormal(X)(X x);
x が正規化数(0, 非正規化数, 無限大, NAN 以外)なら非ゼロを返します

pure nothrow @trusted int isSubnormal(float f);
pure nothrow @trusted int isSubnormal(double d);
pure nothrow @trusted int isSubnormal(real x);
数値が非正規化数かどうかを返します。 非正規化数は、指数部が0で、仮数部のMSBが0の数です。

pure nothrow @trusted bool isInfinity(real x);
e が ±∞ なら非ゼロを返します。

pure nothrow @trusted bool isIdentical(real x, real y);
xy のバイナリ表現が等しいか?

== とほぼ同様ですが、正のゼロと負のゼロが区別され、 同じビットパターンを持つ NAN 同士は等しいとされるという違いがあります。

int signbit(real x);
e の符号ビットがセットされていれば 1、いなければ 0 を返します

pure nothrow @trusted real copysign(real to, real from);
to と符号ビットに from の符号ビットをセットした値を返します

F sgn(F)(F x);
x < 0 なら -1x == 0 なら xx > 0 なら 1, x==NAN なら NAN を返します。

pure nothrow @trusted real NaN(ulong payload);
payload の情報を埋め込んだ Quiet NAN を作ります

float に対しては、埋め込み可能な最大の payload は 0x3F_FFFF です。 doubles では 0x3_FFFF_FFFF_FFFF、 80-bit や 128-bit の real では、0x3FFF_FFFF_FFFF_FFFF が最大です。

pure nothrow @trusted ulong getNaNPayload(real x);
NAN から整数値のエラー情報を取り出します。

Returns:
ulong で payload を返す

float に対しては、埋め込み可能な最大の payload は 0x3F_FFFF です。 doubles では 0x3_FFFF_FFFF_FFFF、 80-bit や 128-bit の real では、0x3FFF_FFFF_FFFF_FFFF が最大です。

pure nothrow @trusted real nextUp(real x);
pure nothrow @trusted double nextUp(double x);
pure nothrow @trusted float nextUp(float x);
x より大きい x の次の浮動小数点値を計算します。

realとして表現可能な、xより大きい最小の数を返します。 つまり、IEEE数直線で次の数を返します。

Special Values
x nextUp(x)
-∞ -real.max
±0.0 real.min_normal*real.epsilon
real.max
NAN NAN


pure nothrow @safe real nextDown(real x);
pure nothrow @safe double nextDown(double x);
pure nothrow @safe float nextDown(float x);
x より小さい x の次の浮動小数点値を計算します。

realとして表現可能な、xより小さい最大の数を返します。 つまり、IEEE数直線で直前の数を返します。

Special Values
x nextDown(x)
real.max
±0.0 -real.min_normal*real.epsilon
-real.max -∞
-∞ -∞
NAN NAN


T nextafter(T)(T x, T y);
y の方向にある、x の次に表現可能な値を返します。

y > x の時、結果は x より大きいxの次の浮動小数点値です。 y < x の時、結果は x より小さいxの次の浮動小数点値です。 x == y の時、結果は y です。

Remarks:
この関数は一般に使い勝手が良いとは言えません。 ほとんどの場合、より高速な nextUp() や nextDown() を使う方が良いでしょう。

x が有限で結果が無限になるとき、FE_INEXACT と FE_OVERFLOW 例外がセットされます。 結果が非正規化数で、xy が等しくないとき、 FE_INEXACT例外と FE_UNDERFLOW例外 がセットされます。

pure nothrow @safe real fdim(real x, real y);
xy の正の距離を返します。

Returns:
Special Values
x, y fdim(x, y)
x > y x - y
x <= y +0.0


pure nothrow @safe real fmax(real x, real y);
xy の大きいほうを返します

pure nothrow @safe real fmin(real x, real y);
xy の小さいほうを返します

pure nothrow @safe real fma(real x, real y, real z);
(x * y) + z を返します。 丸めは現在の丸めモードに従って一度だけ行われます。

BUGS:
現在は正しく実装されていません - 丸めは2回行われます。

Unqual!(F) pow(F, G)(F x, G n);
整数 n について、x n を計算します。

typeof(Unqual!(F).init * Unqual!(G).init) pow(F, G)(F x, G n);
x を正整数 n 乗した値を計算します。

x と n の両方が 0 だった場合、結果は 1 となります。 n が負の数であったときは、x の値に関わらず、 実行時に整数除算エラーが発生します。

real pow(I, F)(I x, F y);
整数の浮動小数点数乗を計算します。

Unqual!(Largest!(F,G)) pow(F, G)(F x, G y);
xy を計算します

Special Values
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
|x| < 1 -∞ +∞ no no
+∞ < 0.0 +0.0 no no
-∞ odd integer > 0.0 -∞ no no
-∞ > 0.0, not odd integer +∞ no no
-∞ odd integer < 0.0 -0.0 no no
-∞ < 0.0, not odd integer +0.0 no no
±1.0 ±∞ NAN no yes
< 0.0 finite, nonintegral NAN no yes
±0.0 odd integer < 0.0 ±∞ yes no
±0.0 < 0.0, not odd integer +∞ yes no
±0.0 odd integer > 0.0 ±0.0 no no
±0.0 > 0.0, not odd integer +0.0 no no


int feqrel(X)(X x, X y);
どのくらいの精度まで x と y が等しいかを返します

Returns:
x と y が等しい仮数部のビット数を返します。 例えば、0x1.F8p+60 と 0x1.F1p+60 は5bit等しいことになります。

Special Values
x y feqrel(x, y)
x x real.mant_dig
x >= 2*x 0
x <= x/2 0
NAN any 0
any NAN 0


pure nothrow @trusted real poly(real x, const real[] A);
多項式 A(x) = a0 + a1x + a2x2 + a3x3; ... を計算します。

Horner則 A(x) = a0 + x(a1 + x(a2 + x(a3 + ...))) を使用しています

Params:
real[] A 係数 a0, a1, ... の配列

bool approxEqual(T, U, V)(T lhs, U rhs, V maxRelDiff, V maxAbsDiff = 1e-05);
許容する最大の相対誤差maxRelDiffと 絶対誤差maxAbsDiffを指定して、 二つの値が近似的に等しいかどうかを計算します。

bool approxEqual(T, U)(T lhs, U rhs);
approxEqual(lhs, rhs, 1e-2, 1e-5) を返します。

2つの引数がレンジだった場合は、approxEqual は、 レンジの要素数が等しく、しかも全ての対応する要素間で approxEqualtrue になる場合に、true を返します。