如何根据当前舍入方向将
float
转换为int
?
有
lrint
和 llrint
功能(C11,7.12.9.5)。但是,它们的返回值具有类型 long int
和 long long int
。为什么没有int
的版本?
也许是因为
int
非常小,你可以轻松地自己编写这样的函数。
int irint(double x)
{
#if (LONG_MAX > INT_MAX && LONG_MIN < INT_MIN)
long result = lrint(x);
#else
long long result = llrint(x);
#endif
if(result > INT_MAX || result < INT_MIN)
{
feraiseexcept(FE_INVALID);
return 0;
}
return (int)result;
}
如何根据当前舍入方向将
转换为float
?int
创建一个调用
lrintf()
的辅助函数,并根据 C 规范添加所需的错误处理:“如果舍入值超出返回类型的范围,则数字结果未指定,并且可能会发生域错误或范围错误。”。 irintf()
,以防稍后出现。
#incldue <errno.h>
#include <limits.h>
int my_irintf(float x) {
long y = lrinf(x);
#if LONG_MAX > INT_MAX || LONG_MIN < INT_MIN
// Add desired error handling here.
// Example
if (y > INT_MAX || y < INT_MIN) {
errno = ERANGE;
y = (y > INT_MAX) ? INT_MAX : INT_MIN;
}
#endif
return (int) y;
}
为什么没有
的版本?int
标准库中也不存在
strtoi()
。我怀疑是出于类似的原因。