Task

Write a function to detect a   divide by zero error   without checking if the denominator is zero.




import std.stdio, std.string, std.math, std.traits;
 
string divCheck(T)(in T numer, in T denom)
if (isIntegral!T || isFloatingPoint!T) {
    Unqual!(typeof(numer / denom)) result;
    string msg;
 
    static if (isIntegral!T) {
        try {
            result = numer / denom;
        } catch(Error e) {
            msg = "| " ~ e.msg ~ " (by Error)";
            result = T.max;
        }
    } else { // Floating Point Type.
        result = numer / denom;
        if (numer.isNormal && result.isInfinity) {
            msg = "| Division by Zero";
        } else if (result != 0 && !result.isNormal) {
            if (numer.isNaN)
                msg = "| NaN numerator";
            else if (denom.isNaN)
                msg = "| NaN denominator";
            else if (numer.isInfinity)
                msg = "| Inf numerator";
            else
                msg = "| NaN (Zero Division by Zero)";
        }
    }
 
    return format("%5s %s", format("%1.1g", real(result)), msg);
}
 
void main() {
    writeln("Division with check:");
    writefln("int     1/ 0:   %s", divCheck(1, 0));
    writefln("ubyte   1/ 0:   %s", divCheck(ubyte(1), ubyte(0)));
    writefln("real    1/ 0:   %s", divCheck(1.0L, 0.0L));
    writefln("real   -1/ 0:   %s", divCheck(-1.0L, 0.0L));
    writefln("real    0/ 0:   %s", divCheck(0.0L, 0.0L));
    writeln;
    writefln("real   -4/-2:   %s", divCheck(-4.0L,-2.0L));
    writefln("real    2/-inf: %s", divCheck(2.0L, -real.infinity));
    writeln;
    writefln("real -inf/-2:   %s", divCheck(-real.infinity, -2.0L));
    writefln("real +inf/-2:   %s", divCheck(real.infinity, -2.0L));
    writefln("real  nan/-2:   %s", divCheck(real.nan, -2.0L));
    writefln("real   -2/ nan: %s", divCheck(-2.0L, real.nan));
    writefln("real  nan/ 0:   %s", divCheck(real.nan, 0.0L));
    writefln("real  inf/ inf: %s",
             divCheck(real.infinity, real.infinity));
    writefln("real  nan/ nan: %s", divCheck(real.nan, real.nan));
}