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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)