Другой пример:
double d = 0;
for (int i = 1; i <= 10; i++) {
d += 0.1;
}
System.out.println(d); // prints 0.9999999999999999 not 1.0
Использование BigDecimal вместо этого.
РЕДАКТИРОВАНИЕ:
кроме того, только для указания это не проблема округления 'Java'. Другие языки показывают подобный (хотя не обязательно последовательный) поведение. Java, по крайней мере, гарантирует последовательное поведение в этом отношении.
Intel MKL и ACML имеют похожие API, но MKL имеет более богатый набор поддерживаемых функций, включая BLAS ( и CBLAS) / LAPACK / FFT / Vector и Statistical Math / Sparse прямые и итерационные решатели / Sparse BLAS и т. д. Intel MKL также оптимизирован для процессоров Intel и AMD и имеет активный пользовательский форум, к которому вы можете обратиться за помощью или советом. Независимая оценка двух библиотек размещена здесь: ( http://www.advancedclustering.com/company-blog/high-performance-linpack-on-xeon-5500-v-opteron-2400.html )
• Шейн Кордер, Advanced Clustering, (также предоставлено HPCWire: Benchmark Challenge: Nehalem Versus Istanbul): «В ходе нашего недавнего тестирования и практического опыта мы обнаружили, что компиляторы Intel и библиотека Intel Math Kernel Library (MKL) обычно обеспечивают лучшую производительность. Вместо того, чтобы просто остановиться на инструментарии Intel, мы попробовали различные компиляторы, включая: Intel, компиляторы GNU и Portland Group. Мы также протестировали различные библиотеки линейной алгебры, в том числе: MKL, AMD Core Math Library (ACML) и libGOTO от Техасского университета. Все тесты показали, что мы можем достичь наивысшей производительности при использовании как компиляторов Intel, так и Intel Math Library - даже в системе AMD - поэтому они были использованы в качестве основы для наших тестов ». [Тестирование производительности показало 4-ядерный Nehalem X5550 2,66 ГГц при 74,0GF против Istanbul 2435 2,6 ГГц при 99,4GF;
Я использовал AMCL для его подпрограмм BLAS / LAPACK, так что это наверное не отвечу на ваш вопрос, но надеюсь, что это кому-то пригодится. Сравнивая их с ванильным BLAS / LAPACK, их производительность была в 2-3 раза лучше в моем конкретном случае использования. Я использовал его для плотных несимметричных комплексных матриц, как для линейных решений, так и для собственных вычислений. Вы должны знать, что объявления функций не идентичны обычным подпрограммам. Это потребовало значительного количества макросов препроцессора, чтобы я мог свободно переключаться между ними. В частности, все подпрограммы LAPACK в AMCL не требуют рабочих массивов. Это очень удобно, если вы будете использовать только AMCL.
Фактически, в ACML есть две версии подпрограмм LAPACK. Те, что без подчеркивания (_), являются подпрограммами C-версии, которые, как сказал Виктор, не требуют массивов рабочей области, и вы можете просто передавать значения вместо ссылок для параметров. Тем не менее, те, что отмечены подчеркиванием, - это просто стандартные процедуры на Фортране. Сделайте «dumpbin / exports» для libacml_dll.dll, и вы увидите.