我正在为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
是浮动或类似的最小可区别差异。
由于
答案 0 :(得分:2)
d < 0
是有效的(虽然我更愿意写d < 0.0
。在第一种情况下,在比较之前,零将被“提升”为双倍。
将<
或>
与double比较为完全有效,并且不需要“epsilon”。
bin += "-";
毫无意义。
通常将浮点/双精度与“==”进行比较是无效的,不应该进行(除了一些特殊情况,例如检查零或无穷大)。有些语言甚至不允许在浮点数之间使用“==”(或等效)。
d == (int) d
更无意义。
答案 1 :(得分:1)
请参阅我对这个问题的回答:
How dangerous is it to compare floating point values?
具体而言,建议你不应该使用绝对epsilons,不应该使用浮点,直到你完全阅读并理解每个计算机科学家应该知道的关于浮点运算的内容。
至于您问题中的这段特定代码,您的目标似乎是打印数字的文本表示,只需测试< 0
即可。无论你是写0
还是0.0
都无关紧要。