2017-12-03 10 views
0

私はC#の除算に問題があります。+ infinityと-infityがあります。 私はこのコードを持っている:私はそれらの値のために無限大と-infity +得た日の入り日の出と日長の結果を印刷するときダブル値の除算

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

デバッガを使用する;-) –

答えて

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); 
3

ショートストーリーが15/360が(理由は整数除算の)ゼロを返し、その後、Math.Acos(CosWo)/0されること+/-Infinityになるということです、 Math.Acos(CosW)の値によって異なります。 doubleを使用するようにコードを変更する場合:15.0/360.0 * 2.0 * Math.PIで問題を修正する必要があります。

より詳細な説明:

あなたがゼロで割るときは、ダブルスの値として+Infinity/-Infinityが表示されます。それについて考えると、数値を0で割ると技術的に例外がスローされるはずです。これは.NETが整数除算(1/0はDivideByZeroExeptionをスローします)です。倍精度の場合、IEEE-754標準(https://en.wikipedia.org/wiki/IEEE_754)では、0で割ると+/-Infinityが得られることが定義されています。これについて考えてみると、ゼロに近い小さな数値で割ると無限大になるので(1/0.1,1/0.001,1/0.0001などを試して見てください)、これは意味があります。