C中舍入函数的实现

时间:2018-10-06 06:27:53

标签: c

请问这是实现ceil函数的函数,它工作正常,我想问一下从分母中减去-1的逻辑是什么?
我是编程新手 请帮助

int checkceil(int numerator,int denominator){

    return (numerator+denominator-1)/denominator;
}

2 个答案:

答案 0 :(得分:2)

分子 n 的形式为n = a * d + b,其中 b 是n / d的余数。根据定义,其余部分小于 d

在C中,n / d的除法返回 a 的整数部分。当 b == 0时,只能将 d-1 加到 n 以获得相同的结果(a d + 0) / d ==(a d + d-1)/ d。对于所有其他余数0<b<d,该除法返回下一个整数a + 1,即上限。

答案 1 :(得分:2)

由于将两个整数ab相除将始终floor(截断)结果,因此我们需要找到一些d(delta),使得{{1} }。

我们如何找到floor(d + a/b) == ceil (a/b)?这样想吧:
d,除非ceil(a/b) > floor(a/b)是整数。因此,除非(a/b)是整数,否则我们想通过添加(a/b)来使(a/b)碰到(或超过)下一个整数。这样d将等于floor(a/b + d)。我们希望找到ceil(a/b),以便对于整数,它不会完全将它们推到下一个整数,但对于非整数,它将是。

那么d多少就足够了?

因此,假设d不是整数,我们可以得到的最小剩余数为(a/b)。因此,为了使(1/b)碰到下一个整数,只需加上(a/b)就可以了。该值小于1,在d = 1 - (1/b)是整数的情况下不会将(a/b)撞到下一个整数,但在{的情况下,仍足以将(a/b)撞到下一个整数{1}}不是整数。

总结起来,我们知道将(a/b)添加到(a/b)将实现相等:
d = 1 - (1/b)。这样我们得到:

(a/b)

用代码编写时,将是:

floor(a/b + d) = ceil(a/b)