我想实现最大的整数函数。 [“最大整数函数”是quite standard name,也称为地板函数。]
int x = 5/3;
我的问题是,由于5/3会产生双倍的精度,因此会有更多的精确度吗?
编辑:最大整数函数是小于或等于X的整数。 例如:
4.5 = 4
4 = 4
3.2 = 3
3 = 3
我想知道的是5/3会产生双倍?因为如果是这样,我将在转换为int时失去精确度。
希望这是有道理的。
答案 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
函数明显更快....