2010-04-12 71 views
5

我想实现最大整数函数。 [“最伟大的整数函数”是quitestandard name什么也被称为地板功能。]C++整数下限函数

int x = 5/3; 

我的问题是有更大的数字可能会有精度的损失为5/3会产生一个双?

编辑:最大整数函数整数小于或等于X 例:

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

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

希望这是有道理的。

+2

什么是最大整数函数? – Andrey 2010-04-12 13:40:09

+0

请注意,在C和C++中,作用于整数的'/'运算符总是返回一个整数结果。除此之外,我认为你需要更具体地说明你想要的东西---你的函数是否会返回最大的整数**少于一个给定的数字?这个数字会有什么类型?如果它是'float'或'double',无论如何你都会失去精度。如果它是一个自制类型,可以模拟**理性**数字,则可以避免精度损失。 – Pillsy 2010-04-12 13:42:28

+4

这是一个返回*最大*整数的函数!我相信最大的一个是1,000,001 – 2010-04-12 13:43:12

回答

5

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

但是,5/3将返回一个整数,而不是double。为了强制它分成两倍,请注明股息为(double)5/3

+0

感谢所有我需要知道的。 – Thomas 2010-04-12 13:51:55

1

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

0

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

它可能会在底片有点怪异作为-5/3 => -2这可能是也可能不是你想要的...

+4

但是,如果你很聪明,你可以使用底片来实现整数'ceil()'...... – 2010-04-12 13:54:08

+0

这是真的。 – 2010-04-12 15:10:06

+1

整数除法返回地板是**不是**! (经常被忽视的)关键点是如何处理* negative *数字。这里-9/4 == -2但是地板(-9.0/4)== -3.0 – Ichthyo 2011-01-08 19:46:21

2

整数除法给出整数结果,所以5/3为1, 5%3是2(其余操作员)。但是,这不一定适用于负数。在最初的C++标准中,-5/3可以是-1(向零舍入)或-2(楼层),但建议使用-1。在最新的C++ 0B草案中(几乎可以肯定非常接近最终标准),它是-1,因此找到负数的底板更为重要。

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; 
    } 
} 

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

定时测量结果表明,这里该功能只创建与内置/运营商,但当然,基于浮点floor功能比较小的开销是显著快....