2

通过一些代码,我发现了这个:

#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

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

[编辑] 作者回复:

好点 - 这只是从 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));
}
4

2 回答 2

5

这段代码看起来不对。

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

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

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

如果舍入模式对类型转换确实很重要(经过片刻的思考,我不确定它是否确实如此),您可能真的想使用类似的函数modfmodff或者modfl将数字分解为整数和小数部分,并丢弃小数部分。

例如:

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

编辑:另一个观察。对于不适合int. 又一次打击它。

于 2013-08-09T15:06:41.963 回答
0

代码为这两个条件返回相同的输出。这只是一个冗余,而且,这float(int(x))没有任何意义。因为int(x)将数字转换为整数,所以再次将其转换为 float 或 double 没有区别,但只有返回的变量的类型。

于 2013-08-09T15:03:50.137 回答