c++ - 将双变量视为 bool 值

标签 c++

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

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

    OR

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

最佳答案

第二个通常更好(更明确地说明你在做什么)。不过,我通常更喜欢 if (a_double == 0.0)。另请注意,对于 float ,进行近似比较通常很有用,以解决计算中四舍五入的可能性(尽管做得好可能很重要)。

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

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

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

还有一些计算机使用十六进制 float 和/或十进制 float 。对于我们在这里考虑的内容,十六进制 float 与二进制 float 本质上是相同的(即,由于 16 是 2 的幂,如果分母是 2 的幂之和,它仍然只能精确表示分数)。十进制 float 允许精确表示分母也包括 5 的幂的数字(例如,1.2 可以用十进制 float 精确表示,但不能用二进制或十六进制 float 表示)。这具有明显的优势(同样,在其范围和精度的限制内)您输入的任何十进制数都将被精确表示。

关于c++ - 将双变量视为 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020582/

相关文章:

c++ - CWinApp dll 文件给出 CWinApp 类的概率

c++ - CUDA 和 C++ 函数问题 (Visual Studio 2013)

c# - 将外部依赖项添加到 C++ DLL 文件

c++ - 为什么在 std::vector 的初始化列表中调用复制构造函数?

c++ - 检查堆栈是否是回文

c++ - 如何打印 vector 中整数值的范围

c++ - 段错误 : Dynamically allocating large integer array

C++ valgrind : Conditional jump or move depends on uninitialised value(s) don't know what to initialize

c++ - 我可以直接继承实现来满足 C++ 中的接口(interface)吗

c++ - 客户端套接字可绑定(bind)但不可连接,因为已在使用中