C#Math.Sin()和Math.Log()不准确

时间:2012-01-25 19:01:23

标签: c# logging floating-accuracy sin

我创建的计算器程序几乎完美,除了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有关。有什么想法吗?

3 个答案:

答案 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,这几乎不是零。