我正在为 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 有关系吗?

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

谢谢

最佳答案

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

将 double 与 <> 进行比较是完全有效的,并且不需要“epsilon”。
bin += "-"; 是荒谬的。

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

10-07 18:54
查看更多