喫茶XRAYトップページ

[スレッド全体
]

[8410] Re2:Format関数を使ったときの数値の丸めについて返信 削除
2015/1/22 (木) 18:05:18 Mr.XRAY
▼ おかぽんさん

> FloatToTextですが、さては、FPU丸めモードに従って丸められるだけかな?
> FRNDINT を使っているようなので。
>
> 参考資料:http://exlight.net/devel/x86/fpu/


なるほど,FPU の演算仕様を調べればいいということですね.


[8414] Re3:Format関数を使ったときの数値の丸めについて返信 削除
2015/1/23 (金) 10:18:02 おかぽん
▼ Mr.XRAYさん
> なるほど,FPU の演算仕様を調べればいいということですね.
わからないアセンブラを、ステップ実行してみたところ、そうではなさそうです。

ソースがあって実行可能な環境が Delphi 5 しかない状態ですが、

Format 関数は 以下の順で呼び出しされます。
FmtStr→FormatBuf→FloatToText→FloatToDecimal→ExtToDecimal

ExtToDecimalがおそらく丸めを行っているとこなんですけど、以下は
アセンブラが読めなくて苦しいため、正しいかどうかわかりません。

丸める値が "0.005499999232" (現在やりたい処理に相当する適当な値)とすると、
まず 指定された値 0.005499999232に1E18を乗じて5.499999232E18
FRNDINT は、ここで使用されているので、先の投稿は間違い。

以降は、一文字ずつ文字列化している処理しています。
STOSWやらSTOSBで、どこにいったかわからない文字列orz
でも、以降の処理を読む限り、丸める桁の値が5であれば、一つ前の桁を1増やしてる。
銀行型のRound関数とは異なる丸め。
実際、0.065 → 0.07、0.075 → 0.08、-0.065 → -0.07、-0.075 → -0.08 となり
間違いなさそう。

なんてこったい。

[8415] Re4:Format関数を使ったときの数値の丸めについて返信 削除
2015/1/23 (金) 10:40:11 おかぽん
とりあえず、ExtToDecimal関数については、Delphi 5 と Delphi 7 は、
多少記述が違うけど、丸めの部分は同じ。
Turbo Delphi は、Delphi7と全く同じ。
以降のバージョンは、ソースがないのでわかりません。

[8417] Re5:Format関数を使ったときの数値の丸めについて返信 削除
2015/1/23 (金) 21:02:40 Mr.XRAY
▼ おかぽんさん

> とりあえず、ExtToDecimal関数については、Delphi 5 と Delphi 7 は、
> 多少記述が違うけど、丸めの部分は同じ。
> Turbo Delphi は、Delphi7と全く同じ。
> 以降のバージョンは、ソースがないのでわかりません。


多分、おそらく、他のバージョンの Delphi も同じだと思いますてけどね


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82