我在c#中有一个分区有问题,我得到+无限和无效。 我有这段代码:
double Sunrise = 0.0;
double Sunset = 0.0;
double Daylength = 0.0;
Sunrise = 12 - Math.Acos(CosWo) / (15 / 360 * 2 * Math.PI);
Sunset = 12 + Math.Acos(CosWo) / (15 / 360 * 2 * Math.PI);
Daylength = 2 * Math.Acos(CosWo) / (15 / 360 * 2 * Math.PI);
当我打印日落日出和日照的结果时,我的值为+无穷大和无穷大,我该怎么做才能解决这个问题。
答案 0 :(得分:4)
简短的故事是15/360
返回零(因为整数除法),然后Math.Acos(CosWo) / 0
将为+/-Infinity
,具体取决于Math.Acos(CosW)
的值。将代码更改为仅使用双打:15.0 / 360.0 * 2.0 * Math.PI
应该可以解决问题。
更详细的解释:
当您除以零时,您会看到+Infinity/-Infinity
作为双精度值。考虑一下,将数字除以零应该在技术上抛出异常,.NET将用于整数除法(1/0将抛出DivideByZeroExeption)。对于双打,IEEE-754标准(https://en.wikipedia.org/wiki/IEEE_754)定义当除以零时,您将获得+/-Infinity
。如果你考虑一下,这是有道理的,因为将接近零的越来越小的数字除以无穷大(尝试1 / 0.1,1 / 0.001,1 / 0.0001等等,并亲自看看)。
答案 1 :(得分:3)
您要除以整数值(360) - 尝试执行以下操作:
Sunrise = 12 - Math.Acos(CosWo) / (15 / 360.0 * 2 * Math.PI);
Sunset = 12 + Math.Acos(CosWo) / (15 / 360.0 * 2 * Math.PI);
Daylength = 2 * Math.Acos(CosWo) / (15 / 360.0 * 2 * Math.PI);