4

我正在为 Arduino 编写一个完整的双浮点函数(无关紧要,但我找不到任何“正确”的函数),我做了以下检查:

if (d < 0) {
    d *= -1;
    bin += "-";
}

我知道由于浮点不精确,双重相等是挑剔的。那么这样做安全吗?或者我应该坚持这个(无论如何我在我的代码的后面部分使用它)

int compareNums(double x, double y) {
    if (abs(x - y) <= EPSILON) {
        return 0;
    } else if (x > y) {
        return 1;
    } else {
        return -1;
    }
}

还有几个简单的问题:我做d < 0或做有关系d < 0.0吗?

我将 a 乘以double d10 直到它没有小数部分,所以我做了一个类似于d == (int) d. 我想知道什么是好的 epsilon 使用(我在这里使用了这个http://msdn.microsoft.com/en-us/library/6x7575x3(v=vs.80).aspx),因为我不想以无限循环结束。根据文章0.000000119209是浮动或类似的东西的最小可区分差异。

谢谢

4

2 回答 2

2

d < 0是有效的(尽管我更喜欢写d < 0.0。在第一种情况下,在比较之前,零将被“提升”为加倍。

并且将 double 与 0 与<or进行比较>是完全有效的,并且不需要“epsilon”。

bin += "-";是荒谬的。

一般来说,将浮点数/双精度数与“==”进行比较是无效的,并且永远不应该这样做(除了一些特殊情况,例如检查零或无穷大)。有些语言甚至不允许在浮点数之间使用“==”(或等价物)。

d == (int) d更废话了。

于 2012-07-18T03:45:59.930 回答
1

看我对这个问题的回答:

比较浮点值有多危险?

具体来说,建议您不应该使用绝对 epsilon 并且不应该使用浮点,直到您彻底阅读并理解了每个计算机科学家应该了解的关于浮点算术的知识

至于您问题中的这段特定代码,您的目标似乎是打印数字的文本表示,简单地测试< 0是正确的。不管你写0还是0.0.

于 2012-07-18T03:45:11.477 回答