C++整数向下取整函数

9

我想实现最大整数函数。[“最大整数函数”是对于也被称为“向下取整函数”的函数的相当 标准名称。]

int x = 5/3;

我的问题是,如果数字越大,那么精度是否会丢失,因为5/3会产生一个double类型的结果?
编辑:最大整数函数是小于或等于X的整数。例如:
4.5 = 4
4 = 4
3.2 = 3
3 = 3

我想知道5/3是否会生成一个双精度数?如果是这样,当转换为整数时,将会有精度损失。希望这样讲清楚了。

2
最大整数函数是什么? - Andrey
4
这是一个返回最大整数的函数!我相信最大的整数是1,000,001。 - James Kolpack
4
我认为最大的整数是42,或者也可能是4,711。 - unwind
4
“最大整数函数”是一个相当标准的名称,特别是在美国以外,而且在几十年前尤其常见。 - ShreevatsaR
你是想做类似于http://www.cplusplus.com/reference/clibrary/cmath/floor/的事情吗? - ereOn
显示剩余4条评论
5个回答

12
您将会失去商的小数部分。因此,是的,使用更大的数字可以获得更多的相对精度,例如与5000/3000相比。
然而,5/3将返回一个整数,而不是一个双精度数。要强制将其作为双精度数进行除法运算,请将被除数转换为static_cast<double>(5)/3

5

整数除法会得到整数结果,所以 5 / 3 是 1 且 5 % 3 是 2(余数运算符)。但是,这在负数情况下不一定成立。在最初的 C++ 标准中,-5 / 3 可能为 -1(朝零舍入)或 -2(向下取整),但推荐使用 -1。在最新的 C++0B 草案(几乎可以肯定非常接近于最终标准)中,结果为 -1,因此使用负数进行向下取整更加复杂。


3

如果你使用5/3进行计算,结果将始终为1(整数),如果你使用5.0/3或5/3.0进行计算,结果将为双精度数。


1
据我所知,这个目的没有预定义的函数。 如果由于某些原因浮点运算不可行(例如,int64_tdouble 更高精度而无法表示错误),可能需要使用此类函数。
我们可以定义此函数如下:
#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;
    }
}

这个想法是使用普通的整数除法,但调整负结果以匹配double floor(double)函数的行为。关键是始终向下截断到下一个较低的整数,而不考虑零点的位置。如果意图是创建均匀大小的间隔,则这可能非常重要。

定时测量表明,与内置的/运算符相比,此函数仅创建了很小的开销,但基于浮点的floor函数当然更快....


-1

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

在负数情况下可能会有些奇怪,比如-5/3 => -2,这可能是你想要的,也可能不是...


2
整数除法返回下取整是不正确的!(经常被忽视的)关键点在于如何处理负数。这里-9 / 4 == -2,但floor(-9.0/4) == -3.0。 - Ichthyo
实际上,-5/3得到的是-1,而不是floor。 - iPherian
不是用老式的C语言。在C语言中,(-5)/3=-2。也许在过去的20年里有所改变... - Brian Postow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接