是否有类似MATLAB圆函数的C舍入函数?

时间:2010-08-30 13:24:59

标签: c matlab rounding

我需要一个C舍入函数来舍入像MATLAB的舍入函数这样的数字。有吗?如果您不知道MATLAB的圆函数如何工作,请参阅以下链接:

MATLAB round function

我在想我可能只是编写自己的简单圆函数来匹配MATLAB的功能。

谢谢,

DemiSheep

6 个答案:

答案 0 :(得分:7)

这听起来类似于math.h的round()函数

  

这些功能应围绕他们的   参数为最接近的整数值   以浮点格式,舍入   中途远离零的情况,   无论目前的四舍五入   方向。

还有lrint()给你一个int返回值,虽然lrint()和朋友服从当前的舍入方向 - 你必须使用fesetround()来设置它找到舍入方向here

答案 1 :(得分:3)

不,C(在C99之前)没有round功能。典型的方法是这样的:

double sign(double x) { 
    if (x < 0.0)
        return -1.0;
    return 1.0;
}

double round(double x) { 
    return (long long)x + 0.5 * sign(x);
}

这会舍入为整数,假设原始数字位于可由long long表示的范围内。如果你想要在小数点后舍入到特定数量的位置,那可能会有点困难。如果数字不是太大或太小,你可以乘以10 N ,舍入为整数,并再次除以10 N (请记住这一点可能会引入一些自己的舍入错误。)

答案 2 :(得分:3)

查看标准标题<fenv.c>,特别是fesetround()函数和四个宏FE_DOWNWARDFE_TOWARDZEROFE_TONEARESTFE_UPWARD。它控制浮点值如何舍入为整数。确保您的实现(即C编译器/ C库)实际支持这一点(通过检查fesetround()的返回值和实现文档)。

尊重这些设置的功能包括(来自<math.h>):

  • llrint()
  • llrintf()
  • llrintl()
  • lrint()
  • lrintf()
  • lrintl()
  • rint()
  • rintf()
  • rintl()
  • llround()
  • llroundf()
  • llroundl()
  • lround()
  • lroundf()
  • lroundl()
  • nearbyint()
  • nearbyintf()
  • nearbyintl()

取决于您的需求(参数类型和返回类型,有或没有不精确的浮点异常)。

注意round()roundf()roundl() 就像它们属于上面的列表一样,但这三个做尊重fesetround() !!

设置的舍入模式

有关详细信息,请参阅您最喜欢的标准库文档。

答案 3 :(得分:2)

如果标准库中没有round()函数,如果处理浮点数,您可以随意评估每个值,分析要舍入到的位置后面的数字。 ,检查它是否更大,等于或小于5;然后,如果该值小于5,您可以floor()您最终查看的数字。如果您要舍入的位置之后的数字值为5或更大,则可以继续使用函数floor()评估该数字,然后添加1.

我为与此相关的任何低效率道歉。

答案 4 :(得分:1)

如果我没弄错,你正在找floor and ceil之类的东西,你会在<math.h>找到它们

答案 5 :(得分:0)

文档指定

  

Y = round(X)将X的元素舍入到最接近的整数。

不是复数:根据常规MATLAB操作,它对矩阵的所有元素进行操作。上面公布的C等价物只能同时处理单个值。 如果您可以使用C ++,请查看Valarray。如果没有,那么好的'for循环就是你的朋友。