2014-12-04 43 views
-1

我期待加快将一个双数映射到另一个双数的功能。但是该功能必须保持不变。相同的输入必须产生与以前完全相同的输出。其原因是我们不想在系统中引入任何差异,即使这个原始函数具有可疑的行为。寻找更快的方法做这个双重功能

功能是:

double g(double d) 
{ 
     std::stringstream ss; 
     ss.precision(10); 
     ss<<std::fixed<<d; 
     std::string asString; 
     ss >> asString; 
     return atof(asString.c_str()); 
} 

功能看起来很慢。通过浏览字符串将double转换为另一个double看起来很奇怪。

+0

_“功能看起来很慢。”_反对什么?任何措施和具体的形象? – 2014-12-04 20:52:05

+0

那么这里是一个几乎相同的功能:double d = static_cast (nint(d * tenbillion))/ tenbillion但更快。 – steviekm3 2014-12-04 20:52:48

+0

比如'std :: epsilon'在指定精度内比较'double',或者如果在特定范围内操作,使用固定小数点值呢? – 2014-12-04 20:59:05

回答

1

一个更简单的方法来获得一个精度为10个十进制数字的双精度是通过增加一个数字大于该值pow(10, 10)倍然后再减去它。像这样:

double n = pow(10, 10 + ((long) log(d)/log(10))); 
double truncated = d + n; 
return truncated - n; 
+0

让我试试看。谢谢。 – steviekm3 2014-12-04 20:59:00

+1

问题是这是浮点的土地。他要求产生相同输出的版本,但不清楚这将产生完全相同的输出。 JUST并不清楚原始函数会舍入到10个位置 – pm100 2014-12-04 21:01:05

+1

确实如此,尽管最终答案最多只有一位十进制数字(更像2位,但在处理基数10时很难衡量)。 – randomusername 2014-12-04 21:04:25

相关问题