0除算の結果定数

プログラミングC# 第6版


飛ばしていた例外の章について見ていきます。

double型の0で0除算をすると以下のような出力が得られます。

using System;

class Program {
    static void Main() {
        double i = 0.0;
        
        Console.WriteLine(0.0/i);
        Console.WriteLine(1.0/i);
        Console.WriteLine(-1.0/i);
    }
}
$ main
NaN (非数値)
+∞
-∞

なにやらNaNやら∞やら見慣れないものが表示されました。

これらはDoubleに定義されている定数ということです。それぞれ

Double.NaN
Double.PositiveInfinity
Double.NegativeInfinity

となっています。

またこれらを比較するための関数も存在しています。

using System;


class Program {
    static void Main() {
        Check(0.0);
        Check(1.0);
        Check(-1.0);
    }
    
    static void Check(double d) {
        double i = 0.0;
        
        Console.WriteLine("{0}/{1}",d,i);
        Console.WriteLine("Double.IsNaN              = {0}",Double.IsNaN(d/i));
        Console.WriteLine("Double.IsPositiveInfinity = {0}",Double.IsPositiveInfinity(d/i));
        Console.WriteLine("Double.IsNegativeInfinity = {0}",Double.IsNegativeInfinity(d/i));
        Console.WriteLine("Double.IsInfinity         = {0}",Double.IsInfinity(d/i));
    }
}
$ main
0/0
Double.IsNaN              = True
Double.IsPositiveInfinity = False
Double.IsNegativeInfinity = False
Double.IsInfinity         = False
1/0
Double.IsNaN              = False
Double.IsPositiveInfinity = True
Double.IsNegativeInfinity = False
Double.IsInfinity         = True
-1/0
Double.IsNaN              = False
Double.IsPositiveInfinity = False
Double.IsNegativeInfinity = True
Double.IsInfinity         = True

うまく比較できていますね。

ちなみにint型で0除算すると例外が発生します。

using System;

class Program {
    static void Main() {
        int i = 0;
        int j = 0 / i;
    }
}
$ main

ハンドルされていない例外: System.DivideByZeroException: 0 で除算しようとしました。
   場所 Program.Main()

doubleとintで挙動が違うので注意が必要ですね。