私は以下を最適化しようとしています。以下のコードはこれを行います:
a = 0.775 で精度 2 dp が必要な場合、a => 0.78
基本的に、最後の桁が 5 の場合は次の桁を切り上げますが、そうでない場合は切り上げません。
私の問題は、値が 0.44999999343.... として保存され、setprecision が 0.4 に丸められるため、0.45 が小数点 1 で 0.5 に丸められないことでした。
そのため、setprecision をより高くする必要がsetprecision(p+10)
あり、実際に 5 で終わる場合は、正しく切り上げるために少量を追加します。
完了すると、a と文字列 b を比較し、結果を返します。問題は、この関数が数十億回呼び出され、プログラムがクロールすることです。これを書き換え/最適化する方法と、コード内のどの機能がマシンに非常に重いかについて、より良いアイデアはありますか?
bool match(double a,string b,int p) { //p = precision no greater than 7dp
double t[] = {0.2, 0.02, 0.002, 0.0002, 0.00002, 0.000002, 0.0000002, 0.00000002};
stringstream buff;
string temp;
buff << setprecision(p+10) << setiosflags(ios_base::fixed) << a; // 10 decimal precision
buff >> temp;
if(temp[temp.size()-10] == '5') a += t[p]; // help to round upwards
ostringstream test;
test << setprecision(p) << setiosflags(ios_base::fixed) << a;
temp = test.str();
if(b.compare(temp) == 0) return true;
return false;
}