2015-05-22 5 views
-1

Есть ли способ вызвать быструю реализацию expm1 из GNU Fortran? В идеале было бы здорово иметь функцию для вычисления (exp (x) -1)/x, чтобы избежать дополнительной проверки нулевого аргумента. Элементальная версия expm1 будет особенно полезна.expm1 для GNU gfortran

+0

:)) Это не проблема написания. Он написан и работает. Проблема заключается в том, чтобы быстро, когда вам приходится вычислять миллиарды из них. Существует причина, по которой математические библиотеки (например, libm) имеют отдельные реализации для exp и expm1 ... – Roux

ответ

1

Вот как это называется от libm:

use, intrinsic :: iso_c_binding, only: c_double 

    implicit none 

    interface 
    real(c_double) function expm1(x) bind(c, name='expm1') 
     import c_double 
     real(c_double), intent(in), value :: x 
    end function expm1 
    end interface 

    print*, expm1(3.4d0) 

end program 

Если источник Glibc код функции не выглядит слишком обескураживающим, то вы могли бы пожелать, чтобы перевести его в Fortran для того, чтобы сделать его элементный (если по elemental вы имели в виду ключевое слово Fortran).

+0

Спасибо! Имеет смысл. Я буду играть с ним, чтобы посмотреть, сколько производительности я могу получить от него. Интересно, если реализация gsl каким-то образом быстрее, чем libm .... – Roux

+0

UPD: Нет, судя по исходному коду gsl, это не ... – Roux

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