我编写了一些代码来计算正弦和余弦,但是,代码不太好,我想知道是否有可能使代码用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的正弦值?
答案 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)
了解它如何不使用if
,Power
或Factorial
?只需将最后一个项乘以-1
即可创建交替符号。在每个项上计算越来越大的指数和因子不仅昂贵而且导致精度损失,这也是不必要的。
要获得x^2
,x^4
,x^6
,......您所要做的就是将每个连续的词语乘以x^2
。要获得1/1!
,1/3!
,1/5!
,...您所要做的就是将每个连续的术语除以系列中的后两个数字。从1
开始;获得1/3!
,除以2然后除以3;将1/5!
除以4然后除以5,依此类推。
请注意,我使用m
前缀来表示decimal
值,因为我假设您出于某种原因尝试在decimal
进行计算(否则您会使用Math.Cos
)。