【发布时间】:2014-12-21 23:11:57
【问题描述】:
这是我的问题:我需要一个 Haskell 函数,它使用关联的 Taylor serie 计算某个数字的 sine 的近似值...
我用 C++ 写了这个:
double msin(double number, int counter = 0, double sum = 0)
{
// sin(x) = x - (x'3 / 3!) + (x'5 / 5!) - (x'7 / 7!) + (x'9 / 9!)
if (counter <= 20)
{
if (counter % 2 == 0)
sum += mpow(number, counter * 2 + 1) / mfak(counter * 2 + 1) ;
else
sum -= mpow(number, counter * 2 + 1) / mfak(counter * 2 + 1) ;
counter++;
sum = msin(number, counter, sum);
return sum;
}
return (sum* 180.0 / _PI);
}
现在我正在尝试在 Haskell 中执行此操作,但我不知道如何...现在我正在尝试这样的事情(它并没有真正起作用,但它正在进行中;)):
这行得通:
mfak number = if number < 2
then 1
else number *( mfak (number -1 ))
mpow number potenca = if potenca == 0
then 0
else if potenca == 1
then 1
else (number * (mpow number (potenca-1)))
这不起作用:
msin :: Double -> Int -> Double -> Double
msin number counter sum = if counter <= 20
then if counter `mod` 2==0
then let sum = sum + (msin 1 (let counter = counter+1 in counter) sum) in sum
else let sum = sum + (msin 1 (let counter = counter+1 in counter) sum) in sum
else sum* 180.0 / 3.14
更新....无法编译:/“无法匹配预期类型Double' with actual type Int'”
msin :: Double -> Int -> Double -> Double
msin number counter sum = if counter <= 20
then if counter `mod` 2==0
then let sum' = sum + ((mpow number (counter*2+1))/(mfak counter*2+1)) in msin number (counter+1) sum'
else let sum' = sum - ((mpow number (counter*2+1))/(mfak counter*2+1)) in msin number (counter+1) sum'
else sum* 180.0 / 3.14
如您所见,最大的问题是如何在“sum”中添加一些东西,增加“counter”并使用这些新值再次递归......
P.S.我是 Haskell 的新手,所以请尽可能多地解释您的解决方案。我正在阅读一些教程,但是我找不到如何将某些表达式的结果保存到一个值中,然后在它之后继续其他代码......每次我尝试这样做时它都会返回我的值,并且我不想这样……
提前感谢您的帮助!
【问题讨论】:
-
如果你为你的变量使用英文名称,你的受众可能会增加几个数量级。只是说。
-
oki 会改成英文的 :) 抱歉之前没有想到 :)
-
如果你有一个
Int并且它需要一个类型Double使用fromIntegral。 -
我回家后会看看 fromIntegral 解决方案 :) ty!
标签: c++ haskell trigonometry taylor-series