是否有一个类似MATLAB的C舍入函数';s圆函数?

是否有一个类似MATLAB的C舍入函数';s圆函数?,c,matlab,rounding,C,Matlab,Rounding,我需要一个C舍入函数,它像MATLAB的舍入函数一样舍入数字。有吗?如果您不知道MATLAB的round函数是如何工作的,请参见以下链接: 我在想,我可以编写自己的简单的圆函数来匹配MATLAB的功能 谢谢 DemiSheep否,C(C99之前)没有round功能。典型的方法如下所示: double sign(double x) { if (x < 0.0) return -1.0; return 1.0; } double round(double

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

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

谢谢

DemiSheep

否,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);
}
双符号(双x){
if(x<0.0)
回报率-1.0;
返回1.0;
}
双圆(双x){
返回(长)x+0.5*符号(x);
}

假设原始数字在可以用
long
表示的范围内,则这将舍入为整数。如果您想在小数点后四舍五入到特定的位数,这可能会有点困难。如果数字不是太大或太小,可以乘以10N,四舍五入为整数,然后再除以10N(请记住,这可能会导致自身的舍入错误)。

这听起来类似于math.h中的函数

这些职能应围绕其职能展开 参数设置为最接近的整数值 在浮点格式中,舍入 离零还有一半的距离, 不考虑当前舍入 方向


还有一个()给你一个int返回值,尽管lrint()和friends遵循当前的舍入方向-你必须使用()来设置它,可以找到不同的舍入方向。

如果我没有弄错的话,您正在查找类似的内容,您可以在
中找到它们,查看标准标题
,特别是
fesetround()
函数和四个宏
FE\u down
FE\u downzero
FE\u TONEAREST
FE\u up
。这控制浮点值如何舍入为整数。确保您的实现(即C编译器/C库)确实支持这一点(通过检查
fesetround()
的返回值和实现的文档)

符合这些设置的功能包括(来自
):

  • llrint()
  • llrintf()
  • llrintl()
  • lrint()
  • lrintf()
  • lrintl()
  • rint()
  • rintf()
  • rintl()
  • llround()
  • llroundf()
  • llroundl()
  • lrund()
  • lrundf()
  • lroundl()
  • nearbyint()
  • nearbyintf()
  • nearbyintl()
根据您的需要(参数类型和返回类型,带或不带不精确浮点异常)

注意
round()
roundf()
roundl()
看起来确实属于上面的列表,但这三个不符合
fesetround()设置的舍入模式。


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

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


我为与此相关的任何低效表示歉意

文档指定了

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


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

为什么你不能自己写这样一个呢?因为你没有自己写标准库提供的东西。+1对于一个看似简单的问题,它产生了很多好的答案。呃。。。C确实有一个round()函数。C(至少c99)当然有round/roundf/roundl-以及lrint/llrint和类似的函数。c99有,但C89/90肯定没有。考虑到仍在C89/90上的实现的数量,知道如何自己实现仍然非常有用。唉,乡绅,时间已经过去了。当有人问C问题时,我想他指的是一个中途更新的实现。基于实际实现,假设任何人都在使用C99是非常愚蠢的。两个“大2”(Gnu和微软)都没有接近于完全遵守C99。pcc几乎实现了所有新的C99功能,但仍然缺少许多关键的C89/90功能,这一点很矛盾。C99的唯一合理完整的实现是Comeau和Dinkumware的C99库。我已经使用Comeau多年了,但我很清楚其他人是多么的少。嗯,
round()
也遵循
fesetround()
,以及许多其他函数,它们涵盖了参数和返回类型的任意组合
round()
仅在sofar中是特殊的,因为它是束中唯一没有附加或前置“l”或“f”的函数……文档明确声明round/roundf/roundl不关心当前的舍入方向。没有f或l后缀的数学函数通常以双精度作为参数。谢谢,我错过了那个小细节(round/roundf/roundl不尊重设置。)我正在考虑这样做。如果该值大于0.5