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 ,我试图将这个数字Math.Tan ,但Math.Tan仍然给出了从90度开始的tan为1,63317787283838E + 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 

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

任何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); } 

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