Текст подпрограммы и версий
sf13r_c.zip  sf13d_c.zip 
Тексты тестовых примеров
tsf13r_c.zip  tsf13d_c.zip 

Функция:  sf13r_c

Назначение

Вычисление экспоненциальных интегралов.

Математическое описание

Функция sf13r_c производит вычисления следующих интегралов

                   x
 (1)      y =  ∫ (et / t) dt ,                       для  x > 0.0
                -∞
                    
 (2)      y = - ∫ (e - t / t) dt ,                   для  x < 0.0
                   -x
                   
 (3)      y =  ∫ (e - t / t) dt ,                    для  x > 0.0
                  x
                           x
 (4)      y =  e - x  ∫ (et / t) dt ,              для  x > 0.0
                        -∞
                            
 (5)      y = - e - x  ∫ (e - t / t) dt ,          для  x < 0.0
                           -x

Алгоритм, реализованный в функции, изложен в статье
W.J.Cody, H.C.Thacher, Rational Chebyshev Approximation for the Exponential Integral Ei (x), Math. Comp. 23, 1969.

Использование

    real sf13r_c (real *x, integer *l, integer *ierr)

Параметры

x - заданное значение аргумента  x (тип: вещественный);
l - задает режим работы функции (тип: целый); при этом если:
l = 1 - вычисляется интеграл (1), если  x > 0.0. или интеграл (2), если  x < 0.0;
l = 2 - вычисляется интеграл (3), если  x > 0.0;
l = 3 - вычисляется интеграл (4), если  x > 0.0, или интеграл (5), если  x < 0.0;
ierr - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы функции; при этом:
ierr= 1 -  когда аргумент задан отрицательным числом при l = 2; вычисления производятся с использованием абсолютного значения аргумента;
ierr=66 - когда значение l меньше 1 или больше 3; значение sf13r_c полагается равным 3.4e38;
ierr=67 - когда значение аргумента pавно 0.; значение sf13r_c полагается равным 3.4e38, если l = 2, или - 3.4e38, если l = 1 или 3;
ierr=68 - когда значение аргумента превосходит 43.66 при l = 1; значение sf13r_c полагается равным 3.4e38;
ierr=69 - когда значение аргумента меньше - 41.18 при l = 1 или 2; значение sf13r_c полагается равным 0.

Версии

sf13d_c - вычисление экспоненциальных интегралов (1) - (5) с повышенной точностью.

Вызываемые подпрограммы

utsf10_c - подпрограмма выдачи диагностических сообщений при работе функции sf13r_c.
utsf11_c - подпрограмма выдачи диагностических сообщений при работе функции sf13d_c.

Замечания по использованию

 

Область допустимых значений аргумента для функций sf13r_c и sf13d_c указана выше при описании параметра ierr, при этом в случае функции sf13d_c вместо 3.4e38 берется значение 1.7e308. kpоме того, для функции sf13d_c аргумент  x имеет тип двойной точности и его максимальное значение pавно 2.04e3 при l = 1 или 2 (ierr = 68), а минимальное значение pавно - 2050 при l = 1 или 2 (ierr = 69).

Пример использования

int main(void)
{
    /* Local variables */
    extern float sf13r_c(float *, int *, int *);
    static int ierr, l;
    static float x, y;

    x = -.5f;
    l = 1;
    y = (float)sf13r_c(&x, &l, &ierr);

    printf("\n %16.7e %5i \n",y,ierr);
    return 0;
} /* main */


Результаты: 

        y = -0.559773594775,   ierr = 0