![](/img/trans.png)
[英]How to reduce the running time for finding the last non-zero digit of factorial of a number?
[英]Round up a float number that has a non-zero decimal digit
我今天早些时候询问了大约一半的数字,并从@alk获得了很大的帮助。 在那篇文章中,我的想法是将4.5舍入为5,但将4.4舍入为4。@ alk提供的解决方案是:
int round_number(float x)
{
return x + 0.5;
}
而且效果非常优雅!
在本文中,我想讨论如何在C中实现ceil()
函数。与@alk提供的最后一个解决方案相同,我提出了以下内容:
int round_up(float y)
{
return y + 0.99999999;
}
这适用于所有情况,但浮点数y为.00000001时除外。 我想知道是否有更好的方法可以与C中的ceil()
相同。
除非您可靠地知道float的epsilon(我不确定标准C是否提供了该函数),否则我认为您会陷入return (y < 0 || y == (int)y) ? y : y + 1;
return (y < 0 || y == (int)y) ? y : y + 1;
对于负数,此操作将失败。
int round_up(float y) {
return y + 0.99999999;
}
但是,让我们利用它来发挥优势。 float
到int
转换将截断为0.0。 因此,负数正在执行“向上舍入”或“上限”功能。 当我们有一个正float
,请转换为int
注意这是一个“ floor”函数。 当y
不是整数时进行调整。
(假设y
INT_MIN ... INT_MAX
。)
int ceil(float y) {
if (y < 0) {
return y; // this does a ceiling function as y < 0.
}
int i = y; // this does a floor function as y >= 0.
if (i != y) i++;
return i;
}
void ceil_test(float y) {
printf("%f %d\n", y, ceil(y));
}
第一个代码段不能正确处理负数。 -3.5将是-3,而不是-4。 要正确舍入值
int round_number(float x)
{
if (x >= 0)
return x + 0.5f;
else
return x - 0.5f
}
即使那样,它对于2个值仍然是不正确的。 请参阅Math.round(0.49999999999999994)为什么返回1? 。 请注意,您需要使用f
后缀来获取float
文字,否则该操作将以double
精度进行,然后向下转换为float
对于上限,加1就足够了
int ceiling(float x)
{
if (x < 0 || (int)x == x)
return x;
else
return x + 1.0f;
}
当x是整数时,例如x = 3.0(或-3.0),则返回3(或-3)。 对于x = 3.1则返回4,对于x = -3.1则返回-3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.