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

时间:2014-08-01 00:19:47

标签: c# math floating-point

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

以下是应用

的屏幕截图

enter image description here

这是代码,

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

为什么会出现这样的行为?

2 个答案:

答案 0 :(得分:4)

这个问题已在问题Why does the google calculator give tan 90 degrees = 1.6331779e+16?

中的https://math.stackexchange.com/上得到解决(并且已经彻底解答)

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

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

CiteSeer也链接到其他位置:

答案 1 :(得分:3)

使用不完美的浮点数进行计算(不是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。