我正在为 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
更废话。