浮動小数点
浮動小数点中間値
浮動小数点演算と式の中間値、 式の型よりも大きな精度を使用することができる。 の型よりも大きな精度を使用することができる。 最小精度のみがオペランドの型によって設定される。 オペランドの型によって設定される。 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 の関数を使用してセット/リセットすることができる。
浮動小数点変換
実装は 実装は、浮動小数点演算の強度を下げるために、浮動小数点演算に対して変換を行うことができる。
すべての変換が有効とは限らない:以下の 浮動小数点式の変換 以下の浮動小数点式の変換は許されない。 以下の浮動小数点式の変換は許されない。
transformation | comments |
---|---|
x+ 0 →x | xが-0の場合は無効 |
x- 0 →x | x が±0 で四捨五入が -∞ の場合は無効。 |
-x↔ 0 -x | xが+0の場合は無効 |
x-x→ 0 | xがNaNまたは±∞の場合は無効である。 |
x-y↔ -(y-x) | (1-1=+0)であるのに対し、-(1-1)=-0であるため無効である。 |
x* 0 → 0 | xがNaNまたは±∞の場合は無効である。 |
x/c↔x* (1/c) | (1/c)が正確な結果をもたらす場合は有効である。 |
x!=x→ 偽 | xがNaNの場合は無効 |
x==x→ 真 | xがNaNの場合は無効 |
x!op y↔ !(x op y) | xまたはyがNaNの場合は無効 |
もちろん、副作用を変更するような変換も無効である。 も無効である。
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku