Comments 14
А можно узнать, в чем преимущества такого решения перед чисто клиентским, например, math.js?
На тот момент, когда я это реализовывал, я осваивал технологию Java сервлетов — и основной целью было написать что-либо для тренировки.
На счет преимуществ:
В одном плане чисто клиентское решение будет даже лучше — отсутствие лишней нагрузки на сервер.
С другой стороны — в моей библиотеке есть реализация специальных функций (гамма, бета, функции Бесселя и Эйри) — не уверен, что найдутся js-либы, которые это умеют.
У вас гамма-функция вычисляется рекурсивно для больших аргументов, что негативно сказывается на использовании стека и времени работы. Возможно стоит применить формулу Стрирлинга, либо посмотреть, как она реализована в стандартных библиотеках (тот же GSL, например)
Спасибо за совет.

От рекурсии избавился. Сделал так:

public static double eulergamma(double x){
    if((x<=0.0)&&(Math.round(x)==x)){
        System.out.print("\nargument of gamma cannot be zero or negative integer\n");
        return Double.NaN;
    }
    //if(x>1.5) return (x-1)*eulergamma(x-1);
    //if(x<0.5) return eulergamma(x+1)/x;
    double mult = 1.0;
    while (x>1.5) {
        mult *= x-1;
        x -= 1;
    }
    while (x<0.5) {
        mult /= x;
        x += 1;
    }
  
    return mult*Math.exp(lngamma(x));
}
Экспирементальным путем установил, что при x>180 функция возвращает Infinity, при x<-180 — positive or negative zero.

Добавил это:

if (x>180) return Double.POSITIVE_INFINITY;
if (x<-180) {
    int xIntAbs = (int)(-x);
    int sign = 2*(xIntAbs%2)-1; 
    return 0.0*sign;
}
UFO landed and left these words here
UFO landed and left these words here
Пофиксил.
А на счет ' — парсер воспринимает этот символ как пробел.
На тот момент, когда я это реализовывал, я осваивал технологию Java сервлетов — и основной целью было написать что-либо для тренировки.
На счет преимуществ:
В одном плане чисто клиентское решение будет даже лучше — отсутствие лишней нагрузки на сервер.
С другой стороны — в моей библиотеке есть реализация специальных функций (гамма, бета, функции Бесселя и Эйри) — не уверен, что найдутся js-либы, которые это умеют.
Должны найтись, а если не найдутся, то можно перегнать java в js. Есть конвертеры.
Слишком много конкатенаций строк, советую использовать StringBuilder.
По-хорошему здесь можно использовать библиотеку GSON.
Но на момент написания этого кода я про нее еще не знал.
Почитал про JSR353 немного.
Но по-моему GSON на порядок удобнее — нужно просто создать классы для тех объектов, которые мы хотим перегнать в JSON (и добавить простые аннотации, если имена полей класса отличаются от нужных нам в JSONе) — и библиотека сделает все сама.
Only those users with full accounts are able to leave comments. Log in, please.