大多数 C 编译器都提供标准 C 库的一些变体。VisualDSP++ 编译器也不例外。但是,我最近遇到了一个场景,我需要取一个float
值,将其四舍五入到最接近的整数,然后将其转换为int
.
使用 C 的大多数变体相当容易,但在尝试使用后roundf
,我发现math.h
不包含该roundf
函数。
如何使用 VisualDSP++正确地将我的float
变量四舍五入到最接近的值?int
大多数 C 编译器都提供标准 C 库的一些变体。VisualDSP++ 编译器也不例外。但是,我最近遇到了一个场景,我需要取一个float
值,将其四舍五入到最接近的整数,然后将其转换为int
.
使用 C 的大多数变体相当容易,但在尝试使用后roundf
,我发现math.h
不包含该roundf
函数。
如何使用 VisualDSP++正确地将我的float
变量四舍五入到最接近的值?int
我不熟悉 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
它似乎在我测试的所有情况下都有效,包括底片。
我记得在 1999 年版的 ISO C 标准中添加了*f()
包括 在内的函数,以及在 s 上运行的函数。roundf
roundd
long double
您的declares很可能是在而不是. (C90 实际上没有任何、或,但您的实现可能会作为扩展提供。)(编辑:不,它没有。)<math.h>
round
double
float
round
roundf
roundl
round
未经测试的代码如下:
float x = 123.456;
int n = round(x);
round
接受一个double
论点;float
传递给它的参数将被隐式转换。然后将double
结果隐式转换为int
.
您可以通过添加强制转换使所有转换显式:
int n = (int)round((double)x);
但这只是混乱。
编辑:C89/C90 确实定义了floor
andceil
函数。如果round
不可用,用floor
. 细节取决于你想要做什么样的四舍五入。