英語版
このページの英語版を見る

std.math.hardware

これは std.math.
浮動小数点数のハードウェア・サポートが含まれている。
Authors:
Walter Bright, Don Clugston, Conversion of CEPHES math library to D by Iain Buclaw and David Nadlinger
struct IeeeFlags;
IEEE例外ステータスフラグ(「スティッキービット)
これらのフラグは、例外的な浮動小数点数の状態が発生したことを示す。 NaNまたは無限大が生成されたこと、結果が不正確であること、またはNaNが発生したことを示す。 が不正確であること、NaN が発生したことを示す。浮動小数点 浮動小数点例外が有効になっている(マスクされていない)場合は、これらのフラグを設定する代わ りにハードウェア例外が発生する。 が発生する。
Examples:
import std.math.traits : isNaN;

static void func() {
    int a = 10 * 10;
}
real a = 3.5;
// すべてのフラグをゼロにする
resetIeeeFlags();
assert(!ieeeFlags.divByZero);
// ゼロによる除算を実行する。
a /= 0.0L;
writeln(a); // real.infinity
assert(ieeeFlags.divByZero);
// NaNを作成する
a *= 0.0L;
assert(ieeeFlags.invalid);
assert(isNaN(a));

// func()を呼び出してもステータスフラグに
// 影響がないことを確認する。
IeeeFlags f = ieeeFlags;
func();
writeln(ieeeFlags); // f
const nothrow @nogc @property @safe bool inexact();
結果を正確に表すことができないため、四捨五入が行われた。

例: x = sin(0.1);

const nothrow @nogc @property @safe bool underflow();
アンダーフローによりゼロが発生した

例: ゼロが発生した。 x = real.min*real.epsilon/2;

const nothrow @nogc @property @safe bool overflow();
オーバーフローにより無限大が生成された

"例: x = real.max*2;

const nothrow @nogc @property @safe bool divByZero();
ゼロによる除算で無限大が発生した

"例: x = 3/0.0;

const nothrow @nogc @property @safe bool invalid();
マシンNaNが生成された。

例: x = real.infinity * 0.0;

nothrow @nogc @trusted void resetIeeeFlags();
すべての浮動小数点ステータス・フラグを false に設定する。
Examples:
resetIeeeFlags();
real a = 3.5;
a /= 0.0L;
writeln(a); // real.infinity
assert(ieeeFlags.divByZero);

resetIeeeFlags();
assert(!ieeeFlags.divByZero);
pure nothrow @nogc @property @trusted IeeeFlags ieeeFlags();
Returns:
浮動小数点ステータスフラグの現在の状態のスナップショット
Examples:
import std.math.traits : isNaN;

resetIeeeFlags();
real a = 3.5;

a /= 0.0L;
writeln(a); // real.infinity
assert(ieeeFlags.divByZero);

a *= 0.0L;
assert(isNaN(a));
assert(ieeeFlags.invalid);
struct FloatingPointControl;
浮動小数点ハードウェアを制御する
IEEE754浮動小数点丸めモードと浮動小数点ハードウェア例外を変更する。 ハードウェア例外を変更する。
デフォルトでは、丸めモードは roundToNearest であり、すべてのハードウェア例外は無効になっている。 は無効になっている。ほとんどのアプリケーションでは、ゼロによる除算、オーバーフロー、および無効な演算の例外を有効にすると、デバッグが容易になる。 ゼロによる除算、オーバーフロー、および無効な演算の例外が有効になっていると、ほとんどのアプリケーションでデバッグが容易になる。 これらの3つは、便宜上severeExceptions値にまとめられている。 特に、invalidExceptionが有効になっていると、未初期化のたびにハードウェア・トラップが生成されることに注意されたい。 が生成されることに注意すること。
すべての変更は一時的なものである。スコープが終了すると、以前の状態に戻る。 スコープの終わりで元に戻る。

"例

{
    FloatingPointControl fpctrl;

    // ゼロによる除算、無限大へのオーバーフロー、
    // 無効な演算、および初期化されていない浮動小数点変数に対するハードウェア例外を有効にする。
    fpctrl.enableExceptions(FloatingPointControl.severeExceptions);

    // xがデフォルトで初期化された浮動小数点変数の場合、
    // ハードウェア例外が発生する:
    real x; // 例外をスローしないためには、`= 0`または`= real.nan`を追加する。
    real y = x * 3.0;

    // 例外はデフォルトで初期化されていないNaNに対してのみスローされる。
    // 他のペイロードを持つNaNは有効である:
    real z = y * real.nan; // ok

    // このスコープを離れると、
    // 設定されたハードウェア例外と丸めモードは無効になる。
}

Examples:
import std.math.rounding : lrint;

FloatingPointControl fpctrl;

fpctrl.rounding = FloatingPointControl.roundDown;
writeln(lrint(1.5)); // 1.0

fpctrl.rounding = FloatingPointControl.roundUp;
writeln(lrint(1.4)); // 2.0

fpctrl.rounding = FloatingPointControl.roundToNearest;
writeln(lrint(1.5)); // 2.0
alias RoundingMode = uint;
roundToNearest

roundDown

roundUp

roundToZero

roundingMask
IEEEの丸めモード。 デフォルトは roundToNearest である。
roundingMask = すべての丸めモードのマスク。
nothrow @nogc @property @trusted void rounding(RoundingMode newMode);
浮動小数点ハードウェア丸めモードを変更する
関数の途中で丸めモードを変更すると、浮動小数点式の最適化を妨げることがある。 オプティマイザは丸めモードが変更されないと仮定するからだ。 オプティマイザは丸めモードが変更されないと仮定するからである。 丸めモードを変更するのは、関数の最初だけにしておくのがよい。 丸めモードは関数の最初だけ変更し、関数が戻るまでそのままにしておくのがよい。 また、次の行を追加するのがベストである:
pragma(inline, false);
という行を関数の先頭行に追加し、インライン化されないようにする。
Parameters:
RoundingMode newMode 新しい丸めモード
static pure nothrow @nogc @property @trusted RoundingMode rounding();
Returns:
現在有効な丸めモード
alias ExceptionMask = uint;
subnormalException

inexactException

underflowException

overflowException

divByZeroException

invalidException

severeExceptions

allExceptions
IEEEのハードウェア例外。 デフォルトでは、すべての例外はマスクされている(@disable)。
severeExceptions = オーバーフロー、ゼロによる除算、および無効な 例外である。
static pure nothrow @nogc @property @safe bool hasExceptionTraps();
Returns:
現在の FPU が例外のトラッピングをサポートしている場合は true を指定する。
nothrow @nogc @trusted void enableExceptions(ExceptionMask exceptions);
特定のハードウェア例外を有効にする(マスクを解除する)。複数の例外を OR することができる。
nothrow @nogc @trusted void disableExceptions(ExceptionMask exceptions);
特定のハードウェア例外を無効にする(マスクする)。複数の例外が OR される可能性がある。
static pure nothrow @nogc @property @trusted ExceptionMask enabledExceptions();
Returns:
現在有効になっている(マスクされていない)例外。