为什么Math.Tan(90)提供了非未定义的值?

在使用Math.Tan()我发现90度的结果并不是未定义的。 但是,是1.6331779e + 16

这是该应用程序的屏幕截图

在此处输入图像描述

这是代码,

 // convert to degrees angle = (Convert.ToDouble(op1) * Math.PI / 180); // write the output FinalResult.Text = Math.Tan(Convert.ToDouble(angle)).ToString(); 

为什么会出现这种行为?

使用不完美的浮点数进行计算(不是Math.PI无论如何都可以完美地表示为十进制)。

http://en.wikipedia.org/wiki/Floating_point

更具体地……

https://math.stackexchange.com/questions/536144/why-does-the-google-calculator-give-tan-90-degrees-1-6331779e16

如果您想要舍入结果,请检查输入是否>89.9999 && <90.00001 。 不要将==与浮点值一起使用。

为了解释为什么不使用==浮点数,尝试运行这个例子:

 var d = 0.2; for(double k = 1.0; k<100; k++) { var t = 0.2 * k; t = t / k; Console.WriteLine("{0} == {1} ==> {2}", d, t, d == t); } 

我们将0.2乘以整数,除以相同的整数,然后比较为0.2。 每次都应该如此,对吧? 不是。 很多时候它返回false。

这个问题已经在https://math.stackexchange.com/上解决了(并且非常彻底地回答了)问题为什么谷歌计算器给出tan 90度= 1.6331779e + 16?

换句话说……你需要阅读David Goldberg的论文, “每个计算机科学家应该知道的关于浮点算术的内容” 。 您可以在http://dl.acm.org/citation.cfm?id=103163上从ACM购买一份副本(如果您是ACM会员,则下载一份)。 其他版本也可以免费提供。

原文的副本见http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf 。 也:

CiteSeer也链接到其他位置: