浮動小数点数の丸めルーチン
浮動小数点ルーチンの使用 への移動
Delphi ランタイム ライブラリ(RTL)に含まれている丸めルーチンの多くは、32 ビットの場合は FPU(浮動小数点演算ユニット)レジスタに、64 ビットの場合は SSE レジスタに現在設定されている丸めモードを使用します。RTL ルーチンの中には、独自の丸めモードまたは丸めアルゴリズムを持っているものがあります。このトピックの表では、さまざまな丸めルーチンの詳細を示します。
丸めルーチン
以下の表では、RTL に用意されている丸め関数についてまとめます。
名前 | 引数の型 | 戻り値の型 | 桁パラメータの有無 | 桁パラメータの範囲 | 丸めモード | 備考 |
---|---|---|---|---|---|---|
System.Round |
Extended |
Int64 |
RoundMode の現在の設定 |
|||
System.Trunc |
Extended |
Int64 |
常に rmTruncate(ゼロ方向に切り捨て) |
Int と同じ。戻り値は整数型。 | ||
System.Int |
|
|
常に rmTruncate(ゼロ方向に切り捨て) | Trunc と同じ。戻り値は浮動小数点型。 | ||
Extended |
Extended | あり | -20 .. +20
デフォルト値なし |
常に rmNearest(銀行型丸め) | ||
Single |
Single |
あり |
-37 .. +37 デフォルト値は -2 |
常に "Round half away from zero"(絶対値で四捨五入) | SimpleRoundTo は、従来学校で習ってきた丸め手法です。 | |
Single |
Integer |
常に rmUp(次の最小の整数) | ||||
System.Math.Floor | Single Double Extended |
Integer | 常に rmDown(前の最大の整数) | |||
Data.FmtBcd.BCDRoundTo | TBcd | TBcd | あり | Integer | 現在の RoundMode | |
FMTBcd.BCDRoundAt |
String | String | あり | SmallInt | 常に "Round half away from zero"(絶対値で四捨五入) | 非推奨の関数です。 代わりに BcdRoundTo を使用します。 |
正数の場合の例
以下の表は、正の数を丸めた場合の例を示します。
名前 | 丸めモード | 0.4 | 0.5 | 0.6 | 1.4 | 1.5 | 1.6 |
---|---|---|---|---|---|---|---|
rmNearest | 0 | 0 | 1 | 1 | 2 | 2 | |
rmDown | 0 | 0 | 0 | 1 | 1 | 1 | |
rmUp | 1 | 1 | 1 | 2 | 2 | 2 | |
rmTruncate | 0 | 0 | 0 | 1 | 1 | 1 | |
0 | 0 | 0 | 1 | 1 | 1 | ||
0.0 | 0.0 | 0.0 | 1.0 | 1.0 | 1.0 | ||
0.0 | 0.0 | 1.0 | 1.0 | 2.0 | 2.0 | ||
0.0 | 1.0 | 1.0 | 1.0 | 2.0 | 2.0 | ||
1 | 1 | 1 | 2 | 2 | 2 | ||
0 | 0 | 0 | 1 | 1 | 1 | ||
rmNearest |
0 | 0 | 1 | 1 | 2 | 2 | |
rmDown |
0 | 0 | 0 | 1 | 1 | 1 | |
rmUp |
1 | 1 | 1 | 2 | 2 | 2 | |
rmTruncate |
0 | 0 | 0 | 1 | 1 | 1 | |
FmtBcd.RoundAt(x,0) |
'0' | '1' | '1' | '1' | '2' | '2' |
負数の場合の例
以下の表は、負の数を丸めた場合の例を示します。
名前 | 丸めモード | -0.4 | -0.5 | -0.6 | -1.4 | -1.5 | -1.6 |
---|---|---|---|---|---|---|---|
rmNearest | 0 | 0 | -1 | -1 | -2 | -2 | |
rmDown | -1 | -1 | -1 | -2 | -2 | -2 | |
rmUp | 0 | 0 | 0 | -1 | -1 | -1 | |
rmTruncate | 0 | 0 | 0 | -1 | -1 | -1 | |
System.Trunc(x) | 0 | 0 | 0 | -1 | -1 | -1 | |
System.Int(X) | 0.0 | 0.0 | 0.0 | -1.0 | -1.0 | -1.0 | |
Math.RoundTo(x,0) | 0.0 | 0.0 | -1.0 | -1.0 | -2.0 | -2.0 | |
Math.SimpleRoundTo(x,0) | 0.0 | -1.0 | -1.0 | -1.0 | -2.0 | -2.0 | |
Math.Ceil(x) | 0 | 0 | 0 | -1 | -1 | -1 | |
Math.Floor(x) | -1 | -1 | -1 | -2 | -2 | -2 | |
rmNearest | 0 | 0 | -1 | -1 | -2 | -2 | |
rmDown | -1 | -1 | -1 | -2 | -2 | -2 | |
rmUp | 0 | 0 | 0 | -1 | -1 | -1 | |
rmTruncate | 0 | 0 | 0 | -1 | -1 | -1 | |
FmtBcd.RoundAt(x,0) (非推奨) |
'-0' | '-1' | '-1' | '-1' | '-2' | '-2' |
RoundTo と SimpleRoundTo で桁パラメータを指定した場合の例
桁(D)は、引数に渡した値を丸める位(10 の累乗)を示します。桁の取り得る値の範囲は –20 から 20 までです。以下の例では、D = 0、-1、... -5 を使用しています。
名前 | 0 | -1 | -2 | -3 | -4 | -5 |
---|---|---|---|---|---|---|
Math.RoundTo(2.15625, D) | 2.0 | 2.2 | 2.16 | 2.156 | 2.1562 | 2.15625 |
Math.SimpleRoundTo(2.15625, D) | 2.0 | 2.2 | 2.16 | 2.156 | 2.1563 | 2.15625 |
関連項目
- 浮動小数点数制御ルーチン
- System.Math.SetFPURoundMode
- System.Math.SetSSERoundMode
- System.Math.SetRoundMode
- System.Round