例えば 以下を実行すると、'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 でソースを確認しましたが、最終的にアセンブラになっていて、
どう処理しているかわかりませんでした。
頭の中では、四捨五入(五捨五入?)だと覚えているのですが、
さて、どこでそれを覚えたのやらと、気になったものの、根拠がなくて質問してみました。
いわゆる数値における「丸め」の問題ですね.
> 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
Mr.XRAYさんありがとうございます。
> 上のオンラインヘルプに書いてある通り,FPU が処理しています
> デフォルトで四捨五入になっています.
アセンブラの中身に、FPUで処理するコードが書かれているというわけですか。
うーむ・・・アセンブラが理解できれば、なるほど納得なんでしょうけど、
その説明が、ヘルプ内で見つけることができないので、どこかに記載があるのかな?という質問でして。
Format関数のdocwikiページ内に、Mr.XRAYさんの提示していただいた、浮動小数点数の丸めルーチンへの
リンクでもあれば、関連性があると判断できそうですが、別々のページと考えてしまって、結びつかないんです。
(FPUの処理であるという)結論に異議があるのではなく、そうなっているということを記載したものが、
あるかどうかということで。
せっかくお時間を割いて回答いただいたのですが、申し訳ないです。
Delphi 2~7の頃に発売されていた頃の書籍にでも、記載されていたのかもしれませんけれど。
(ではなく、アセンブラを読め!という話か)
> 上のオンラインヘルプに書いてある通り,FPU が処理しています
あら !? 何か変です.失礼しました.
FPU の丸めモードに従うですね.
ツイート | ![]() |