Мне нужно разделить unsigned long int на size_t (возвращенный из измерения массива с помощью size() ) следующим образом:
vector<string> mapped_samples;
vector<double> mean;
vector<unsigned long> feature_sum;
/* elaboration here */
mean.at(index) = feature_sum.at(index) /mapped_samples.size();
но таким образом происходит целочисленное деление (я теряю десятичную часть. Это нехорошо)
Поэтому я могу сделать:
mean.at(index) = feature_sum.at(index) / double(mapped_samples.size());
Но таким образом feature_sum.at(index)
автоматически преобразуется (Временная копия) в double
, и я могу потерять точность. Как я могу решить вопрос? Я должен использовать какую-то библиотеку?
Это может быть потеря точности при преобразовании unsigned long в double (поскольку значение unsigned long может быть больше, чем максимальное значение double). Значение unsigned long представляет собой сумму функций (положительных значений). Выборки признаков могут быть 1000000 или более, а сумма значений признаков может быть огромной. Максимальное значение функции равно 2000, таким образом: 2000*1000000 или более
(я использую С++11)
size_t
представляет размерность массива, но вас беспокоит потеря точности при преобразовании его вdouble
.double
может содержать 53-битные целые числа без потери точности. Вам действительно нужно поддерживать значения больше2^53 - 1
? - person Jason R   schedule 24.05.2017double
всегда будет определяться стандартом IEEE-754, поэтому его диапазон указывается явно. Основываясь на этом и описании того, что представляет значениеsize_t
, которое у вас есть, вам не нужно беспокоиться о потере точности при преобразовании вdouble
. Могу поспорить, что пройдет много времени, прежде чем вы когда-либо получите массив с размером, сравнимым с2^53
по размеру. - person Jason R   schedule 24.05.2017