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

标签 c# logging floating-accuracy trigonometry

我创建的计算器程序几乎可以完美运行,但 Math.Sin() 和 Math.Log() 似乎有一些我无法查明的不准确之处。我会尽量提供详细信息。

Math.Sin() 问题:

首先,这不是弧度问题(至少据我所知)。数字作为 double 输入 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 的处理方式有关。有什么想法吗?

最佳答案

检查你的指数。当我在 VS 2010 调试评估器中评估 Math.Sin(Math.Pi) 时,我看到了这个:0.00000000000000012246063538223773

这将输出为 1.224e-16。

无论哪种方式,它都离零只有一步之遥。与许多浮点运算一样,足够接近应视为零。

关于C# Math.Sin() 和 Math.Log() 不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9008573/

相关文章:

c# - 从单个值创建新 IEnumerable<T> 序列的最喜欢的方法?

c# - JavaScript 哈希和等效的 .NET 算法

c# - 我怎样才能不笨拙地/乏味地阻止将空字符串写入类(class)成员的尝试?

c# - log4net 配置 - 找不到部分

计算没有上溢或下溢的 3D 欧几里德距离

math - float 学坏了吗?

c# - 统一: What's allocating memory in my function?

debugging - 如何从hammerhead 获得更详细的调试信息?

java - Log4j 日志记录性能

python - Python 的小数精度与 C 相比如何?