// using System; public struct UDouble { private double number; public UDouble(double value) { if (value < 0) throw new InvalidCastException("A negative value cannot be converted to a UDouble."); number = value; } public UDouble(float value) { if (value < 0) throw new InvalidCastException("A negative value cannot be converted to a UDouble."); number = value; } public static readonly UDouble MinValue = (UDouble) 0.0; public static readonly UDouble MaxValue = (UDouble) Double.MaxValue; public static explicit operator Double(UDouble value) { return value.number; } public static implicit operator Single(UDouble value) { if (value.number > (double) Single.MaxValue) throw new InvalidCastException("A UDouble value is out of range of the Single type."); return (float) value.number; } public static explicit operator UDouble(double value) { if (value < 0) throw new InvalidCastException("A negative value cannot be converted to a UDouble."); return new UDouble(value); } public static implicit operator UDouble(float value) { if (value < 0) throw new InvalidCastException("A negative value cannot be converted to a UDouble."); return new UDouble(value); } public static Double ToDouble(UDouble value) { return (Double) value; } public static float ToSingle(UDouble value) { return (float) value; } public static UDouble FromDouble(double value) { return new UDouble(value); } public static UDouble FromSingle(float value) { return new UDouble(value); } } // public class Example { public static void Main() { UDouble max = new UDouble(Double.MaxValue); UDouble neg = new UDouble(-3.0); } }