喫茶XRAYトップページ

[スレッド全体
]

[8071] 四捨五入返信 削除
2014/10/8 (水) 16:50:38 Mr.XRAY
四捨五入と丸めに関するサンプルです.
例えば以下のコードを実行します.
コードの下の図を見てください.
動作確認は,Windows 7 U64(SP1) + Delphi XE5 Pro で,32 ビットのEXEです.


//-----------------------------------------------------------------------------
//  (1)と(2)の計算式は,数学的には等しく,179.935となる
//  SimpleRoundToの使用にはusesにMathが必要
//
//  Math.GetRoundModeで取得したモードはrmNearest
//  Extendedの扱いは
//  Math.SetPrecisionMode(pmDouble);
//  でDouble型として扱うようにできる
//-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c,d,e,f:Extended;
  strText : String;
begin
  a:=389.7;
  b:=94.4;
  c:=30;
  d:=0.35;
  e:=(a+b+c)*d;    //(1)
  f:=a*d+b*d+c*d;  //(2)

  StrText :=  FloatToStr(e)+#13+
              FloatToStr(f)+#13+ sLineBreak +
              FloatToStr(SimpleRoundTo(e,-2))+#13+
              FloatToStr(SimpleRoundTo(f,-2));
  MessageBox(Handle, PChar(strText), '結果', MB_OK);
end;

//-----------------------------------------------------------------------------
//  変数の型をDoubleとした場合
//-----------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  a,b,c,d,e,f:Double;
  strText : String;
begin
  a:=389.7;
  b:=94.4;
  c:=30;
  d:=0.35;
  e:=(a+b+c)*d;    //(1)
  f:=a*d+b*d+c*d;  //(2)

  StrText :=  FloatToStr(e)+#13+
              FloatToStr(f)+#13+ sLineBreak +
              FloatToStr(SimpleRoundTo(e,-2))+#13+
              FloatToStr(SimpleRoundTo(f,-2));
  MessageBox(Handle, PChar(strText), '結果', MB_OK);
end;


数学的に正確な値は,どちらも 179.94 です.
  e:=(a+b+c)*d;    //(1)
  f:=a*d+b*d+c*d;  //(2)

しかし,結果の図のように Extended 型では e と f が違っています.
Double 型では同じ値になっていますが,数学的に正しい値ではありません.


[8076] Extended 型返信 削除
2014/10/9 (木) 00:46:17 Mr.XRAY

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