测试双变量是否等于0,哪种方法更好(效率/最佳实践)?
1. if(a_double)
.....
else
.....
OR
2. if(a_double == 0)
.....
else
.....
答案 0 :(得分:7)
第二个通常更好(更清楚你正在做什么)。我通常更喜欢if (a_double == 0.0)
。另请注意,对于浮点数,进行近似比较以解释计算中舍入的可能性通常很有用(尽管这样做可能非常简单)。
编辑:由于似乎存在一些关于哪些数字能够和不能精确表示的误解:大多数计算机使用二进制浮点数。这意味着分母是两个幂的和的一个分数可以精确表示。如果(且仅当)分母包含不能表示为2的幂之和的素因子,则不可能精确地表示该数字。
当然,如果你太小(或太大),根本无法表示数字(例如,正常的IEEE浮点数不能提供表示1e + 10000或1e-等数字的方法。 2000)。此外,当你接近表示的极限时,你放弃一些精度(例如,正常double
的限制是1e-308--而在1e-300,你只能获得~7位数的精度而不是通常~15)。
还有一些计算机使用十六进制浮点和/或十进制浮点。对于我们在这里考虑的内容,十六进制浮点基本上与二进制浮点相同(即,因为16是2的幂,所以如果分母是2的幂的和,它仍然只能精确地表示分数)。十进制浮点允许精确表示数字,其中分母也包括5的幂(例如,1.2可以精确地用十进制浮点表示,但不能用二进制或十六进制浮点表示)。这具有明显的优势(再次,在其范围和精度的限制范围内)您输入的任何十进制数字都将被精确表示。
答案 1 :(得分:2)
因为通常双打不会完全等于任何整数,所以在测试它们是否相等时需要小心。
阅读本文: http://docs.sun.com/source/806-3568/ncg_goldberg.html
实际上,对于浮点数,您需要测试浮点数是否接近某个容差范围内的某个数字。
答案 2 :(得分:0)
对先前不完整和不正确的解释道歉。这就是我的意思。
#include<iostream>
using namespace std;
int main(){
double a=3/5;
double b=2/5;
double c=(a+b)-1;
if(c==0)
cout<<"C is 0"<<endl;
else if(c==0.0)
cout<<"C is 0.0"<<endl;
else
cout<<"C!=0 && C!=0.0"<<endl; //This will print most of the time
}
您可能必须阅读有关a_double
如何获取其值的测试用例。 @Jerry告诉我的最大问题是用双重测试==很难。请注意,以下内容无法正常工作..
#include<iostream>
using namespace std;
int main(){
double a=5.5;
double b=6.5;
double c=(a+b)/12;
if(c==0)
cout<<c<<endl;
else
cout<<"c is not equal to 0"<<endl;
}