可以检查双"d < 0"吗?
Is it okay to check a double "d < 0"?
我正在为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
。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- <<操作员在下面的行中工作
- 清除前检查矢量