双值划分

时间:2017-12-03 01:09:25

标签: c# double

我在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);

当我打印日落日出和日照的结果时,我的值为+无穷大和无穷大,我该怎么做才能解决这个问题。

2 个答案:

答案 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);