|
|
1
18
使用
细节:一个以2为基数的浮点数表示为一个有效位—一个介于1和2之间的数字—乘以2,得到某个指数。一个双精度数的有效位的小数部分有52位,指数的精度有11位。如果指数是一个非常大的负值,有效位为0,则得到的值接近
有关如何测试两个浮点数是否相等的完整讨论,请参见 "Comparing Floating Point Numbers, 2012 Edition" 布鲁斯·道森。总的来说,有三种主要的比较方法: 使用绝对差异如在 Joel Coehoorn's example 但是 非常 注意选择一个适当大小的值,不像Joel的例子。 使用相对差异如下所示:
但是,也有一些复杂的情况;您应该除以两个值中较大的一个,对于接近零的值,这个函数的性能很差,除非您还添加了一个最大绝对差的检查。详情请参阅本文。 使用末位单位使用末位单位(ulps)进行比较意味着检查有效位的最后一部分。(本文将其称为“使用整数进行比较”)这是一种更复杂的方法,但非常健壮。本文提供了C中的源代码;对于C,您可能可以使用 BitConverter.DoubleToInt64Bits . 响应您的编辑“多大几倍?”这确实是您的应用程序域的一个问题,这可能就是.NET框架不提供默认方法的原因,但我很幸运地使用了ULPS比较,最大ULPS差异为4。 |
|
|
2
2
这在一定程度上取决于你所使用的价值观。如果你使用的是只关心2个小数点的数字,那么使用0.001就可以了。你可能会使用
编辑:删除对货币的引用,因为它偏离了重点。 来自msdn的报价: 如果创建一个自定义算法来确定两个浮点数是否可以被视为相等,则必须使用大于epsilon常量的值来为要被视为相等的两个值建立可接受的绝对差值。(通常,差异幅度比epsilon大很多倍。) |
|
|
3
2
注意,在实践中,此代码相当于
但你能做的就是用这种技术来定义你自己的精密度——你就是自己的epsilon。我希望
|
|
|
4
1
不幸的是,这里没有好的经验法则。这完全取决于你的计划的需要。玩具物理模拟可能更喜欢非常高的epsilon,这样碰撞就不会错过。同时,一个统计数据包会希望低epsilon更准确。你只需要根据你的应用程序的需要调整它。 |
|
|
5
1
有多大取决于输入和执行的操作数量。除了数量考虑之外,每个操作都会增加舍入误差。如果你在比较之前对数字做了很多计算,那更多的是有效数字而不是机器精度。 您的窗口需要大于任何计算结果累积的最坏情况舍入误差。如果比较小,可能会出现比较失败的情况。 |
|
|
6
1
以下是中提到的实现(比较IEEE表示的最后一位) "Comparing Floating Point Numbers", by Bruce Dawsone ,移植到C。
有人会说
这与 Google Test (gtest) for C++ as well .
gtest使用默认值
四
对于
|
|
|
Leo · 为什么carg(-0)返回-pi? 1 年前 |
|
Fyodor · 在C中使用sin和cos计算数学表达式不正确? 1 年前 |
|
|
Alexander · 为什么数字的输出不同? 1 年前 |
|
Ronny · 如何防止程序返回“inf”? 1 年前 |
|
|
EMS · 为什么双重打印的值与C中的浮点值相同,而它们的大小不同? 2 年前 |
|
|
Dakolas · 对python十进制库感到困惑 2 年前 |
|
|
RTC222 · 无法获取vrndscalepd的正确舍入模式代码 2 年前 |