是否有一个类似MATLAB的C舍入函数';s圆函数?
我需要一个C舍入函数,它像MATLAB的舍入函数一样舍入数字。有吗?如果您不知道MATLAB的round函数是如何工作的,请参见以下链接: 我在想,我可以编写自己的简单的圆函数来匹配MATLAB的功能 谢谢 DemiSheep否,C(C99之前)没有是否有一个类似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
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