delphi – Embarcadero RAD Studio XE2调试器中显示的局部变量的准确度是多少?显然1不等于1

delphi – Embarcadero RAD Studio XE2调试器中显示的局部变量的准确度是多少?显然1不等于1,第1张

概述记下以下记录: TVector2D = record public class operator Equal(const V1, V2: TVector2D): Boolean; class operator Multiply(const D: Accuracy; const V: TVector2D): TVector2D; class operator Divide 记下以下记录:

TVector2D = record  public    class operator Equal(const V1,V2: TVector2D): Boolean;    class operator Multiply(const D: Accuracy; const V: TVector2D): TVector2D;    class operator divIDe(const V: TVector2D; const D: Accuracy): TVector2D;    class function New(const x,y: Accuracy): TVector2D; static;    function Magnitude: Accuracy;    function normalised: TVector2D;  public    x,y: Accuracy;  end;

使用定义为的方法:

class operator TVector2D.Equal(const V1,V2: TVector2D): Boolean;  var    A,B: Boolean;  begin    Result := (V1.x = V2.x) and (V1.y = V2.y);  end;  class operator TVector2D.Multiply(const D: Accuracy; const V: TVector2D): TVector2D;  begin    Result.x := D*V.x;    Result.y := D*V.y;  end;  class operator TVector2D.divIDe(const V: TVector2D; const D: Accuracy): TVector2D;  begin    Result := (1.0/D)*V;  end;  class function TVector2D.New(const x,y: Accuracy): TVector2D;  begin    Result.x := x;    Result.y := y;  end;  function TVector2D.Magnitude;  begin    RESulT := Sqrt(x*x + y*y);  end;  function TVector2D.normalised: TVector2D;  begin    Result := Self/Magnitude;  end;

和常数:

const    jHat2D : TVector2D = (x: 0; y: 1);

我希望(jHat2D = TVector2D.New(0,0.707).normalised)的布尔值为True.然而它出来是假的.

在调试器TVector2D.New(0,0.707).normalised.y中显示为1.

不可能是这正好是1,否则布尔值(jHat2D = TVector2D.New(0,0.707).normalised)将为True.

有任何想法吗?

编辑

精度是一种定义为:精度=双精度的类型

解决方法 假设Accuracy是Double类型的同义词,这是调试器可视化浮点值的错误.由于浮点内部表示的固有问题,v1.Y和v2.Y的值略有不同,尽管两者都接近1.

为v1.y和v2.y添加手表.确保将这些监视值配置为表示“浮点”值,并将数字设置为18以获得最大细节.

在断点处你会看到:

v1.y      = 1v2.y      = 0.999999999999999889

(whosrdaddy在问题的评论中提供了上述简短版本,但我保留了我的调查的长期形式 – 见结论后面的行 – 因为它可能在其他类似的情况下以及潜在的兴趣中证明是有用的)

结论

虽然调试器可视化严格地说是不正确的(或者最好是误导性的),但它们从来都不是非常正确的. 总结

以上是内存溢出为你收集整理的delphi – Embarcadero RAD Studio XE2调试器中显示的局部变量准确度是多少?显然1不等于1全部内容,希望文章能够帮你解决delphi – Embarcadero RAD Studio XE2调试器中显示的局部变量的准确度是多少?显然1不等于1所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1272958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存