Моя проблема в том, что я должен использовать функцию/алгоритм thrid-party, которая принимает в качестве входных данных массив значений double -precision, но, по-видимому, может быть чувствителен к очень малым изменениям входных данных, Однако для моего приложения мне нужно получить одинаковые результаты для входов, которые (почти) идентичны! В частности, у меня есть два тестовых входных массива, которые идентичны до 5-й позиции после десятичной точки, и все же я получаю разные результаты. Итак, почему "проблема" должна быть после 5-й позиции после десятичной точки.
Теперь моя идея состояла в том, чтобы округлить ввод до немного более низкой точности, чтобы получить идентичные результаты от входов, которые очень похожи, но не на 100% идентичны. Поэтому я ищу хороший/эффективный способ округлить значения double -precision до немного более низкой точности. Пока я использую этот код для округления до 9-й позиции после десятичной точки:
double x = original_input();
x = double(qRound(x * 1000000000.0)) / 1000000000.0;
Здесь qRound() - нормальная функция округления до целочисленного числа от Qt. Этот код работает, и он действительно разрешил мою проблему с двумя "проблемными" наборами тестов. Но: есть ли более эффективный способ этого?
Также меня беспокоит: округление до 9-й позиции после десятичной точки может быть разумным для входных данных, находящихся в диапазоне от -100,0 до 100,0 (как в случае с моими текущими входными данными). Но может быть слишком много (i, e, слишком большая потеря точности) для входных данных в диапазоне от -0.001 до 0.001, например. К сожалению, я не знаю, в каком диапазоне мои входные значения будут в других случаях...
В конце концов, я думаю, что мне нужно что-то вроде функции, которая делает следующее: Отрезать, путем правильного округления, заданное значение double -precision X до не более LN-позиций после десятичная точка, где L - число позиций после десятичной точки, которое double -precision может хранить (представлять) для данного значения; и N фиксировано, как 3. Это означает, что для "малых" значений мы будем допускать больше позиций после десятичной точки, чем для "больших" значений. Другими словами, я хотел бы объединить 64-битное значение с плавающей запятой в (несколько) меньшую точность, такую как 60-бит или 56-бит, а затем сохранить ее обратно до 64-битного двойного значения.
Разве это имеет смысл для вас? И если да, можете ли вы предложить способ сделать это (эффективно) в С++???
Спасибо заранее!