Math.Sin,Math.Cos和Math.Tan精确度和正确显示它们的方法

时间:2012-08-24 11:35:18

标签: c# .net winforms math

我正在使用C#编写计算器。

textBoxResult是一个文本框,我在其中显示数字

recount是以度为单位取角度并以弧度为单位的函数

我从texBoxInput

采取角度
public double recount(int number)
{
    double wyjscie = 0.0;
    double Number = number;
    wyjscie = Number * (Math.PI / 180);
    return wyjscie;
}

//function which is called out when user presses the button:
textBoxResult.Text = Math.Round(Math.Tan(recount(Convert.ToInt32(texBoxInput.Text))),2).ToString();

正如您所看到的,我在尝试使用Math.Tan时对此数字进行舍入,但仍Math.Tan给我从90度开始的褐色为1,63317787283838E + 16。

我一直试图找到答案,但失败了。我无法弄清楚如何显示正确的结果。

3 个答案:

答案 0 :(得分:3)

基本上,这似乎是来自Math.Tan的预期行为。我不太了解其他语言,所以我不确定这对于浮点数学是否正常或者是否特定于C#实现。 (注意:之后,我发现谷歌的在线计算器返回相同的建议,表明浮点三角函数的预期行为,可能与 pi 不合理的事实和双精度数据类型的限制有关)

然而,从这个结果向后工作,我发现Math.Atan(// your result);Math.Atan(double.PositiveInfinity)都返回90度,表明这是预料到的?

这是我的测试:

var deg = 90.0;
var rads = deg * (Math.PI / 180);
var result = Math.Tan(rads);

if (Double.IsInfinity(result))
    Console.WriteLine("Tan of 90 degrees is Infinity");
else if (Double.IsNaN(result))
    Console.WriteLine("Tan of 90 degrees is Undefined");
else
    Console.WriteLine("Tan of 90 degrees is {0}", result);

Console.WriteLine("Arc Tan of {0} is {1} degrees", double.PositiveInfinity, Math.Atan(double.PositiveInfinity) * 180 / Math.PI);
Console.WriteLine("Arc Tan of {0} is {1} degrees", result, Math.Atan(result) * 180 / Math.PI);

这给出了输出:

Tan of 90 degrees is 1.63317787283838E+16
Arc Tan of Infinity is 90 degrees
Arc Tan of 1.63317787283838E+16 is 90 degrees

所以我的猜测是,除非有人可以进入并提供解决方法,否则您可能需要围绕此进行编程以获得正确的结果。

任何trig函数的“正确结果”将被限制为double的精度,这是15位有效数字,所以如果你需要更多,你需要找到一个支持的库更精确的数学。

由于Math.Tan(Math.PI/2)似乎提供了不良反应,您可以执行以下操作:

public double ComputeTangent(double angleRads)
{
    if (angleRads == Math.PI/2)
        return double.PositiveInfinity
    if (angleRads == - Math.PI/2)
        return double.NegativeInfinity

    return Math.Tan(angleRads);
}

答案 1 :(得分:1)

Round正在进行exactly what it says on the tin

  

可以是的最大总积分和小数位数   返回为15.如果舍入值包含超过15位数,则返回   返回15个最高有效数字。如果舍入值包含   15位或更少的数字,整数位和多个小数位   正如数字参数指定的那样返回。

1.63317787283838E+16是15位最重要的数字,并且没有小数部分。

如果您希望将其显示为1,63E+016,则可以使用:

number.ToString('E2', CultureInfo.CreateSpecificCulture("fr-FR"))

(或使用,作为小数分隔符的任何其他语言环境)

请参阅:The Exponential ("E") Format Specifier

答案 2 :(得分:1)

 using System;

namespace Lab_Ex_12
{
    class SimpleCalculator
    {
        double num1, num2;
        public void read()
        {
            Console.WriteLine("\n Enter any two numbers:");
            Console.Write("\n Number1 : ");
            num1 = double.Parse(Console.ReadLine());
            Console.Write("\n Number2 : ");
            num2 = double.Parse(Console.ReadLine());
        }
        public void add()
        {
            double sum = num1 + num2;
            Console.WriteLine("\n Result : ({0}) + ({1}) = {2}", num1, num2, sum);
        }
        public void subtract()
        {
            double diff = num1 - num2;
            Console.WriteLine("\n Result : ({0}) - ({1}) = {2}", num1, num2, diff);
        }
        public void multiply()
        {
            double prod = num1 * num2;
            Console.WriteLine("\n Result : ({0}) X ({1}) = {2}", num1, num2, prod);
        }
        public void divide()
        {
            double qt = num1 / num2;
            Console.WriteLine("\n Result : ({0}) / ({1}) = {2}", num1, num2, qt);
        }
    }
    class ArithmeticOperations
    {
        public static void Main()
        {
            SimpleCalculator SC = new SimpleCalculator();
            int ch, i=1;
            while(i==1)
            {
                Console.Clear();
                Console.WriteLine("\n *************************");
                Console.WriteLine("\n   ZAHID SIMPLE CALCULATOR.");
                Console.WriteLine("\n *************************");
                Console.WriteLine("\n 1-----> ADDITION");
                Console.WriteLine("\n 2-----> SUBTRACTION");
                Console.WriteLine("\n 3-----> MULTIPLICATION");
                Console.WriteLine("\n 4-----> DIVISION");
                Console.WriteLine("\n 5-----> EXIT");
                Console.WriteLine("\n *************************");
                Console.Write("\n\n Enter your choice: ");
                ch = int.Parse(Console.ReadLine());
                switch (ch)
                {
                    case 1: SC.read();
                            SC.add();
                            break;
                    case 2: SC.read();
                            SC.subtract();
                            break;
                    case 3: SC.read();
                            SC.multiply();
                            break;
                    case 4: SC.read();
                            SC.divide();
                            break;
                    case 5: Environment.Exit(-1);
                            break;
                    default: Console.WriteLine(" Sorry !!! Wrong  choice.");
                            break;
                }
                Console.Write("\n Press ENTER to Continue. ");
                Console.ReadLine();
            }
            Console.WriteLine("\n Cannot continue... Bye");
        }
    }
}