我创建的计算器程序几乎完美,除了Math.Sin()和Math.Log()似乎有一些我似乎无法深入到底的不准确之处。我会尝试尽可能多地提供详细信息。
Math.Sin()问题:
首先,这不是一个弧度问题(至少就我所知)。数字以Math的形式输入Math.Sin()。它适用于度和弧度的某些值,但不适用于180和pi等其他值。现在有些代码:
private void buttonSin_Click(object sender, EventArgs e)
{
if (radioDeg.Checked)
{
firstOperand = Math.PI/180*firstOperand;
}
firstOperand = Math.Sin(firstOperand);
secondOperand = 0;
displayScreen.Text = firstOperand.ToString();
clickCount = 0;
operationCount++;
}
firstOperand是double,并且(与secondOperand一起)用于后续计算。我认为代码的其他部分是不言自明的,但我很乐意在必要时详细说明。 Math.Sin(Math.PI)= 1.224 ...而不应该是0。然而,Math.Sin(Math.PI / 4)= 0.707 ......正如预期的那样。此外,这仅在pi作为Math.PI生成时。如果手动输入为3.14159,则Math.Sin()= 2.65 ...如果以3.1415926输入,我得到Math.Sin()= 5.35 ......任何人都可以指出原因吗?
Math.Log()问题:
这部分几乎完美无缺。连续应用该函数时发生唯一的错误。看看代码:
private void buttonLn_Click(object sender, EventArgs e)
{
firstOperand = Math.Log(firstOperand);
secondOperand = 0;
displayScreen.Text = firstOperand.ToString();
clickCount = 0;
operationCount++;
}
Math.Log(Math.E)= 1应该如此,但是当此后立即点击ln按钮时,我得到1.776的值...请注意,如果手动输入2.718,则ln按钮是连续两次命中,我得到-.0001 ...这更接近实际的答案0.
如果这些应该是单独的帖子,我很抱歉,但我认为这两个问题可能与如何处理常量Math.PI和Math.E有关。有什么想法吗?
答案 0 :(得分:9)
检查您的指数。当我在VS 2010调试评估器中评估Math.Sin(Math.Pi)时,我看到:0.00000000000000012246063538223773
那将输出为1.224e-16。
无论哪种方式,它只是零头发的宽度。与许多浮点运算一样,足够接近应该被认为是零。
答案 1 :(得分:6)
Math.Sin(Math.PI) => 1.2246063538223773e-16
这几乎是0,而不是1.224
我怀疑您的Log(e)
代码也是如此。
答案 2 :(得分:1)
Math.Sin(Math.PI)= 1.224 ...而不是0,因为它应该
实际上并不是1.224而是1.22460635382238E-16,这几乎不是零。