可以检查双"d < 0"吗?

Is it okay to check a double "d < 0"?

本文关键字:lt 检查      更新时间:2023-10-16

我正在为Arduino编写一个完整的double-to-float函数(不相关,但我找不到任何"合适的"函数),我进行了以下检查:

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。在第一种情况下,在比较之前,零将"提升"为两倍。

将双零与<>进行比较是完全有效的,并且不需要"ε"。

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

通常,将浮点/双精度与"=="进行比较是无效的,永远不应该这样做(除了一些特殊情况,如检查零或无穷大)。有些语言甚至不允许在浮点之间使用"=="(或等效值)。

d == (int) d更是无稽之谈。

请参阅我对这个问题的回答:

比较浮点值有多危险?

具体来说,建议您不要使用绝对ε,也不要使用浮点,直到您彻底阅读并理解每个计算机科学家都应该知道的浮点运算

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