2011-12-01 3 views
4

Я хочу иметь быструю функцию log1p для Java. Java имеет Math.log1p, но, по-видимому, это слишком медленно для моих нужд.Быстрая реализация функции log1p?

Я нашел этот код для log1p здесь:

http://golang.org/src/pkg/math/log1p.go

для языка GO.

Это то же самое, что и на Java, или это быстрее? (если я перевешу его в java). Кто-нибудь знает о другой быстрой реализации log1p?

Спасибо.

+0

Есть пара хороших коротких, реализованных в терминах журнала, в этом вопросе: http://stackoverflow.com/questions/24134816/goldbergs-log1p-vs-gsl-log1p –

ответ

0

с log1p(x) = Math.log(x+1), найти алгоритм естественного логарифмического алгоритма достаточно для того, что вам нужно.

Быстрый натуральный логарифм в Java

Я нашел следующее приближение здесь, и там не так много информации о нем, за исключением того, что называется «Алгоритм Борхардта» и это из книги «Мертвые Reconing: Расчет без инструментов ". Аппроксимация не очень хорошая (некоторые могут сказать очень плохой ...), она становится хуже, чем больше значения. Но приближение также является монотонной, медленно растущей функцией, которая достаточно хороша для моего варианта использования.

открытый статический двойной журнал (двойной x) { return 6 * (x - 1)/(x + 1 + 4 * (Math.sqrt (x))); }

Это приближение в 11,7 раза быстрее, чем Math.log().

См. this сайт. Кроме того, a performance comparison for math libraries in java.

Но, вероятно, что вы потребность является ссылка на C++, составленный материал, подробный here.

+9

Вам не хватает точки 'log1p'. Когда x очень мало (например, 1e-20), 'x + 1.0' округляется до' 1.0' из-за ограниченной точности 'double', а' log (1.0) 'возвращает (неправильный) результат' 0 '. Вы можете подумать «хорошо, что это достаточно близко к 0», но что, если следующий шаг - умножить результат на очень большое число? – finnw

+1

, когда x очень мало, тогда log (x + 1) ~ x (см. Https://en.wikipedia.org/wiki/Natural_logarithm#Derivative.2C_Taylor_series), который может обрабатываться оператором if, если значение x меньше определенного порога. –

+1

@AndreHolzner: его можно было обработать таким образом, но не очень хорошо. Качественная реализация будет точной с точностью до нескольких младших битов независимо от ввода. С вашим подходом, в зависимости от того, какой порог вы выберете, вы получите плохие результаты либо чуть ниже порога, либо чуть выше порога, или и то, и другое. –

Смежные вопросы