Моя проблема в том, что я должен использовать стороннюю функцию / алгоритм, который принимает в качестве входных данных массив значений двойной -точности, но, по-видимому, может быть чувствителен к очень небольшим изменениям входных данных. Однако для моего приложения я должен получить идентичные результаты для (почти) идентичных входов! В частности, у меня есть два тестовых входных массива, которые идентичны до 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 (как в случае с моими текущими входными данными). Но это может быть слишком много (т.е. слишком большая потеря точности) для входных данных, например, в диапазоне от -0,001 до 0,001. К сожалению, я не знаю, в каком диапазоне будут мои входные значения в других случаях ...
В конце концов, я думаю, что мне понадобится что-то вроде функции, которая выполняет следующие действия: Отсекает путем правильного округления заданное значение двойной -точности X до не более чем LN позиций после десятичная точка, где L - количество позиций после десятичной точки, которое double -precision может сохранить (представить) для данного значения; и N фиксировано, например 3. Это означает, что для «маленьких» значений мы разрешили бы больше позиций после десятичной точки, чем для «больших» значений. Другими словами, я хотел бы округлить 64-битное значение с плавающей запятой до (несколько) меньшей точности, например 60-битной или 56-битной, а затем сохранить его обратно до 64-битного значения двойной точности.
Это имеет для вас смысл? И если да, то можете ли вы предложить способ сделать это (эффективно) на C ++ ???
Заранее спасибо!
f(1.00) == f(1.01)
иf(1.01)==f(1.02)
, то такжеf(1.00)==f(1.02)
, а такжеf(1.00)==f(1E7)
- person MSalters   schedule 04.01.2013