Реализуйте функцию, которая вычисляет значение e ^ x, x — параметр функции, целое число. Для этого используйте разложение в ряд Тейлора, чтобы вычислить эффективность e. Функция получит в качестве параметра, помимо показателя степени x, количество членов ряда, которое будет работать как максимальное значение n. Для разрешения этой функции необходимо использовать рекурсию.
Я сделал это:
factorial 0 = 1
factorial n = n * factorial (n-1)
consigna3::Int->Int->Float
consigna3 _ 0 = 1
consigna3 x n = (fromIntegral(x^n) / fromIntegral(factorial n)) + consigna3 x (n-1)
Но некоторые результаты неверны, это то, что я ожидал:
Ejemplo 1: Main> funcion3 1 1
2.0
Ejemplo 2: Main> funcion3 1 10
2.718282
Ejemplo 3: Main> funcion3 2 10
7.388997
Ejemplo 4: Main> funcion3 10 20
21991.48
Ejemplo 5: Main> funcion3 10 30
22026.46
Ejemplo 6: Main> funcion3 0 30
1.0
Результаты (10 20) и (10 30) не соответствуют тому, что возвращает функция, которую я сделал. Что я делаю неправильно? Спасибо и извините за мой английский.
funcion3
, включающие10
и меньшие значения дляn
? Я подозреваю, чтоfuncion3
был реализован таким образом, что меньше подвержен влиянию ошибки округления с плавающей запятой. - person chepner   schedule 09.10.2020factorial 30
намного больше, чем максимальное значениеInt
. Вы должны использоватьInteger
для таких вычислений. Также я бы предложилDouble
вместоFloat
- вам нужна вся точность, которую вы можете получить, как вы это делаете. - person luqui   schedule 09.10.2020Rational
s. используйте код в принятом ответе, но замените/
на%
. преобразовать только окончательный результат в число с плавающей запятой с помощьюfromRational
. - person Will Ness   schedule 16.07.2021