c++ - 关于在 C/C++ 中比较整数和 float / double

标签 c++ c floating-point comparison int

我有以下代码(可以随意用 double 更改 float):

class A
{
    public:
        void setValueFloat(float v) {
              m_floatValue = v / 3.6;  // m/s <-> km/h conversion
        }
        void setValueInt(int v1, int v2) { 
              m_intValue1 = v1; m_intValue2 = v2;
        }

        bool conditionIsOk()
        {
             if(m_intValue1 > m_intValue2)
             {
                  if(m_intValue1 - m_intValue2 > m_floatValue)
                  {
                      return true;
                  }
             }
             return false;
        }

    private:
        int m_intValue1, m_intValue2;
        float m_floatValue;

};

还有其他地方:

A a;
int something = 5; // Intentionally int
int somethingElse = 6; //these are just some numbers, not production data!!!
int moreStuff = 7;

a.setValueFloat(something);
a.setValueInt(somethingElse, moreStuff);
if(a.conditionIsOk())
{
   // Yippee!
}

还有问题:

  1. 在上述情况下,将 int 的算术运算结果与 float 的算术运算结果进行比较是否安全?

  2. 对于这种情况,是否有必要 (float)m_intValue1 - (float)m_intValue2 > m_floatValue

  3. 在 C/C++ 标准中的什么地方可以找到关于这种情况的一行?

  4. 对于简单情况 m_intValue1 - m_intValue2 > m_floatValue,默认情况下会进行哪些类型转换? (以及我如何才能以一种他也(在视觉上)看到它的方式向其他人展示它,“仅仅相信它有效”是不够的:))

最佳答案

  1. 这取决于实际的实现(即使用哪个编译器和哪个架构)。在具有 32 位 int 的典型系统上s 和 IEEE754 binary32 float s 整数可以精确地表示为 float +-2^24,所以不是所有可能值的范围。所以不,它通常不安全,但如果适当限制整数(或在本例中为差值!)和 float 的使用范围,则可能是安全的。

  2. 不!事实上m_intValue1 - m_intValue2 > m_floatValue更好,因为转换为 float 是在计算差异之后发生的(请参阅上面关于差异的注释)。你可以明确地写 static_cast<float>(m_intValue1 - m_intValue2) > m_floatValue ,但这不是必需的。

  3. 转换在 C++ 标准的第 4 章中介绍(参见 draft N3242)。特别是 4.9 浮点整数转换,还要注意 5§10“通常的算术转换”,它也适用于比较。由于问题也用 C 标记,在 C 标准中(参见 darft N1570)相应的部分是 6.3.1,特别是 6.3.1.4 和 6.3.1.8。

  4. 查看 2. 和 3. 的答案

关于c++ - 关于在 C/C++ 中比较整数和 float / double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22143032/

相关文章:

PHP 扩展 : can not update class field using zend_hash_update

c - 结构中指针的分配不起作用,为什么值没有改变?

c++ - 用于在整个文件系统中搜索文件的 POSIX 程序

c++ - 将数组转换为编码字符串

c++ - 什么构造函数被调用,它不是移动

除非我使用完整路径,否则无法在 Ruby C 扩展中使用 Gems

floating-point - 通过浮点计算将浮点转换为十进制

java - double 的输出是怎么回事?

python - Decimal Python 与 float 运行时

c++ - 使用 OpenSSL 实现密文窃取