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

浮動小数点

浮動小数点中間値

浮動小数点演算と式の中間値、 式の型よりも大きな精度を使用することができる。 の型よりも大きな精度を使用することができる。 最小精度のみがオペランドの型によって設定される。 オペランドの型によって設定される。 Implementation Note: インテル x86マシンなどでは では、中間演算が80ビットの精度で行われることが期待されている(必須ではない)。 計算がハードウェアによって実装された80ビットの精度で行われることが期待される(必須ではない)。 ハードウェアによって実装される。

浮動小数点式の実行は、ソースが指示するよりも大きな精度の結果をもたらすかもしれない。 よりも高い精度の結果が得られるかもしれない。

浮動小数点定数の折りたたみ

オペランドの型に関係なく、浮動小数点定数の折りたたみは 以上の精度で行われる。 定数の折りたたみは、real 以上の精度で行われる。 これは常にIEEE-754の規則に従って行われ、四捨五入が使用される。 が使用される。

浮動小数点定数は、実装では内部的に少なくとも の精度で表現される。 実装では、定数の型に関係なく、少なくともreal の精度で表現される。 で表現される。余分な精度は 定数の折りたたみに利用できる。結果の精度へのコミットは 結果の精度へのコミットは、コンパイルプロセスのできるだけ遅い段階で行われる。例:" は0を表示する:

const float f = 0.2f;
writeln(f - 0.2);

constでない静的変数の値は、コンパイル時に伝播させることはできない。 コンパイル時に伝播することはできない:

static float f = 0.2f;
writeln(f - 0.2);

は2.98023e-09と表示される。16進数浮動小数点定数もまた 16進浮動小数点定数も、丸めの影響を受けない特定の浮動小数点ビット・パターンが必要な場合に使用できる。 が必要な場合にも使用できる。0.2fの16進数値を求めるには、次のようにする:

import std.stdio;

void main()
{
    writefln("%a", 0.2f);
}

これは0x1.99999ap-3である。16進定数を使う:

const float f = 0x1.99999ap-3f;
writeln(f - 0.2);

は2.98023e-09と表示される。

コンパイラの設定、最適化の設定、インライン化の設定が異なると、丸めの機会が変わる、 およびインライン化の設定は、定数折りたたみの機会に影響を与える可能性がある。 したがって、浮動小数点計算の結果は、それらの設定によって異なる場合がある。 そのため、浮動小数点演算の結果はこれらの設定によって異なる場合がある。

丸め制御

IEEE 754浮動小数点演算には、4種類の丸めモードを設定する機能がある。 異なる丸めモードを設定する機能がある。 これらはcore.stdc.fenv の関数からアクセスできる。

浮動小数点丸めモードが関数内で変更された場合、関数が終了する前に元に戻さなければならない、 関数内で浮動小数点丸めモードを変更した場合、関数が終了する前に丸めモードを元に戻さなければならない。このルールに違反した場合 (例:インラインasmの使用)このルールに違反した場合、その後の計算に使用される丸めモードは未定義となる。 は未定義となる。

例外フラグ

IEEE 754浮動小数点演算では、次のようなフラグを設定することができる。 フラグを設定することができる。 フラグを設定できる:

FE_INVALID
FE_DENORMAL
FE_DIVBYZERO
FE_OVERFLOW
FE_UNDERFLOW
FE_INEXACT

これらのフラグは、core.stdc.fenv の関数を使用してセット/リセットすることができる。

浮動小数点変換

実装は 実装は、浮動小数点演算の強度を下げるために、浮動小数点演算に対して変換を行うことができる。

すべての変換が有効とは限らない:以下の 浮動小数点式の変換 以下の浮動小数点式の変換は許されない。 以下の浮動小数点式の変換は許されない。

許されない浮動小数点変換
transformationcomments
x+ 0 →xxが-0の場合は無効
x- 0 →xx が±0 で四捨五入が -∞ の場合は無効。
-x↔ 0 -xxが+0の場合は無効
x-x→ 0 xがNaNまたは±∞の場合は無効である。
x-y↔ -(y-x) (1-1=+0)であるのに対し、-(1-1)=-0であるため無効である。
x* 0 → 0 xがNaNまたは±∞の場合は無効である。
x/cx* (1/c) (1/c)が正確な結果をもたらす場合は有効である。
x!=x→ 偽 xがNaNの場合は無効
x==x→ 真 xがNaNの場合は無効
x!op y↔ !(x op y) xまたはyがNaNの場合は無効

もちろん、副作用を変更するような変換も無効である。 も無効である。