- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
进行以下记录:
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).Normalized)
的 Boolean
值为 True
。但结果却是False
。
在调试器中 TVector2D.New(0,0.707).Normalized.y
显示为 1
。
不可能正好为 1,否则 (jHat2D = TVector2D.New(0,0.707).Normalized)
的 Boolean
值将为 真
。
有什么想法吗?
编辑
Accuracy
是一个Type
,定义为:Accuracy = Double
最佳答案
假设Accuracy是Double类型的同义词,这是调试器可视化浮点值的一个错误。由于 float 内部表示的固有问题,v1.Y 和 v2.Y 的值略有不同,尽管两者都近似于1.
添加v1.y和v2.y的监视。确保将这些监视值配置为表示为“浮点”值,并将位数设置为 18,以获取最大细节。
在断点处您将看到:
v1.y = 1
v2.y = 0.999999999999999889
(whosrdaddy 在问题评论中提供了上述简短版本,但我保留了调查的详细形式 - 请参阅结论之后的行下方 - 作为它可能在其他类似的情况下有用并且具有潜在的兴趣)
虽然严格来说调试器可视化是不正确的(或者充其量是误导性的),但它们仍然几乎正确。 :)
接下来的问题是您是否需要严格准确度或在一定容差范围内的准确度。如果是后者,那么您可以使用 SameValue() 以及定义的适合您所需准确度的 EPSILON。
否则,您必须接受这样的事实:在调试代码时,您不能依赖调试器将调试中涉及的值表示为代码本身所依赖的准确度。
选项:自定义调试可视化本身
或者,您可能希望调查 creating a custom debug visualisation使您的 TVector2D 类型能够按照代码中使用的精度来表示 x/y 值。
对于使用 FloatToStr() 的此类可视化,请使用 Format() 以及带有适当小数位数的 %f 格式说明符。例如下面的调用产生通过观察上述变量获得的结果:
Format('%.18f', [v2.y]);
// Yields 0.999999999999999889
<小时/>
我修改了 Equal 运算符,以允许我检查两个值 v1.y 和 v2.y 的内部表示:
type
PAccuracy = Accuracy;
class operator TVector2D.Equal(const V1, V2: TVector2D): Boolean;
var
A, B: Boolean;
ay, by: PAccuracy;
begin
ay := @V1.y;
by := @V2.y;
A := (V1.x = V2.x);
B := (V1.y = V2.y);
result := A and B;
end;
通过在调试器中设置监视来提供 ay^ 和 by^ 的内存转储,我们看到这两个值在内部表示非常不同:
v1.y : $3f f0 00 00 00 00 00 00
v2.y : $3f ef ff ff ff ff ff ff
注意:由于英特尔的 Little Endian 特性,与上述实际值相比,监视值结果中的字节顺序是相反的。
然后我们可以通过将带有这些内部表示的 double 传递给FloatToStr()来测试假设:
var
a: Double;
b: Double;
ai: Int64 absolute a;
bi: Int64 absolute b;
begin
ai := $3ff0000000000000;
bi := $3fefffffffffffff;
s := FloatToStr(a) + ' = ' + FloatToStr(b);
// Yields 's' = '1 = 1';
end;
因此我们可以得出结论,B的评估是正确的。 v1.y 和 v2.y 不同。调试器对 Double 值的表示不正确(或者充其量是误导性的)。
通过更改 B 的表达式以使用 SameValue(),我们可以确定所涉及值之间的偏差:
uses
Math;
const
EPSILON = 0.1;
B := SameValue(V1.y, V2.y, EPSILON);
通过逐渐减小 EPSILON 的值,我们发现 v1.y 和 v2.y 的差异小于 0.000000000000001 自:
EPSILON = 0.000000000000001; // Yields B = TRUE
EPSILON = 0.0000000000000001; // Yields B = FALSE
关于delphi - Embarcadero RAD Studio XE2 调试器中显示的局部变量的准确度是多少?显然1不等于1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972796/
有谁知道 C#/Excel 的 Delphi 中的等价物是什么财务职能 : PMT、IPMT 和 PPMT ? 最佳答案 财务功能在System.Math单元。 他们有全名,如 NetPresentV
我正在使用 Embarcadero C 编译器(在 Windows 7 下)来创建控制台应用程序。 我使用的早期版本允许我在 Windows 下设置窗口的大小,并且它会很乐意解决我设置的任何大小(使用
这里有一个简短的问题: 我正在尝试在 32 位 Windows 7 上使用 Embarcadero C++ Builder XE3 试验内联汇编,特别是为了开始重新自学汇编,以备将来实际应用的可能性。
随着我对 VS 2010 越来越失望,我试图找到一些替代方案,我正在寻找 Embarcadero 的新版 C++ env。 当 VS 几乎主导市场时,学习新的(我认为不流行的)产品有什么意义吗? 谢谢
我正在使用 Embarcadero C++Builder 编译器。我想知道是否有办法在子类中隐藏使用 __property 关键字声明的属性。 例如,我正在创建一个派生自 TPanel 的控件,我在其
我正在尝试从Delphi 2007迁移到Embarcadero RAD Studio XE。 我收到大量警告。 它们都看起来像这样:我有一个声明“字符串”的过程: procedure SendMail
System.DateUtils.EncodeDateTime() 的文档说: Valid hour values are 0 through 24. (If the specified hour i
有人可以告诉我在哪里可以找到好的 BDE 安装程序吗? 这些链接将不再有效: http://info.borland.com/devsupport/bde/bdeupdate.html 最佳答案 ht
我在 FireMonkey 3D 中搜索了相机旋转和缩放的示例。就像使用鼠标左键围绕场景旋转相机并使用鼠标滚轮放大和缩小一样。 有人可以帮我吗? 最佳答案 下面的表单显示了一个简单的演示,只需保存 .
我需要一个用于 C++ 构建器的 WindowHandleToPlatform 示例我想使用句柄对表单执行 bitblt 和其他功能我可以使用 VCL 做到这一点并且效果很好。认为 WindowHan
我想知道如何在 TTcpServer 类上使用已连接的客户端?我在方法“ServerAccept”上连接了一个客户端,下一步是什么?我如何与他们合作?我需要从 ServerAccept 开始一个新线程
我有一个对象要删除: XMLDoc = new TXMLDocument(NULL); 但我不知道该怎么做...它不起作用: delete XMLDoc; XMLDoc->free(); 当我尝试只
我有一个带有结构的元素类,我想在数组中放置一些对象。我的类(class): class element { public: //properties AnsiString ON; /
我想就如何处理 Embarcadero CB10.1 的重新进入问题提出一些建议。在“禁用所有优化”设置为 true 的调试配置中编译。我在 Win7 上运行。 我有一个简单的测试用例。带有两个按钮的
试图让 NFC 在 Embarcadero XE5 中的 Android 上运行。从以下内容开始:https://forums.embarcadero.com/thread.jspa?threadID
昨天,我在 embarcadero delphi 2010 中安装了专为 Delphi 7 设计的 TPing 组件,但今天我注意到当我单击“开始”按钮时,由于访问冲突错误,该组件导致我的应用程序崩溃
将 TChangeTabAction 标准操作添加到我的操作列表后,我写了一个这样的函数: procedure TfrmMain.ChangeTab(TargetTab: TTabItem; Reve
我尝试过在 XE7、32 位下构建一些较旧的应用程序。当我在 XP 下执行它们时,它们执行得很好,尽管 https://www.embarcadero.com/products/cbuilder/fa
我正在尝试调试一段在单行中包含多个函数调用的密集代码。我想单步执行我编写的所有代码,但在这样做时,我不断地发现自己在提供的源代码中,包括汇编代码。 这发生在客户站点上运行 XE5 的计算机上。在我自己
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 社区去年审查了是否重
我是一名优秀的程序员,十分优秀!