算術例外が必要な場合は、整数をゼロで割ってみてください。System.Double
( F#のfloat
) 型は、設計上、例外をスローしません (すべての例外的な状況は最終的に になりますNaN
)。
MSDN ドキュメントから:
代入演算子を含む浮動小数点演算子は、例外をスローしません。代わりに、例外的な状況では、浮動小数点演算の結果はゼロ、無限大、または NaN になります....
更新Infinity
:またはの場合に例外をスローする場合は、desco と同じアドバイスをNaN
提供し、呼び出したいメソッドをラップすることをお勧めします。
残念ながら、私は F# に精通しておらず、選択した言語でコード例を示すことができません。ただし、C# では、たとえば sqrt 関数に対してこれを行うことができます。
public static double CheckedSqrt(double x)
{
double sqrt = Math.Sqrt(x);
if (double.IsNaN(sqrt))
{
throw new ArithmeticException("The square root of " + x + " is NaN.");
}
return sqrt;
}
更新 2 : さらに別のオプションは、または値double
を許可しない型自体の独自のラッパーを作成することです (繰り返しますが、以下は C# です。F# でこれが不可能な場合は申し訳ありませんが、その場合は絶対に提供します)。役に立たないアドバイス):Infinity
NaN
public struct CheckedDouble // : IEquatable<CheckedDouble>, etc.
{
double m_value;
public CheckedDouble(double value)
{
if (double.IsInfinity(value) || double.IsNaN(value))
{
throw new ArithmeticException("A calculation resulted in infinity or NaN.");
}
m_value = value;
}
public static implicit operator CheckedDouble(double value)
{
return new CheckedDouble(value);
}
public static implicit operator double(CheckedDouble checkedDouble)
{
return checkedDouble.m_value;
}
}
Infinity
次に、またはを許可したくないコードを記述している場合は、直接NaN
ではなくこの型を使用double
します。
ちょうど別のオプション。