ひどく設計された疑似コードを許してください。
float sqrt takes float n : [0,inf)
// fancy algorithm
return result
void main
x = sqrt -1 // Compilation error
y = sqrt float.max // This works
z = (y + 1) * (y + 1) // Compilation error (this would result in overflow)
コンパイル中に、コンパイラはsqrt
関数を分析し、次のように特徴付けます。
sqrt : [0,float.max] -> [0, sqrt float.max[
これは、+, -, *, /
演算子で同じことを行うことによって行われます。
関数では、負の入力を受け入れないmain
ため、最初のステートメントはコンパイルされません。sqrt
3 番目のステートメントはコンパイルされません。これは、*
演算子が の出力になる入力のみを受け取るためです[float.min, float.max]
。