【发布时间】:2015-02-22 13:33:06
【问题描述】:
我正在计算N + fraction 形式的实数值。说,例如N + fraction = 7.10987623,然后N = 7和fraction = 0.10987623接下来,我需要检查fraction是否大于或等于比率23269/25920。
以下在 C/C++ 中似乎给出了正确的结果;但是,我不确定这是否是进行比较的正确方法:
// EPSILON is defined to be the error tolerance
// and `ratio' is defined as 23269.0/25920.0
if(fabs(fraction - ratio) > EPSILON)
// `fraction' is greater or equal to `ratio'
我也尝试过另一种方法,但它似乎给出了不正确的结果。
if(fabs(fraction - ratio) < EPSILON)
【问题讨论】:
-
fabs(fraction - ratio)的结果没有说明fraction是大于还是小于ratio。在测试您认为正确的方法时,有五个相关的fraction值需要测试:一个比ratio小很多,一个比ratio小一点,一个正好等于ratio(甚至如果ratio不完全是 23269/25920),则一个比ratio大一点,一个比ratio大很多。如果你像这样测试你的两种方法,你会发现这两种方法都行不通。如果你写出你对这五个案例的预期结果,你就会找到答案。 -
投票支持重新打开,这个问题肯定有很多重复但这里的重复是错误的。
-
比较
fraction * 25920和23269怎么样? -
@2501 绝对不是重复的。那个问题是关于平等
==,这个问题是关于订购<。它们可能看起来相似,但实际上完全不同。 -
您似乎不明白 David Schwartz 在说什么。让我尝试重新制定。数学比较告诉您发生了两种情况中的哪一种,
(1) x < y或(2) x >= y。您需要执行两个操作,do stuff when x < y和do other stuff when x >= y。这个决定很容易。机器浮点比较在正确实施时会说明发生 三种 情况中的哪一种:(1) x < y、(2) x > y和(3) x and y are too close to tell。您需要发明 三个 相应的动作,或者将两个案例合并在一起。
标签: c++ c floating-point floating-accuracy