C # Math.Sin () и Math.Log () неточности - PullRequest
4 голосов
/ 25 января 2012

Созданная мною программа калькулятора работает почти идеально, за исключением того, что Math.Sin () и Math.Log (), похоже, имеют некоторые неточности, от которых я не могу до конца разобраться.Я постараюсь дать как можно больше подробностей.

Math.Sin () Проблема:

Во-первых, это НЕ проблема радиан (по крайней мере, насколькоЯ могу сказать).Числа передаются в Math.Sin () как двойные.Он работает для некоторых значений в градусах и радианах, но не для других, например, 180 и пи соответственно.Теперь для некоторого кода:

    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 является двойным и (вместе со secondOperand) используется для последующих вычислений, которые будут иметь место.Я думаю, что другие части кода говорят сами за себя, но я буду рад разработать в случае необходимости.Math.Sin (Math.PI) = 1,224 ... вместо 0, как и должно быть.Однако Math.Sin (Math.PI / 4) = 0,707 ... как и ожидалось.Кроме того, это только когда пи генерируется как 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 ]

9 голосов
/ 25 января 2012

Проверьте свои показатели.Когда я оцениваю Math.Sin (Math.Pi) в оценщике отладки VS 2010, я вижу это: 0,00000000000000012246063538223773

Это будет выводиться как 1,224e-16.

В любом случае, это простоширина волос с нуля.Как и во многих операциях с плавающей точкой, достаточно близко следует считать ноль.

6 голосов
/ 25 января 2012

Math.Sin(Math.PI) => 1.2246063538223773e-16, что в значительной степени равно 0, а не 1.224

Я подозреваю, что то же самое относится и к вашему Log(e) коду.

1 голос
/ 25 января 2012

Math.Sin (Math.PI) = 1,224 ... вместо 0, как следует

Это на самом деле не 1,224, а скорее 1,22460635382238E-16, что почти, но не совсемноль.

...