【问题标题】:Haskell Function that calculates e^x计算 e^x 的 Haskell 函数
【发布时间】:2021-01-24 15:47:36
【问题描述】:

实现一个函数,计算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) 与我所做的函数返回的不匹配。 我做错了什么?感谢并为我的英语感到抱歉。

【问题讨论】:

  • 您是否对涉及10funcion3n 的较小值有预期的结果?我怀疑funcion3 的实现方式受浮点舍入误差的影响较小。
  • factorial 30 远大于 Int 的最大值。您应该使用Integer 进行此类计算。另外我建议Double 而不是Float——你需要按照你的方式获得所有的精确度。
  • 这确实应该在Rationals 中计算。使用已接受答案中的代码,但将/ 替换为%。仅将最终结果转换为浮点数,使用fromRational

标签: haskell recursion taylor-series


【解决方案1】:

您正在使用Int 进行将溢出Int 的计算。相反,立即转换为Float,然后使用Float 进行所有操作。所以:

consigna3 x n = ((fromIntegral x)^n / factorial (fromIntegral n)) + consigna3 x (n-1)

这里从IntFloat 有两个关键的变化:首先,你在x :: Int 处执行x^n,但我在fromIntegral x^n 处执行fromIntegral x :: Float;第二,你做factorial n where n :: Int,但我做factorial (fromIntegral n) where fromIntegral n :: Float

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 2010-10-24
    • 2021-02-03
    • 2011-01-29
    • 1970-01-01
    • 2023-03-17
    • 2018-02-19
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多