I einen unsigned long int für einen size_t (zurückgegeben von einer Dimension eines Arrays mit size()), wie diese haben zuzuweisen teilen:Teilen und das Ergebnis an eine Doppel
vector<string> mapped_samples;
vector<double> mean;
vector<unsigned long> feature_sum;
/* elaboration here */
mean.at(index) = feature_sum.at(index) /mapped_samples.size();
aber auf diese Weise eine integer-Division statt (ich verliere den Dezimalteil das ist nicht gut.)
Daher kann ich tun:
mean.at(index) = feature_sum.at(index)/double(mapped_samples.size());
aber auf diese Weise wird feature_sum.at(index)
automatisch umgewandelt (Temporäre Kopie) zu double
und ich könnte die Präzision verlieren. Wie kann ich die Frage angehen? Ich muss eine Bibliothek benutzen?
Es könnte Präzisionsverlust sein, wenn Sie das unsigned long in double konvertieren (weil der vorzeichenlose lange Wert größer als das maximale double sein könnte). Der unsigned long Wert ist die Summe der Features (positive Werte). Die Stichproben des Merkmals können 1000000 oder mehr betragen und die Summe der Werte der Merkmale kann enourmus sein. Der maximale Wert eines Merkmals ist 2000 so: 2000 * 1000000 oder mehr
(Ich verwende C++ 11)
Sie könnten die Bibliothek [Boost.Multiprecision] (http://www.boost.org/doc/libs/1_64_0/libs/multiprecision/doc/html/index.html) verwenden; Es ist in der Lage, Arbiträr- und Gleitkommaarithmetik mit beliebiger Genauigkeit auszuführen. –
@JasonR In C++ gibt es keine einfachere Lösung? Ich bin jetzt auf andere konzentriert und II würde nicht eine Bibliothek für eine einzelne Operation studieren Es sei denn, es ist der einzige Weg – Umbert
Sie haben nicht angegeben, welche Präzision Sie benötigen – keith