0

大多数 C 编译器都提供标准 C 库的一些变体。VisualDSP++ 编译器也不例外。但是,我最近遇到了一个场景,我需要取一个float值,将其四舍五入到最接近的整数,然后将其转换为int.

使用 C 的大多数变体相当容易,但在尝试使用后roundf,我发现math.h不包含该roundf函数。

如何使用 VisualDSP++正确地将我的float变量四舍五入到最接近的值?int

4

2 回答 2

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

它似乎在我测试的所有情况下都有效,包括底片。

于 2013-06-19T18:37:26.170 回答
1

我记得在 1999 年版的 ISO C 标准中添加了*f()包括 在内的函数,以及在 s 上运行的函数。roundfrounddlong double

您的declares可能是在而不是. (C90 实际上没有任何、或,但您的实现可能会作为扩展提供。)(编辑:不,它没有。)<math.h>rounddoublefloatroundroundfroundlround

未经测试的代码如下:

float x = 123.456;
int n = round(x);

round接受一个double论点;float传递给它的参数将被隐式转换。然后将double结果隐式转换为int.

可以通过添加强制转换使所有转换显式:

int n = (int)round((double)x);

但这只是混乱。

编辑:C89/C90 确实定义了floorandceil函数。如果round不可用,用floor. 细节取决于你想要做什么样的四舍五入。

于 2013-06-19T18:38:21.683 回答