Format関数の数値丸めについて


たろう  2021-01-07 17:08:46  No: 149529

例えば 以下を実行すると、'12.26' が返ってきます。
Format('%5.2f', [12.259]);

これは四捨五入しているからだと思われますが、この丸め方法について、
どこに記載されているか、ご存知の方はいらっしゃいませんか?

少なくともFormat関数の説明には記載がありません。
System.SysUtils.Format
http://docwiki.embarcadero.com/Libraries/XE7/ja/System.SysUtils.Format

こちらにも、Delphi6時代の記録とはいえ、"四捨五入"との記述はあるんですが、根拠が・・・。
Formatの形式文字列
http://drang.s4.xrea.com/program/tips/memo/format.html

また、Mr.XRAYさんのページでは、SysUtils.FloatToStr は、四捨五入の記載がありますが、
こちらも、リンク先のdocwikiには、そんな記述が見当たらない。
http://mrxray.on.coocan.jp/Delphi/plSamples/890_CalcError.htm

Delphi 6, Delphi 2007 でソースを確認しましたが、最終的にアセンブラになっていて、
どう処理しているかわかりませんでした。

頭の中では、四捨五入(五捨五入?)だと覚えているのですが、
さて、どこでそれを覚えたのやらと、気になったものの、根拠がなくて質問してみました。


Mr.XRAY  2021-01-07 19:20:02  No: 149530

いわゆる数値における「丸め」の問題ですね.

[ 浮動小数点数の丸めルーチン ]
http://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0%E3%81%AE%E4%B8%B8%E3%82%81%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3

> Delphi 6, Delphi 2007 でソースを確認しましたが、最終的にアセンブラになってい

上のオンラインヘルプに書いてある通り,FPU が処理しています
デフォルトで四捨五入になっています.
変更は可能です (常に切り捨てにするとか).
ただし,Delphi の丸めに関係する関数類 (四捨五入とか) の挙動が変わります.
方法は,Delphi のバージョンによって,EXE のビット数によって違います.
以下の SSE と FPU 関係の記述と記事内のリンクの記事を参考にしてください.

[ 08_関数の引数が,数値を使用した式の時に発生する現象 ]
http://mrxray.on.coocan.jp/Delphi/plSamples/890_CalcError.htm#08

[ 09_FPU のコントロールワード ( 制御ワード ) と SafeLoadLibrary ]
http://mrxray.on.coocan.jp/Delphi/plSamples/890_CalcError.htm#09


たろう  2021-01-07 23:28:46  No: 149531

Mr.XRAYさんありがとうございます。

> 上のオンラインヘルプに書いてある通り,FPU が処理しています
> デフォルトで四捨五入になっています.
アセンブラの中身に、FPUで処理するコードが書かれているというわけですか。
うーむ・・・アセンブラが理解できれば、なるほど納得なんでしょうけど、
その説明が、ヘルプ内で見つけることができないので、どこかに記載があるのかな?という質問でして。

Format関数のdocwikiページ内に、Mr.XRAYさんの提示していただいた、浮動小数点数の丸めルーチンへの
リンクでもあれば、関連性があると判断できそうですが、別々のページと考えてしまって、結びつかないんです。
(FPUの処理であるという)結論に異議があるのではなく、そうなっているということを記載したものが、
あるかどうかということで。
せっかくお時間を割いて回答いただいたのですが、申し訳ないです。

Delphi 2~7の頃に発売されていた頃の書籍にでも、記載されていたのかもしれませんけれど。
(ではなく、アセンブラを読め!という話か)


Mr.XRAY  2021-01-08 15:45:46  No: 149532

> 上のオンラインヘルプに書いてある通り,FPU が処理しています 

あら !?  何か変です.失礼しました.
FPU の丸めモードに従うですね.


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加