喫茶XRAYトップページ

[スレッド全体
]

[8080] Re2:計算結果をバイト値で確認返信 削除
2014/10/9 (木) 14:37:20 Mr.XRAY
>したがって,以下のように,SimpleRoundTo の丸めの位置を小数点 3 桁目にすると
>下図のような結果となります.


以下のようなコードでも確認できます.
小数点以下,何桁目で丸めをするかということと,
何桁目までを表示するかということとは違うことにも注意します.


procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c,d,e,f:Extended;
  StrText : string;
 begin
  e:= 179.9349;
  f:= 179.9350;

  StrText := FloatToStr(e) + sLineBreak +
             FloatToStr(f) + sLineBreak + sLineBreak +
             FloatToStr(SimpleRoundTo(e,-2)) + sLineBreak +
             FloatToStr(SimpleRoundTo(f,-2)) + sLineBreak + sLineBreak +
             FloatToStr(SimpleRoundTo(e,-3)) + sLineBreak +
             FloatToStr(SimpleRoundTo(f,-3));

  MessageBox(Handle, PChar(StrText), '結果', MB_OK);
end;

179.9349 を小数点 2 桁目で丸めると,179.93 となるのは,
小数点 3 桁目の値が 4 (5 よりも小さい) だからです.
最初に示したサンプルコードでの e の計算結果は,実際には以下のようになっています.
  179.93499999999....
少なくても仮数部 (有効桁数) の 15 桁目までは 9 ということになります.


[8081] というわけで...返信 削除
2014/10/9 (木) 14:53:27 Mr.XRAY
最初に示したサンプルの結果は,結局,

[890_計算誤差 ( 数値計算の誤差 ) と多倍長演算]
http://mrxray.on.coocan.jp/Delphi/plSamples/890_CalcError.htm

の記事の内容が原因ということが分かりました.
たまにある質問なのですが,現在のコンピュータが有限桁数の演算しか
できないというこを理解していないと,数学的に正しい結果でないことが,
疑問となることがあります.

実際問題として,最後の桁の数値が 1 ぐらい違っていても,
数値計算では誤差範囲内と言えます.

ネタ元はメールでの問い合わせですが,例によって,いろいろやってみました.
質問された方が納得するかどうかは不明です (^^;


[8083] Re:というわけで...返信 削除
2014/10/9 (木) 22:33:50 Mr.XRAY
Delphi Forum に,内容をまとめて投稿しておきました.
[数値計算の誤差と四捨五入]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1203.0#postid-2404

このような数値計算の誤差による違いを表現できる例というのは,
中々見つかるものではありません.
個人的には貴重なサンプルではないかと思っています.


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