Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中实现平均值的最简单方法_C++_Rounding - Fatal编程技术网

在C++中实现平均值的最简单方法

在C++中实现平均值的最简单方法,c++,rounding,C++,Rounding,在这段代码中,如果a和b都是偶数,那么就没有问题了。但如果其中一个是奇数示例2,那么答案将为+0.5。我想把它收起来 例1 a=4,b=10 c=7,这没问题 例2 a=3,b=4 c=3.5 我希望c向上取整,变成4。最简单的方法是在结果之后使用+1,如果结果不是ceil函数默认为您所做的四舍五入 int a, b, c = 0; c = (a+b)/2; 演示:使用该功能。无论您在其中输入什么数字,它都会对其进行取整。最简单的方法是从中使用函数 首先,将c设为双精度,然后使用 c=a+b/

在这段代码中,如果a和b都是偶数,那么就没有问题了。但如果其中一个是奇数示例2,那么答案将为+0.5。我想把它收起来

例1

a=4,b=10

c=7,这没问题

例2

a=3,b=4

c=3.5
我希望c向上取整,变成4。

最简单的方法是在结果之后使用+1,如果结果不是ceil函数默认为您所做的四舍五入

int a, b, c = 0;
c = (a+b)/2;

演示:

使用该功能。无论您在其中输入什么数字,它都会对其进行取整。

最简单的方法是从中使用函数

首先,将c设为双精度,然后使用

c=a+b/2.0

否则,由于整数的除法被转换为整数,所以会有截断。这样,a+b/2.0是一个双精度,因为分母是双精度的,所以不会有任何截断

接下来,使用C++11中的函数std::round或std::floor/std::ceil,具体取决于您想要什么

或者,可以保留c和int,但不保留

如果不需要任何警告,还可以显式地将std::floor/std::ceil/std::round的结果转换回int,如

首先,你错了。c是一个整数,所以它不能是3.5。此外,a、b和2都是整数,所以除法是整数除法,所以也不能得到3.5。它将四舍五入到零,因此它将是3


这就是说,要将整数除以2进行向上取整而不是向下取整,只需在除法之前加1即可。14+1/2==7,所以仍然正确。7+1/2==4,这也是正确的。

如果要这样做,那么他的第一个示例将给出8的结果,这是不正确的。尝试的修复仍然无法修复问题;你想要的是+b%2,而不是+2/2%2。这说明太多的代码只会带来bug。而你最近的编辑是不正确的,这不是ceil所做的。@wolfPack88@Sebastian Redl你说得对,我在蹒跚而行here@Vinzenz测试驱动开发——在这种情况下,测试就是这里的反馈-仅供参考:int a,b,c=0;仅初始化c,而不是a或b。另外需要注意的是:c不能是3.5,因为你在做整数除法,而且c也是一个整数。在链接示例中,它显示了round、floor、ceil和trun函数之间的差异。请看一看示例,并根据您的需要使用该函数。不过,ceil仅适用于浮点运算。整数运算根本不受ceil的影响,但它将返回double或float,而不是int.Downvoter?添加了int类型。请指定错误。这不起作用,因为a+b/2将转换为int。您需要执行a+b/2.0,以获得双精度,然后使用ceilEdited。添加了float cast。值得注意的是,这也可以扩展到一般情况。只需在除法之前将除数-1加到结果中,就可以获得整数算术中ciel运算的效果,而不会产生两次相同运算以及模运算的开销。如果你投反对票,请说明原因。解决方案冗长,不会增加任何重大开销,而且是正确的。虽然您的答案在技术上是正确的,但它违反了一些基本的最佳实践。如果可能,应始终避免将整数转换为浮点。虽然开销很小,但它仍然存在,值得注意。此外,在浮动领域中可能会出现许多意想不到的问题。在极端情况下,浮点值会失去其值的粒度,并可能导致意外问题,尤其是当增量值变大时。@Kaslai在我看来,这完全是胡说八道。上面的函数经过了非常好的测试,很可能像Sebastian所写的那样在内部实现。我们这里不讨论数值分析,你关心进动等,但我们讨论一个简单的取整问题。在这里使用double是没有危险的,我打赌函数甚至是内联的,所以你的开销几乎是零,如果不是零的话。但是注意潜在的问题很重要。对于32位浮点,任何大于2^23的值都无法使用此技术进行正确的四舍五入,而64位浮点将在2^52处失败。如果你在处理这样的数字,这可能是一个严重的问题,这不一定超出了常用的范围。特别是在金融应用中,这样的事情会造成严重的损害。我并不是说这个问题需要100%的准确率,但是记下这些事情是非常重要的。@Kaslai,我同意有一些问题,但是当你确实需要关心它们的时候,你应该关心它们。我不确定我是否理解使用32位浮点,任何大于2^23的值都无法使用此技术正确地进行取整。有int+int转换为double,所以这里唯一的问题是int overf
c = static_cast<int>(std::round( (a + b) / 2.0 )); // now we tell the compiler we know what we're doing
lowing,也可以出现在a+b+1技巧中。
int a, b, c = 0;
c = (int) ceil((float)(a+b)/2);
c = std::round( (a + b) / 2.0 ); // rounding to nearest integer, C++11
c = std::floor( (a + b) / 2.0 ); // rounding down
c = std::ceil( (a + b) / 2.0 ); // rounding up
c = static_cast<int>(std::round( (a + b) / 2.0 )); // now we tell the compiler we know what we're doing
int a, b, c = 0;
c = (a+b+1)/2;