在使用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();
为什么会出现这样的行为?
答案 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
更具体地说..
如果您想要舍入结果,请检查输入是否为>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。