大多数C编译器都提供标准C库的一些变体。 VisualDSP ++编译器也不例外。但是,我最近遇到了一个场景,我需要取一个float
值,将其四舍五入到最接近的整数,然后将其转换为int
。
使用C的大多数变体相当容易,但在尝试使用roundf
后,我发现math.h
不包含roundf
函数。
如何使用VisualDSP ++将float
变量正确舍入到最接近的int
值?
答案 0 :(得分:4)
我不熟悉VisualDSP,但您可以将浮点数舍入为整数:
float number = 3.14;
int rounded = (int)(number + (number > 0 ? 1 : -1) * 0.5);
所以,你可以为此编写自己的函数:
int roundFloatToInt(float number)
{
return (int)(number + (number > 0 ? 1 : -1) * 0.5);
}
以上为给定输入输出以下内容:
roundFloatToInt(0.10) --> 0
roundFloatToInt(3.14) --> 3
roundFloatToInt(3.54) --> 4
它似乎适用于我测试的所有案例,包括否定。
答案 1 :(得分:1)
我记得,*f()
函数(包括roundf
)添加了1999版ISO C标准,以及roundd
函数。 }}第
你的long double
声明<math.h>
可能可能,它在round
而不是double
上运行。 (C90实际上没有float
,round
或roundf
,但您的实现可能提供roundl
作为扩展名。) (编辑:不,它没有。)
未经测试的代码如下:
round
float x = 123.456;
int n = round(x);
需要round
个参数;传递给它的double
参数将被隐式转换。然后,float
结果会隐式转换为double
。
您可以通过添加强制转换来显示所有转化:
int
但那只是一团糟。
编辑:C89 / C90确实定义了int n = (int)round((double)x);
和floor
函数。如果ceil
不可用,则根据round
来定义它应该不难。细节取决于你想要做什么样的舍入。