【问题标题】:What does if( c == (int) c) mean?if( c == (int) c) 是什么意思?
【发布时间】:2021-09-12 07:24:39
【问题描述】:

这是毕达哥拉斯三元组的代码。有人可以在下面解释if 语句的工作原理吗?

int main()
{
    int a, b;
    float c;

    //calculate the another side using Pythagoras Theorem
    //a*a + b*b = c*c
    //c = sqrt(a*a+b*b)
    //maximum length should be equal to 30
    for(a=1;a<=30;a++)
    {
        for(b=1;b<=30;b++)
        {
            c = sqrt(a*a+b*b);
            if(c == (int)c)
            {
                printf("(%d, %d, %d)\n",a,b,(int)c);
            }
        }
    }
}

【问题讨论】:

  • if 语句只是检查浮点变量c 是否与其等效的整数相同(通过类型转换cint)。
  • 这是一个尝试检查sqrt的结果是否为整数,但是如果结果超出int类型范围,它将失败。
  • 一般来说,每当有人觉得需要进行 C 风格转换(如 (int) c)时,就应该将其视为出现问题的危险信号。
  • 所以我们要检查计算出的c是否是一个整数/整数?如果是,那么我们把它作为三角形的边。
  • @Someprogrammerdude 你能解释一下吗?

标签: c++ if-statement


【解决方案1】:

检查值是否为整数。 'c' 是一个浮点数,演员表会丢弃任何小数部分。然后根据该转换的结果检查“c”的原始值。如果它们匹配,则原始 c 是一个整数值(请注意,即使使用此强制转换,也有很多整数值将无法通过此测试,任何大于 std::numeric_limits::max() 的 'c' 值)

【讨论】:

【解决方案2】:

此 if 语句不必工作,因为处理器中的浮点(floatdouble 等)表示不同于整数(intchar 等)。因此,一般情况下,这种算子是错误的。

浮点数有时不可能精确地表示为整数(尤其是作为某种计算的结果)(请参阅wiki 和此question),并且整数始终可以精确地表示。

在您的情况下,使 if 语句正确的一种方法是这样编写:

if (fabs(c - roundf(c)) < eps) {
    ...
}

其中eps 是要求精度。例如,

float eps = 1e-12;  // 10^(-12)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2016-07-28
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多