C++ 寻找更快的方法来完成这个双重功能

C++ 寻找更快的方法来完成这个双重功能,c++,optimization,gnu,ieee-754,C++,Optimization,Gnu,Ieee 754,我希望加速一个函数,它可以将一个双倍数映射到另一个双倍数。但是,功能必须保持不变。相同的输入必须产生与以前完全相同的输出。原因是我们不想在系统中引入任何差异,即使这个原始函数的行为有问题 功能是: double g(double d) { std::stringstream ss; ss.precision(10); ss<<std::fixed<<d; std::string asString;

我希望加速一个函数,它可以将一个双倍数映射到另一个双倍数。但是,功能必须保持不变。相同的输入必须产生与以前完全相同的输出。原因是我们不想在系统中引入任何差异,即使这个原始函数的行为有问题

功能是:

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

ss获得双精度到10位十进制数字的一种更简单的方法是将一个比该值大10倍的数字相加,然后再减去它。如下所示:

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

“函数看起来很慢。”反对什么?有什么措施和具体的利润吗?这里有一个函数做的事情几乎是一样的:double d=static_cast(nint(d*tenbillion))/100亿,但要快得多。在指定的精度范围内比较
double
,比如
std::epsilon
,或者如果在特定范围内操作,则使用固定的小数点值,怎么样?我会试试。我在玩弄不同的想法。让我试试。谢谢。问题是,这是浮动的领域要点。他要求提供一个产生相同输出的版本,但不清楚这是否会产生完全相同的输出。正如不清楚原始函数是否会四舍五入到10位一样,这是正确的,尽管最终答案最多只差一位小数(更像是2位,但在处理基数10时很难衡量)。我确实尝试过,但没有生成完全相同的输出。看来我必须深入研究std::fixed std::precison和atof到底做了些什么,直到详细程度。@steviekm3比较字符串肯定是关于性能的最差方法!