#pragma fenv_access on double SampleHypotenuse(double x, double y) { // May be called with any rounding. TFPEnvironmentSaveAndUpdate localEnvironment; double_t min = Min(Abs(x), Abs(y)); double_t max = Max(Abs(x), Abs(y)); try {TFPExceptionHandler invalidHandler(kFPInvalid); return max * SquareRoot(1.0 + Square(min / max)); }
catch (const TFPInvalidException& caughtInvalid) { localEnvironment.ClearFlags(kFPInvalid); // clear spurious exception return max; // two zeroes or two infinities } }
max
is much larger than min
, or if both are very tiny. There is never a serious error due to underflow.
max
is very large. The result is SampleHypotenuse(x, y)
is no greater than