Вычисление ряда Тейлора sinh


person Community    schedule 20.01.2016    source источник
comment
Пожалуйста, отформатируйте код правильно.   -  person Iharob Al Asimi    schedule 20.01.2016
comment
Расслабьтесь и подумайте о предупреждении!   -  person too honest for this site    schedule 20.01.2016


Ответы (2)


На самом деле очень здорово, что компилятор предупреждает вас о такой потере данных.
Видите ли, когда вы вызываете это:

esponenziale(x, ((2 * n) + 1))

По сути, вы теряете точность, поскольку конвертируете double, то есть x, в int. Это потому, что подпись esponenziale - int esponenziale(int base, int esponente).

Измените его на double esponenziale(double base, int esponente), risultato также должно быть double, поскольку вы возвращаете его из функции и выполняете математические операции с ним/над ним.

Помните, что деление double на int дает обратно double.

Изменить: в соответствии с комментарием Ringø и видя, как он на самом деле решил вашу проблему, вы также должны установить double fattoriale(int n) и внутри этого double risultato = 1;.

person Idos    schedule 20.01.2016
comment
@ringø Я не думаю, что Fattoriale должен измениться. Все работает с int там - person Idos; 20.01.2016
comment
Ну, если вы не измените func sig и risultato на double, sinh(x) будет чем-то вроде floor(sinh(x))... - person Breaking not so bad; 20.01.2016
comment
я не понимаю, почему, если я поставлю sinh(3), я получу инф... результат будет 10.01787 - person ; 20.01.2016
comment
@AmarildoAliaj Сделайте изменения, о которых я говорил: double fattoriale(int n) и внутри double risultato = 1; - person Breaking not so bad; 20.01.2016

  1. Вы теряете точность, так как многие члены будут дробными величинами. Использование int приведет к затиранию десятичной части. Замените ваши типы int на типы double по мере необходимости.

  2. Ваша факториальная функция будет переполняться при неожиданно малых значениях n. Для 16-битного int наибольшее значение n равно 7, для 32-битного — 12, а для 64-битного — 19. Поведение при переполнении целочисленного типа signed не определено. Вы можете использовать unsigned long long или uint128_t, если ваш компилятор это поддерживает. Это даст вам немного больше времени. Но, учитывая, что вы все равно переходите на double, вы можете с самого начала использовать double. Обратите внимание, что двойное число с плавающей запятой IEEE764 достигает бесконечности в 171!

  3. Будьте уверены, что радиус сходимости разложения Маклорена sinh бесконечен для любого значения x. Таким образом, любое значение x будет работать, хотя сходимость может быть медленной. См. http://math.cmu.edu/~bkell/21122-2011f/sinh-maclaurin.pdf.

person Bathsheba    schedule 20.01.2016
comment
На самом деле я не уверен в радиусе сходимости. Пожалуйста, понизьте голос, если я ошибаюсь. Я проверяю... - person Bathsheba; 20.01.2016
comment
Да, я был неправ. Радиус бесконечен. К ответу добавлена ​​довольно хрупкая ссылка. - person Bathsheba; 20.01.2016
comment
но я получаю информацию, если я выбираю x ›1 - person ; 20.01.2016
comment
@AmarildoAliaj sinh(x) сходится для любого x>1, но sinh(x) → ∞ при x → ∞ - person Breaking not so bad; 20.01.2016
comment
хорошо, но я не понимаю, как это решить. например, с помощью sinh(3) я получаю информацию - person ; 20.01.2016
comment
@AmarildoAliaj Вероятно, потому что x! довольно быстро переполняется, даже тип double - person Breaking not so bad; 20.01.2016
comment
Действительно, он переполнит обычный тип double по адресу 171. Изменили ли вы факториал, чтобы он возвращал double? Если это так, установите ограничение 170 для n. - person Bathsheba; 20.01.2016
comment
я не меняю его... я не понимаю, не могли бы вы показать мне, как это будет код? Спасибо - person ; 20.01.2016