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

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

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));
}
0
Экспирементальным путем установил, что при 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;
}
+2
Может быть не совсем в тему, но у у вас отсутствуют проверки на стороне сервера, в следствии чего ему вполне можно скормить подобный запрос:

func=sin(1/x)&variable=y&begin='&end=0

что вызовет некие неполадки на его стороне.
+2
И ещё в кучу к вышесказанному — построение графика функции
sin(1/')
сервер принимает и даже строит такой график, причем поведение его в этих случаях не совсем понятно. Скажем, если я пытаюсь отправить
sin(1/'0)
то ответом приходят 'NaN'-ы. А вот если отправить
sin(1/-0)
то график опять вполне успешно строится, как-бы откидывая все, что идет после единицы.
0
Пофиксил.
А на счет ' — парсер воспринимает этот символ как пробел.
0
На тот момент, когда я это реализовывал, я осваивал технологию Java сервлетов — и основной целью было написать что-либо для тренировки.
На счет преимуществ:
В одном плане чисто клиентское решение будет даже лучше — отсутствие лишней нагрузки на сервер.
С другой стороны — в моей библиотеке есть реализация специальных функций (гамма, бета, функции Бесселя и Эйри) — не уверен, что найдутся js-либы, которые это умеют.
0
Должны найтись, а если не найдутся, то можно перегнать java в js. Есть конвертеры.
0
Слишком много конкатенаций строк, советую использовать StringBuilder.
0
По-хорошему здесь можно использовать библиотеку GSON.
Но на момент написания этого кода я про нее еще не знал.
0
Если уж взялись за Java EE, то для JSONа советую посмотреть на JSR353.
0
Почитал про JSR353 немного.
Но по-моему GSON на порядок удобнее — нужно просто создать классы для тех объектов, которые мы хотим перегнать в JSON (и добавить простые аннотации, если имена полей класса отличаются от нужных нам в JSONе) — и библиотека сделает все сама.
Only those users with full accounts are able to leave comments., please.