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 是一个正整数。

有两种情况需要考虑:kx 的倍数,或者不是。

kx的倍数时,则ceil(k/x) = k/x 因为 k/x 是一个整数。另外,由于 (k-1)/x k/xk/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)。

因此,这两种情况下的关系都是正确的。

如果xk 可以是非整数,则不正确:例如尝试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 之间的奇怪相等的主要内容,如果未能解决你的问题,请参考以下文章

MySQL函数—数学函数

gcc 的奇怪行为。带有 和 = 的 C++ 对象定义是不是相等?

Math对象(min()-max()-ceil()-floor()-round()和abs())

sql中round(),floor(),ceiling()函数的用法和区别分别是啥?

SQLServer CEILING函数和 FLOOR函数

Math.Floor() 和 Math.Truncate() 之间的区别