将double变量视为布尔值

时间:2010-10-26 03:53:38

标签: c++

测试双变量是否等于0,哪种方法更好(效率/最佳实践)?

    1. if(a_double)
          .....
       else
          .....

    OR

    2. if(a_double == 0)
          .....
       else
          .....

3 个答案:

答案 0 :(得分:7)

第二个通常更好(更清楚你正在做什么)。我通常更喜欢if (a_double == 0.0)。另请注意,对于浮点数,进行近似比较以解释计算中舍入的可能性通常很有用(尽管这样做可能非常简单)。

编辑:由于似乎存在一些关于哪些数字能够和不能精确表示的误解:大多数计算机使用二进制浮点数。这意味着分母是两个幂的和的一个分数可以精确表示。如果(且仅当)分母包含不能表示为2的幂之和的素因子,则不可能精确地表示该数字。

当然,如果你太小(或太大),根本无法表示数字(例如,正常的IEEE浮点数不能提供表示1e + 10000或1e-等数字的方法。 2000)。此外,当你接近表示的极限时,你放弃一些精度(例如,正常double的限制是1e-308--而在1e-300,你只能获得~7位数的精度而不是通常~15)。

然而,在一定限度内,整数可以精确表示(取决于有效数的大小 - 通常大约2 53 ),分母的分数也可以是分数或分数的分数。 2(例如,3.5,1.375)。

还有一些计算机使用十六进制浮点和/或十进制浮点。对于我们在这里考虑的内容,十六进制浮点基本上与二进制浮点相同(即,因为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;
}