FloatToStr(1.0) = 0.99999998430675となるのは何故でしょうか


こういち  2005-03-21 21:18:04  No: 13866

現在、DirectX9.0bを使用し、3Dのモデルを表示するプログラムを
作成しております。
環境<OS:WindowsXPSP2+IE6SP2+Delphi7ent>

ShowMessage(floattostr(1.0));
を実行すると
0.99999998430675
と表示されてしまいます。
DirectXを使用しないプログラムだと(同じパソコン上です)結果は
1
となります。
似た現象として、
  NewDate,NewDate1,NewDate2,NewDate3 : TDateTime;
  NewDate := StrToDateTime('2005/03/31 00:00:00');
  NewDate1 := NewDate + 1;
  NewDate2 := NewDate + 2;
  NewDate3 := NewDate + 3;
の各値をDateTimeToStrの引数に渡すと下記の結果になります。
  2005/03/31 0:00:59
  2005/03/31 23:58:24
  2005/04/02 0:00:12
  2005/04/03 0:01:59
DirectXを使用した時、小数の扱いが変わっているみたいです。
似た現象に遭遇した方、解決への糸口、何でもかまいません。
ご教授お願いします。


たかみちえ  URL  2005-03-21 22:24:22  No: 13867

これだけでは何ともいえませんが…。
DirectXとは、Windowsの仕組みを迂回して、直接ハードウェアをさわる仕組みです。
http://www.netlaputa.ne.jp/~hatahara/qa47.html( Ctrl+F で、DirectXを検索する )
故に、その実数を格納しているメモリ領域を破壊してしまった可能性があります。


こういち  2005-03-21 23:24:33  No: 13868

返事ありがとうございます。
メモリ破壊だとすると特定するのがむずかしそうです。
WinAPIで一時的に、実数の有効桁数を変えたりするものの存在とは
有り得ないでしょうか。


にしの  2005-03-24 01:59:13  No: 13869

SetPrecisionMode(pmDouble);
ShowMessage(floattostr(1.0));
でどうでしょう。
他の計算に影響が出るかもしれませんので、SetPrecisionModeの戻り値を再度設定してやってください。


とおりすがり  2005-04-05 17:44:11  No: 13870

Set8087CW(Default8087CW{=$1332})
とか
Set8087CW($133F)

なんかは?


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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