用Linq计算余弦和正弦值

时间:2013-11-18 05:35:45

标签: c# linq

我编写了一些代码来计算正弦和余弦,但是,代码不太好,我想知道是否有可能使代码用Linq来计算值。

这是我计算正弦的代码

        var primes = PrimeNumbers(3, 15);

        bool SumSub = false;
        decimal seno = (decimal)(nGrau * nSeno);
        foreach (var a in primes)
        {
            if (SumSub == false)
            {
                seno -= (decimal)Math.Pow(nGrau, (double)a) / Factorial(a);
                SumSub = true;
            }
            else
            {
                seno += (decimal)Math.Pow(nGrau, (double)a) / Factorial(a);
                SumSub = false;
            }
        }
        Console.WriteLine(seno);

是否可以使用linq制作代码来计算degres的正弦值?

3 个答案:

答案 0 :(得分:1)

您可以使用Aggregate

decimal seno = PrimeNumbers(3, 15)
    .Aggregate(
        new { sub = false, sum = (decimal)(nGrau * nSeno) },
        (x, p) => new {
            sub = !x.sub,
            sum = x.sum + (x.sub ? 1 : -1) * (decimal)Math.Pow(nGrau, (double)p) / Factorial(p)
        },
        x => x.sum);

我没有测试过,但认为它应该有用。

顺便说一下。我不认为它比您的解决方案更具可读性或更好。如果我是你,我会选择foreach循环,但稍微改进一下:

foreach (var a in primes)
{
    seno += (SumSub ? 1 : -1) * (decimal)Math.Pow(nGrau, (double)a) / Factorial(a);
    SumSub = !SumSub;
}

答案 1 :(得分:1)

这样的事情,也许是:

var sineResult = listDouble.Select((item, index) => 
                                    new {i = (index%2)*2 - 1, o = item})
                           .Aggregate(seno, (result, b) => 
                                      result - b.i * ((decimal)Math.Pow(nGrau, (double)b.o) / Factorial(b.o)));

代码

i = (index%2)*2 - 1

给你1和-1交替。

Aggregate语句对值进行求和,将每个值乘以-1或1。

答案 2 :(得分:1)

这是一个函数,用于计算泰勒级数近似余弦的前10个项的加法:

var theta = 1.0m;   // angle in radians
Enumerable.Range(1, 10).Aggregate(
    new { term = 1.0m, accum = 0.0m },
    (state, n) => new {
             term  = -state.term * theta * theta / (2 * n - 1) / (2 * n),
             accum = state.accum + state.term},
    state => state.accum)

了解它如何不使用ifPowerFactorial?只需将最后一个项乘以-1即可创建交替符号。在每个项上计算越来越大的指数和因子不仅昂贵而且导致精度损失,这也是不必要的。

要获得x^2x^4x^6,......您所要做的就是将每个连续的词语乘以x^2。要获得1/1!1/3!1/5!,...您所要做的就是将每个连续的术语除以系列中的后两个数字。从1开始;获得1/3!,除以2然后除以3;将1/5!除以4然后除以5,依此类推。

请注意,我使用m前缀来表示decimal值,因为我假设您出于某种原因尝试在decimal进行计算(否则您会使用Math.Cos)。