如何根据当前舍入方向将float转换为int?

问题描述 投票:0回答:2

如何根据当前舍入方向将

float
转换为
int

lrint
llrint
功能(C11,7.12.9.5)。但是,它们的返回值具有类型
long int
long long int
。为什么没有
int
的版本?

c exception floating-point type-conversion rounding
2个回答
1
投票

也许是因为

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;
}

0
投票

如何根据当前舍入方向将

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()
。我怀疑是出于类似的原因。
请参阅为什么 stdlib.h 中没有 strtoi?

© www.soinside.com 2019 - 2024. All rights reserved.