ceil 和 floor 之间的奇怪相等
Posted
技术标签:
【中文标题】ceil 和 floor 之间的奇怪相等【英文标题】:Strange equality between ceil and floor 【发布时间】:2015-08-23 00:00:09 【问题描述】:我正在将我的解决方案与另一个解决方案进行比较,发现这条不同的线一开始似乎并不相等,但它们确实如此。
所以我的问题是:这种平等怎么可能?
ceil(k / x) - 1 == floor((k - 1) / x)
【问题讨论】:
看起来像作业。不公平 我认为大多数现代编译器已经可以将此标记为错误。至少 g++ 带有 XCode(基于 LLVM)就可以了 我认为他在问一个数学问题。从编程的角度来看,问题是,如果一个说ceil(k/x)-1
而另一个说floor((k-1)/x)
,为什么两个程序会产生相同的结果。他并没有试图将上述内容作为声明放在他的代码中。
【参考方案1】:
这里我假设 x 是一个正整数。
有两种情况需要考虑:k 是 x 的倍数,或者不是。
当k是x的倍数时,则ceil(k/x) = k/x 因为 k/x 是一个整数。另外,由于 (k-1)/x k/x 和 k/x 是一个整数,这意味着 floor((k-1)/x) 将是下一个较小的整数,即 k/x-1,等于 ceil(k/x)-1。
当k不是x的倍数时,则ceil(k/x)是k/x 向上取整到下一个整数,而 floor(k/x) 为 k em>/x 向下舍入到下一个较小的整数。显然,ceil(k/x) - 1 = floor(k/x)。而且由于k不是x的倍数,很明显(k-1/x)和k/x 在向下舍入到下一个较小的整数时将给出相同的结果;因此,ceil(k/x) - 1 = floor(k/x) = floor((k-1)/x)。
因此,这两种情况下的关系都是正确的。
如果x
或k
可以是非整数,则不正确:例如尝试k=3, x=.01。现在 ceil(k/x) = 300, floor((k-1)/x) = 200 . 或者试试 k=4.1, x=2: ceil(k/x) = 3, floor( (k-1)/x) = 1。
[注意:我知道这在数学上并不严谨。]
【讨论】:
你的证明是正确的。随意删除免责声明。以上是关于ceil 和 floor 之间的奇怪相等的主要内容,如果未能解决你的问题,请参考以下文章
gcc 的奇怪行为。带有 和 = 的 C++ 对象定义是不是相等?
Math对象(min()-max()-ceil()-floor()-round()和abs())