Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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/C++;_C++_C_Floating Point_Comparison_Int - Fatal编程技术网

C++ 关于在C/C++;

C++ 关于在C/C++;,c++,c,floating-point,comparison,int,C++,C,Floating Point,Comparison,Int,我有以下代码(可以随意使用double更改浮点): 问题是: 在上述情况下,将ints上的算术运算结果与float进行比较有多安全 对于这种情况,是否需要(float)m_intValue1-(float)m_intValue2>m_floatValue 在C/C++标准中,我能找到一个确切的情况吗? 对于简单的情况,默认情况下将执行哪些类型转换m_intValue1-m_intValue2>m_floatValue?(我怎样才能以一种他也能(视觉上)看到的方式向其他人展示这一点,“仅仅相信它是

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

问题是:

  • 在上述情况下,将
    int
    s上的算术运算结果与
    float
    进行比较有多安全

  • 对于这种情况,是否需要
    (float)m_intValue1-(float)m_intValue2>m_floatValue

  • 在C/C++标准中,我能找到一个确切的情况吗?

  • 对于简单的情况,默认情况下将执行哪些类型转换
    m_intValue1-m_intValue2>m_floatValue
    ?(我怎样才能以一种他也能(视觉上)看到的方式向其他人展示这一点,“仅仅相信它是有效的”是不够的:)

  • 这取决于实际实现(即使用哪种编译器和哪种体系结构)。在具有32位
    int
    s和IEEE754二进制32
    float
    s的典型系统上,整数最多可表示为+-2^24浮点,因此不适用于所有可能值。因此,一般来说,这是不安全的,但是如果整数(或者在本例中是差!)和浮点的使用范围受到适当限制,则可能是安全的

  • 不!事实上,
    m_intValue1-m_intValue2>m_floatValue
    更好,因为在计算差分后会转换为float(请参见上文关于差分的注释)。您可以显式地编写
    static_cast(m_intValue1-m_intValue2)>m_floatValue
    ,但这不是必需的

  • 转换在C++标准的第4章(参见)中被覆盖。特别是4.9浮点积分转换,也请注意5§10“常用算术转换”,它也适用于比较。由于问题也标有C,在C标准(见)中,相应章节为6.3.1,尤其是6.3.1.4和6.3.1.8

  • 见第2条的答案。三,


  • 二进制操作中关于类型提升的常规规则适用。引用标准(第5章:表达)

    9.许多期望算术或枚举类型的操作数的二进制运算符会导致转换并产生 结果类型以类似的方式显示。目的是生成一个公共类型,它也是结果的类型

    此模式称为常规算术转换,其定义如下:

    如果任一操作数为作用域枚举类型(7.2),则不执行任何转换

    如果另一个操作数的类型不同,则表达式的格式不正确

    如果任一操作数为长双精度类型,则另一个操作数应转换为长双精度

    否则,如果任一操作数为双精度,则另一个操作数应转换为双精度

    否则,如果任一操作数为浮点,则另一个操作数应转换为浮点

    否则,应在两个操作数上执行积分提升(4.5)


    这显然不是C。@ciphermagi只要删除
    ,它就会被删除。我更感兴趣的是背后的理论。忽略类和布尔运算符,可以在C中设置类似于上述内容的内容,但是您本质上是在问,如果(2>2.5)找到了文章,那么编写
    代码是否“安全”。这可能对您有所帮助。要生成有效的C,仅删除
    是不够的。至少需要删除
    public:
    private:
    并重新排序代码。如果帖子是关于C+C++,发布一个例子,这两个工作-这使得它更容易在许多观众的问题。此外,还有一些微妙的语言规范可能会对两种不同的答案产生影响,因此完整的答案需要对两种语言都有深刻的理解。这限制了能够做出回应的人的数量,并且可能超出您的需要。
    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!
    }