奇怪的条件语句(结果相同)

Weird conditional statement (same result)

本文关键字:结果 语句 条件      更新时间:2023-10-16

通过一些代码,我发现:

#ifdef trunc
# undef trunc
#endif
inline float trunc(float x)
{
    return (x < 0.0f) ? float(int(x)) : float(int(x));
}
inline double trunc(double x)
{
    return (x < 0.0f) ? double(int(x)) : double(int(x));
}
inline long double trunc(long double x)
{
    return (x < 0.0f) ? (long double)(int(x)) : (long double)(int(x));
}
#endif // _WIN32

当然,?:运算符在每种情况下总是返回一个相同的值,而不管其条件表达式如何。另一方面,我想作者有理由这样写这些函数;不过我找不到。知道吗?这只是一个错误(打字错误)吗?

[EDIT]作者回复:

好的一点-这只是从round()。以下内容应该很好(除了int的范围):

inline float trunc(float x)
{
    return float(int(x));
}
inline double trunc(double x)
{
    return double(int(x));
}
inline long double trunc(long double x)
{
    return (long double)(int(x));
}

这段代码看起来是错误的。

我的猜测是,他们的意思是更像这样:

inline float trunc(float x)
{
    return (x < 0.0f) ? -float(int(-x)) : float(int(x));
}

但即便如此也令人怀疑。我相信int(x)总是执行截断,所以即使这样?:的两个分支也应该产生相同的结果。

如果舍入模式对typecast有影响(经过思考,我不确定它是否有影响),您可能真的想使用modfmodffmodfl这样的函数将数字分解为整数和小数部分,并丢弃小数部分。

例如:

inline float trunc(float x)
{
    float int_part;
    modf(x, &int_part);
    return int_part;
}

编辑:另一个观察。对于不适合int的值,原始代码将失败。又一次打击。

代码为这两个条件返回相同的输出。这只是一个冗余,而且float(int(x))也没有什么意义。因为int(x)将数字转换为整数,所以再次将其转换为浮点或双精度并没有什么区别,只是返回变量的类型不同。