我想实现最大整数函数。 [“最伟大的整数函数”是quitestandard name什么也被称为地板功能。]C++整数下限函数
int x = 5/3;
我的问题是有更大的数字可能会有精度的损失为5/3会产生一个双?
编辑:最大整数函数整数小于或等于X 例:
4.5 = 4
4 = 4
3.2 = 3
3 = 3
我想知道的是5/3会产生一个双?因为如果是的话,我将在转换为int时失去精度。
希望这是有道理的。
我想实现最大整数函数。 [“最伟大的整数函数”是quitestandard name什么也被称为地板功能。]C++整数下限函数
int x = 5/3;
我的问题是有更大的数字可能会有精度的损失为5/3会产生一个双?
编辑:最大整数函数整数小于或等于X 例:
4.5 = 4
4 = 4
3.2 = 3
3 = 3
我想知道的是5/3会产生一个双?因为如果是的话,我将在转换为int时失去精度。
希望这是有道理的。
您将失去商的小数部分。所以是的,数量越多,您的相对精度就越高,如与5000/3000
相比。
但是,5/3
将返回一个整数,而不是double。为了强制它分成两倍,请注明股息为(double)5/3
。
感谢所有我需要知道的。 – Thomas 2010-04-12 13:51:55
5/3总是会产生1(整数),如果你做5.0/3或5/3.0,结果将是双倍的。
由于在C和C++中,正如其他人所说,/是整数除法,它将返回一个int。特别是,它会返回双重答案的底线......(C和C++总是截断)所以,基本上5/3正是你想要的。
它可能会在底片有点怪异作为-5/3 => -2这可能是也可能不是你想要的...
但是,如果你很聪明,你可以使用底片来实现整数'ceil()'...... – 2010-04-12 13:54:08
这是真的。 – 2010-04-12 15:10:06
整数除法返回地板是**不是**! (经常被忽视的)关键点是如何处理* negative *数字。这里-9/4 == -2但是地板(-9.0/4)== -3.0 – Ichthyo 2011-01-08 19:46:21
整数除法给出整数结果,所以5/3为1, 5%3是2(其余操作员)。但是,这不一定适用于负数。在最初的C++标准中,-5/3可以是-1(向零舍入)或-2(楼层),但建议使用-1。在最新的C++ 0B草案中(几乎可以肯定非常接近最终标准),它是-1,因此找到负数的底板更为重要。
据我所知,没有为此预定义的功能。 可能有必要使用这样的功能,如果由于某种原因,浮点计算是没问题的(如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
功能比较小的开销是显著快....
什么是最大整数函数? – Andrey 2010-04-12 13:40:09
请注意,在C和C++中,作用于整数的'/'运算符总是返回一个整数结果。除此之外,我认为你需要更具体地说明你想要的东西---你的函数是否会返回最大的整数**少于一个给定的数字?这个数字会有什么类型?如果它是'float'或'double',无论如何你都会失去精度。如果它是一个自制类型,可以模拟**理性**数字,则可以避免精度损失。 – Pillsy 2010-04-12 13:42:28
这是一个返回*最大*整数的函数!我相信最大的一个是1,000,001 – 2010-04-12 13:43:12