delphi – Embarcadero RAD Studio XE2调试器中显示的局部变量的
发布时间:2020-12-15 09:49:22 所属栏目:大数据 来源:网络整理
导读:记下以下记录: 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): TVecto
记下以下记录:
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 = 1 v2.y = 0.999999999999999889 (whosrdaddy在问题的评论中提供了上述简短版本,但我保留了我的调查的长期形式 – 见结论后面的行 – 因为它可能在其他类似的情况下以及潜在的兴趣中证明是有用的) 结论 虽然调试器可视化严格地说是不正确的(或者最好是误导性的),但它们从来都不是非常正确的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |