Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将双变量视为布尔变量_C++ - Fatal编程技术网

C++ 将双变量视为布尔变量

C++ 将双变量视为布尔变量,c++,C++,测试双变量是否等于0的更好方法(效率/最佳实践方面)是什么 1. if(a_double) ..... else ..... OR 2. if(a_double == 0) ..... else ..... 第二种方法通常更好(更明确地说明你在做什么)。不过,我通常更喜欢if(a_double==0.0)。还请注意,对于浮点运算,进行近似比较以说明计算中四舍五

测试双变量是否等于0的更好方法(效率/最佳实践方面)是什么

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

    OR

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

第二种方法通常更好(更明确地说明你在做什么)。不过,我通常更喜欢
if(a_double==0.0)
。还请注意,对于浮点运算,进行近似比较以说明计算中四舍五入的可能性通常是有用的(尽管做好这一点并非易事)

编辑:由于对什么数字可以和不能精确表示有一些误解:大多数计算机使用二进制浮点。这意味着分母为二次幂和的分数可以精确表示。如果(且仅当)分母包含不能表示为2的幂和的素数因子,则不可能精确表示该数字

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

然而,在一定范围内,整数可以精确表示(取决于有效位的大小——通常在253左右),分母为2的和或幂的分数也可以精确表示(例如,3.5、1.375)


也有使用十六进制浮点和/或十进制浮点的计算机。我们在这里考虑的是,十六进制浮点基本上与二进制浮点相同(即,因为16是2的幂,所以如果分母是2的幂和,它仍然只能精确地表示分数)。十进制浮点数允许精确表示分母也包含5次幂的数字(例如,1.2可以用十进制浮点数精确表示,但不能用二进制或十六进制浮点数精确表示)。这有一个明显的优点,即(同样,在其范围和精度的限制范围内)您输入的任何十进制数都将精确表示。

因为通常情况下,双精度不会完全等于任何整数,所以在测试它们是否相等时需要小心

请阅读以下内容:

本质上,对于浮点,您要测试浮点是否接近某个公差范围内的某个数字。

Edit 对之前不完整和不正确的解释表示歉意。这就是我的意思

#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
}

…做一个近似比较通常很有用…谢谢Jerry。将_double与0进行比较与0.0有什么不同?第一个需要编译时从整数转换为double,第二个已经是double。好的,我知道非规范化表示(用于非常小的值)会失去精度,但是为什么1e300的精度会降低?@Ben:Oops——一个愚蠢的思想家——把
+300
+308
放在我想要的
-300
-308
位置。我很抱歉。你的第一句话有点误导人,因为有些双精度确实等于相应的整数。很好的参考,尽管说“双精度不会完全等于任何整数”并不是真的。很多整数(包括0:-)可以精确表示为浮点数。但是,即使该数字可以用浮点数格式表示,由于计算中的舍入错误,双精度浮点实际存储的内容也可能不同。最有可能的是,他并没有给double赋值0.0(因为那样做会使比较变得毫无意义)。如果他做了一些计算,并将结果与0进行比较,那么@shuttle87是绝对正确的:一般来说,你不能依靠它来获得准确的结果,即使期望的结果可以表示为FP。关于12除以12是什么,似乎存在一些混淆。不过我相信它不会是零。@Greg:重要的是11/2和13/2是完全可以表示的。例如,1000000000.5即使分母是2的幂,也不可表示。我甚至不知道浮点类型可以隐式转换为
bool
,但根据
[conv.bool]
规则,它们可以使用与整数相同的公式。@BenVoigt这证实了我正在搜索。好极了!
#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;
}