Как лучше всего изменить числа с плавающей запятой в списке, сохраняя при этом соотношения?

Я пишу приложение, размещенное на JVM, которое работает со многими числами с плавающей запятой; по этой причине программа сталкивается с серьезными проблемами потери точности. Реальные значения - нет-нет, поскольку производительность тоже является проблемой.

Учитывая набор положительных двойников (длина может быть любой больше 100 и меньше 100 000), мне нужно изменить каждый элемент в соответствии с параметром p с двумя основными требованиями:

  1. Сумма всех значений должна быть равна p.
  2. Соотношения должны оставаться равными или изменяться как можно меньше.

Очень простой пример с n=3 и p=10,0: (0.45, 2.0, 0.05) становится (1.8, 8.0, 0.2).

Есть ли какая-нибудь библиотека для достижения такого результата? Если нет, то какой алгоритм мне следует использовать?


person Filippo Costa    schedule 16.11.2016    source источник
comment
Умножить каждый элемент в списке L на p/SUM(L)?   -  person CollinD    schedule 16.11.2016
comment
Это не сработает для значений без точного представления double. См. этот вопрос.   -  person Filippo Costa    schedule 16.11.2016
comment
@ФилиппоК. Ничто не будет работать со значениями без точного представления double. Остается правильный ответ.   -  person user207421    schedule 16.11.2016