C ++整数楼层函数

时间:2010-04-12 13:37:39

标签: c++ math

我想实现最大的整数函数。 [“最大整数函数”是quite standard name,也称为地板函数。]

int x = 5/3;

我的问题是,由于5/3会产生双倍的精度,因此会有更多的精确度吗?

编辑:最大整数函数是小于或等于X的整数。 例如:

4.5 = 4
4 = 4
3.2 = 3
3 = 3

我想知道的是5/3会产生双倍?因为如果是这样,我将在转换为int时失去精确度。

希望这是有道理的。

5 个答案:

答案 0 :(得分:6)

你将失去商的小数部分。所以是的,如果数字越大,您的相对精度就越高,例如与5000/3000相比。

但是,5 / 3将返回一个整数,而不是一个整数。为了强制它除以双倍,将被除分为static_cast<double>(5) / 3

答案 1 :(得分:3)

整数除法给出整数结果,因此5/3为1,5%3为2(余数运算符)。但是,这并不一定与负数相符。在最初的C ++标准中,-5 / 3可以是-1(向零舍入)或-2(向下舍入),但建议使用-1。在最新的C ++ 0B草案中(几乎肯定非常接近最终标准),它是-1,因此更多地涉及找到负数的底线。

答案 2 :(得分:2)

5/3将始终产生1(整数),如果你做5.0 / 3或5 / 3.0,结果将是双倍。

答案 3 :(得分:0)

因为在C和C ++中,正如其他人所说,/是整数除法,它将返回一个int。特别是,它将返回双重答案的底线...(C和C ++总是截断)所以,基本上5/3正是你想要的。

在负数中可能会有点奇怪,因为-5/3 =&gt; -2可能是你想要的也可能不是......

答案 4 :(得分:0)

据我所知,没有预定义的功能用于此目的。 可能有必要使用这样的函数,如果由于某种原因浮点计算是不可能的(例如int64_t具有比double可以表示的更高的精度而没有错误)

我们可以按如下方式定义此函数:

#include <cmath>

inline long
floordiv (long num, long den)
{
  if (0 < (num^den))
    return num/den;
  else
    {
      ldiv_t res = ldiv(num,den);
      return (res.rem)? res.quot-1 
                      : res.quot;
    }
}

这个想法是使用正常的整数divison,但调整负面结果以匹配double floor(double)函数的行为。不管零点的位置如何,该点总是截断到下一个较低的整数。如果打算创建大小均匀的间隔,这可能非常重要。

时序测量表明,与内置/运算符相比,此函数仅产生较小的开销,但当然基于浮点的floor函数明显更快....