3

私は Delphi 5 を使用して、時折のプログラミング作業を行っています。これには、私のエレクトロニクス ビジネス向けの優れたビジネス アプリも含まれます。私は何年にもわたってグラフィックス、データベース、およびその他の一般的な作業を行ってきました。

今日は、いくつかの物理学に基づいてピクセルを動かしたいシミュレーションを作成しています。詳細はアプリでは重要ではありませんが、午前中と昨日のいくつかを検索して、Square の使用方法を見つけました。奇妙な答えを得ることなくルート、および平方関数。拡張変数型「vector_length」に割り当てられた単純な計算を調べると、計算時に次のような結果が得られます (数値は固定されていますが、それらの数値を表す float 型と同じ結果になります)。

vector_length := Sqrt(Sqr(3.4) + Sqr(3)) 

理論的には、約 4.53 になります。計算機を使用して十分に合理的です。

Delphi のデバッガーは、次のように表示します。

2.9134839203548e-322

これは明らかに意味のない浮動小数点表現です。

コードが期待どおりに機能しないので、数学が間違っているか、関数が妥当な結果をもたらすと期待して何か間違ったことをしているとしか思えませんか??

ご意見ありがとうございます。

4

1 に答える 1

5

表現に間違いはありません。私はこれでテストしました(Delphi 2007)-私はもうD5を持っていませんが、それらの間で(もしあれば)あまり変わったとは思いませSqrSqrt

program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math;

var
  Vector_Len: Extended;

begin
  Vector_Len :=  Sqrt(Sqr(3.4) + Sqr(3));
  WriteLn('Vector_Len: ' + Format('%f', [Vector_Len]));
  ReadLn;
end.

これにより、次のコンソール出力が生成されました。

ここに画像の説明を入力

しかし、@Uweは何かに取り組んでいると思います。あなたが見ているのはデバッガーの不具合ではないと思います。値を検査することにしたのはちょうどその場所だと思います。コードを次のように変更します (これは明らかに「表示のみを目的とした」テスト アプリです。このコンテキストでは関数は無意味であり、この関数のように a を使用しvarてすぐに に割り当てることは明らかにないからですResult):

program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils, Math;

function CalcVectorLen: Extended;
var
  Vector_Len: Extended;
begin
  Vector_Len :=  Sqrt(Sqr(3.4) + Sqr(3));
  Result := Vector_Len;
end;

begin
  WriteLn('Vector_Len: ' + Format('%f', [CalcVectorLen]));
  ReadLn;
end.

行にブレークポイントを設定してVector_Len := Sqrt(実行します。デバッガーは次の出力を表示します (実際の値は異なる場合があります)。

(注: 実際のデバッガー ポップアップ評価ウィンドウをキャプチャできませんでしたが、Local Variablesデバッグ ウォッチ ウィンドウで矢印でマークされているものと同じです。)

ここに画像の説明を入力

何が起こっているかというとVector_Len、式の評価が実際に行われ、結果が変数に代入される前に、 の初期化されていない値を調べているということです。ただし、アプリを最後まで実行すると、コンソール ウィンドウには正しい出力が表示されます。

于 2012-04-26T19:34:03.787 に答える