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



我正在用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度的棕褐色为163317787283838E+16。

我一直在努力寻找答案,但没有成功。我不知道如何显示正确的结果。

基本上,这似乎是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

所以我的猜测是,除非有人能进来提供一个变通方法,否则你可能不得不将其作为一个边缘案例来编程,以获得正确的结果。

任何三元函数的"正确结果"都将限制在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);
}

Round正按照它在锡上说的做:

可以返回的是15。如果舍入值包含超过15位数字,则返回15个最高有效数字。如果舍入值包含15位数或更少,整数位数和小数位数返回参数指定的数字。

1.63317787283838E+16是15个最高有效数字,没有小数部分。

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

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

(或使用,作为小数分隔符的任何其他区域设置)

请参阅:指数("E")格式说明符

 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("nn 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");
        }
    }
}

最新更新