什么时候在 Delphi 的SameValue函数中指定自定义参数?

omvjsjqw  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(117)

我最近遇到了SameValue函数来比较浮点数。我注意到我们可以选择性地为这个函数指定一个值。
从文档中,我了解到 Delphi 根据所比较的浮点值的数据类型提供默认的浮点值(SingleEpsilonDoubleEpsilonExtendedEpsilon)。

function SameValue(const A, B: Single; Epsilon: Single = 0): Boolean; overload;
function SameValue(const A, B: Double; Epsilon: Double = 0): Boolean; overload;
function SameValue(const A, B: Extended; Epsilon: Extended = 0): Boolean; overload;

我的问题是:
1.在一般的用例中,使用SameValue函数而不指定自定义函数是否可靠?
1.是否存在必须或应该提供自定义值的特定场景?
1.如果提供了一个自定义值,那么根据上下文确定适当值的好策略是什么?
将欣赏见解或最佳实践!

8tntrjer

8tntrjer1#

Delphi 提供的缺省的舍入误差的一个问题是,在一系列的操作中,累积的舍入误差可能会超过缺省的舍入误差。因此,对一个值应用的操作越多,SameValue就越不可能像默认值那样工作。
至于确定自定义策略的策略。我个人认为,使用一个比我们所说的上下文的“基本意义单位”(BMU)低一个数量级的值是合适的。
例如,如果我们谈论的是零售美元价格,BMU将是0.01$,所以我会使用0.001作为BMU。但是,单位价格通常需要有4位小数的精度,在这种情况下,BMU将是0.0001$。在这种情况下,我会使用0.00001作为参数。
有最有可能的情况下,一个BMU的想法不适用。在这些情况下,我不确定我将如何选择一个自定义工具。使用默认值可能是最安全的选择。
由于所有与浮点相关的东西,this仍然是“必读”的。
编辑:安德烈亚斯带来了一个很好的观点。 Delphi 默认使用至少为 FloatTypeResolution的指针。对于Double(其他类型也有类似的情况),该值为1 E-12,但Double可以具有1 E-308(or even smaller)的值。因此,当处理非常小的值时,还需要显式的函数。

相关问题