C ++:如何以有效的方式截断double?

时间:2010-06-17 07:44:36

标签: c++ performance

我想将浮点数截断为4位数。 有没有一种有效的方法呢? 我目前的解决方案是:

double roundDBL(double d,unsigned int p=4)
{
 unsigned int fac=pow(10,p);
 double facinv=1.0/static_cast<double>(fac);
 double x=static_cast<unsigned int>(d*fac)*facinv;
 return x;
}

但使用pow和删除似乎并不那么有效。

亲切的问候

阿尔曼。

4 个答案:

答案 0 :(得分:4)

round(d*10000.0)/10000.0;

或者p必须是可变的;

double f = pow(10,p);
round(d*f)/f;

round通常被编译为单个指令,比转换为整数并返回更快。要验证的配置文件。

请注意,double可能无法准确表示4位小数。您将无法真正截断任意双精度,只需找到最接近的近似值。

答案 1 :(得分:2)

效率取决于您的平台。

无论您尝试何种方法,都应该进行分析以确保

  1. 效率是必需的(而且直接的实施对你来说还不够快)
  2. 您尝试的方法比实际数据上的应用程序更快
  3. 您可以乘以10000,截断为整数,然后再划分。在double和int之间进行转换可能会更快或更慢。

    您可以截断输出,例如printf格式字符串"%.4f"

答案 2 :(得分:1)

您可以使用更高效的基于整数的变体替换pow。 Stack Overflow上有一个:The most efficient way to implement an integer based power function pow(int, int)

此外,如果您可以接受一些不准确,请用乘法替换除法。分裂是最慢的常见数学运算之一。

除此之外,我会回应其他人所说的内容并简单地截断输出,除非你实际上需要在计算中使用截断的双精度。

答案 3 :(得分:1)

如果您需要执行涉及十进制数字的精确计算,请立即停止使用double!它不适合您的数据类型。你不会获得实际舍入的十进制值。几乎所有的值(截断后,无论你使用什么方法)实际上都是1,000999999999999841,而不是1,0001。

那是因为double是使用binary fractions实现的,而非十进制的。{1}}。您可以使用decimal types来正确使用它。它们会慢得多,但是如果结果不需要正确的话,我知道一种让它无限快速的方法......