В настоящее время я нахожусь в процессе написания приложения, в котором есть довольно много математических вычислений. В некоторых ситуациях эти вычисления необходимо выполнять быстро, и мы можем справиться с небольшой потерей точности, чтобы выполнить математику как можно быстрее. С другой стороны, иногда нам требуется, чтобы вычисления были выполнены очень точно (и есть варианты использования промежуточных значений, когда мы могли бы реализовать свой собственный способ выполнения умножения/деления/сложения/вычитания/степени и т. д., который является более точным, чем float * float (или double * double, я знаю, что float — плохой выбор), но быстрее, чем BigDecimal.multiply(BigDecimal)... или даже что-то вроде apfloat, а не BigDecimal).
Существуют ли какие-либо существующие библиотеки, которые позволяют абстрагироваться от таких числовых форматов, чтобы абстрагироваться от различных способов выполнения математических операций, или мне нужно создавать свои собственные?
Я начал кодировать кое-что, что, кажется, работает хорошо, но, как мне кажется, было бы гораздо лучше иметь хорошо протестированную библиотеку, чем изобретать велосипед.
ОТРЕДАКТИРОВАНО, чтобы прояснить ситуацию с контентом из комментария ниже:
Проблема в том, что BigDecimal значительно медленнее, чем double * double и т. д. Нам нужно иметь возможность переключаться между точностью и скоростью. Причина этого в том, что нам нужно иметь возможность запускать быстрые тесты для отладки и перекрестных проверок с реальными данными (которые не обязательно должны быть абсолютно точными), но окончательное моделирование (которое часто занимает от нескольких дней до недель: неприемлемо для отладка) потребует высокой точности. Таким образом, необходимо иметь возможность переключаться по желанию.
BigDecimal
/BigInteger
, но с возможностью реализации других стратегий для выполнения таких действий, как (в настоящее время реализованных)add
,subtract
,multiply
,divide
иpow
с фабрикой для создания новых числовых/математических объектов. - person Ricky Cook   schedule 14.11.2011