using System.Diagnostics; using System.Globalization; using System.Runtime.InteropServices; namespace System { /// /// Represents a half-precision floating point number. /// /// /// Note: /// Half is not fast enought and precision is also very bad, /// so is should not be used for matemathical computation (use Single instead). /// The main advantage of Half type is lower memory cost: two bytes per number. /// Half is typically used in graphical applications. /// /// Note: /// All functions, where is used conversion half->float/float->half, /// are approx. ten times slower than float->double/double->float, i.e. ~3ns on 2GHz CPU. /// /// References: /// - Fast Half Float Conversions, Jeroen van der Zijp, link: http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf /// - IEEE 754 revision, link: http://grouper.ieee.org/groups/754/ /// [Serializable] public struct Half : IComparable, IFormattable, IConvertible, IComparable, IEquatable { /// /// Internal representation of the half-precision floating-point number. /// [DebuggerBrowsable(DebuggerBrowsableState.Never)] internal ushort value; #region Constants /// /// Represents the smallest positive System.Half value greater than zero. This field is constant. /// public static readonly Half Epsilon = Half.ToHalf(0x0001); /// /// Represents the largest possible value of System.Half. This field is constant. /// public static readonly Half MaxValue = Half.ToHalf(0x7bff); /// /// Represents the smallest possible value of System.Half. This field is constant. /// public static readonly Half MinValue = Half.ToHalf(0xfbff); /// /// Represents not a number (NaN). This field is constant. /// public static readonly Half NaN = Half.ToHalf(0xfe00); /// /// Represents negative infinity. This field is constant. /// public static readonly Half NegativeInfinity = Half.ToHalf(0xfc00); /// /// Represents positive infinity. This field is constant. /// public static readonly Half PositiveInfinity = Half.ToHalf(0x7c00); #endregion #region Constructors /// /// Initializes a new instance of System.Half to the value of the specified single-precision floating-point number. /// /// The value to represent as a System.Half. public Half(float value) { this = HalfHelper.SingleToHalf(value); } /// /// Initializes a new instance of System.Half to the value of the specified 32-bit signed integer. /// /// The value to represent as a System.Half. public Half(int value) : this((float)value) { } /// /// Initializes a new instance of System.Half to the value of the specified 64-bit signed integer. /// /// The value to represent as a System.Half. public Half(long value) : this((float)value) { } /// /// Initializes a new instance of System.Half to the value of the specified double-precision floating-point number. /// /// The value to represent as a System.Half. public Half(double value) : this((float)value) { } /// /// Initializes a new instance of System.Half to the value of the specified decimal number. /// /// The value to represent as a System.Half. public Half(decimal value) : this((float)value) { } /// /// Initializes a new instance of System.Half to the value of the specified 32-bit unsigned integer. /// /// The value to represent as a System.Half. public Half(uint value) : this((float)value) { } /// /// Initializes a new instance of System.Half to the value of the specified 64-bit unsigned integer. /// /// The value to represent as a System.Half. public Half(ulong value) : this((float)value) { } #endregion #region Numeric operators /// /// Returns the result of multiplying the specified System.Half value by negative one. /// /// A System.Half. /// A System.Half with the value of half, but the opposite sign. -or- Zero, if half is zero. public static Half Negate(Half half) { return -half; } /// /// Adds two specified System.Half values. /// /// A System.Half. /// A System.Half. /// A System.Half value that is the sum of half1 and half2. public static Half Add(Half half1, Half half2) { return half1 + half2; } /// /// Subtracts one specified System.Half value from another. /// /// A System.Half (the minuend). /// A System.Half (the subtrahend). /// The System.Half result of subtracting half2 from half1. public static Half Subtract(Half half1, Half half2) { return half1 - half2; } /// /// Multiplies two specified System.Half values. /// /// A System.Half (the multiplicand). /// A System.Half (the multiplier). /// A System.Half that is the result of multiplying half1 and half2. public static Half Multiply(Half half1, Half half2) { return half1 * half2; } /// /// Divides two specified System.Half values. /// /// A System.Half (the dividend). /// A System.Half (the divisor). /// The System.Half that is the result of dividing half1 by half2. /// half2 is zero. public static Half Divide(Half half1, Half half2) { return half1 / half2; } /// /// Returns the value of the System.Half operand (the sign of the operand is unchanged). /// /// The System.Half operand. /// The value of the operand, half. public static Half operator +(Half half) { return half; } /// /// Negates the value of the specified System.Half operand. /// /// The System.Half operand. /// The result of half multiplied by negative one (-1). public static Half operator -(Half half) { return HalfHelper.Negate(half); } /// /// Increments the System.Half operand by 1. /// /// The System.Half operand. /// The value of half incremented by 1. public static Half operator ++(Half half) { return (Half)(half + 1f); } /// /// Decrements the System.Half operand by one. /// /// The System.Half operand. /// The value of half decremented by 1. public static Half operator --(Half half) { return (Half)(half - 1f); } /// /// Adds two specified System.Half values. /// /// A System.Half. /// A System.Half. /// The System.Half result of adding half1 and half2. public static Half operator +(Half half1, Half half2) { return (Half)((float)half1 + (float)half2); } /// /// Subtracts two specified System.Half values. /// /// A System.Half. /// A System.Half. /// The System.Half result of subtracting half1 and half2. public static Half operator -(Half half1, Half half2) { return (Half)((float)half1 - (float)half2); } /// /// Multiplies two specified System.Half values. /// /// A System.Half. /// A System.Half. /// The System.Half result of multiplying half1 by half2. public static Half operator *(Half half1, Half half2) { return (Half)((float)half1 * (float)half2); } /// /// Divides two specified System.Half values. /// /// A System.Half (the dividend). /// A System.Half (the divisor). /// The System.Half result of half1 by half2. public static Half operator /(Half half1, Half half2) { return (Half)((float)half1 / (float)half2); } /// /// Returns a value indicating whether two instances of System.Half are equal. /// /// A System.Half. /// A System.Half. /// true if half1 and half2 are equal; otherwise, false. public static bool operator ==(Half half1, Half half2) { return (!IsNaN(half1) && (half1.value == half2.value)); } /// /// Returns a value indicating whether two instances of System.Half are not equal. /// /// A System.Half. /// A System.Half. /// true if half1 and half2 are not equal; otherwise, false. public static bool operator !=(Half half1, Half half2) { return !(half1.value == half2.value); } /// /// Returns a value indicating whether a specified System.Half is less than another specified System.Half. /// /// A System.Half. /// A System.Half. /// true if half1 is less than half1; otherwise, false. public static bool operator <(Half half1, Half half2) { return (float)half1 < (float)half2; } /// /// Returns a value indicating whether a specified System.Half is greater than another specified System.Half. /// /// A System.Half. /// A System.Half. /// true if half1 is greater than half2; otherwise, false. public static bool operator >(Half half1, Half half2) { return (float)half1 > (float)half2; } /// /// Returns a value indicating whether a specified System.Half is less than or equal to another specified System.Half. /// /// A System.Half. /// A System.Half. /// true if half1 is less than or equal to half2; otherwise, false. public static bool operator <=(Half half1, Half half2) { return (half1 == half2) || (half1 < half2); } /// /// Returns a value indicating whether a specified System.Half is greater than or equal to another specified System.Half. /// /// A System.Half. /// A System.Half. /// true if half1 is greater than or equal to half2; otherwise, false. public static bool operator >=(Half half1, Half half2) { return (half1 == half2) || (half1 > half2); } #endregion #region Type casting operators /// /// Converts an 8-bit unsigned integer to a System.Half. /// /// An 8-bit unsigned integer. /// A System.Half that represents the converted 8-bit unsigned integer. public static implicit operator Half(byte value) { return new Half((float)value); } /// /// Converts a 16-bit signed integer to a System.Half. /// /// A 16-bit signed integer. /// A System.Half that represents the converted 16-bit signed integer. public static implicit operator Half(short value) { return new Half((float)value); } /// /// Converts a Unicode character to a System.Half. /// /// A Unicode character. /// A System.Half that represents the converted Unicode character. public static implicit operator Half(char value) { return new Half((float)value); } /// /// Converts a 32-bit signed integer to a System.Half. /// /// A 32-bit signed integer. /// A System.Half that represents the converted 32-bit signed integer. public static implicit operator Half(int value) { return new Half((float)value); } /// /// Converts a 64-bit signed integer to a System.Half. /// /// A 64-bit signed integer. /// A System.Half that represents the converted 64-bit signed integer. public static implicit operator Half(long value) { return new Half((float)value); } /// /// Converts a single-precision floating-point number to a System.Half. /// /// A single-precision floating-point number. /// A System.Half that represents the converted single-precision floating point number. public static explicit operator Half(float value) { return new Half((float)value); } /// /// Converts a double-precision floating-point number to a System.Half. /// /// A double-precision floating-point number. /// A System.Half that represents the converted double-precision floating point number. public static explicit operator Half(double value) { return new Half((float)value); } /// /// Converts a decimal number to a System.Half. /// /// decimal number /// A System.Half that represents the converted decimal number. public static explicit operator Half(decimal value) { return new Half((float)value); } /// /// Converts a System.Half to an 8-bit unsigned integer. /// /// A System.Half to convert. /// An 8-bit unsigned integer that represents the converted System.Half. public static explicit operator byte(Half value) { return (byte)(float)value; } /// /// Converts a System.Half to a Unicode character. /// /// A System.Half to convert. /// A Unicode character that represents the converted System.Half. public static explicit operator char(Half value) { return (char)(float)value; } /// /// Converts a System.Half to a 16-bit signed integer. /// /// A System.Half to convert. /// A 16-bit signed integer that represents the converted System.Half. public static explicit operator short(Half value) { return (short)(float)value; } /// /// Converts a System.Half to a 32-bit signed integer. /// /// A System.Half to convert. /// A 32-bit signed integer that represents the converted System.Half. public static explicit operator int(Half value) { return (int)(float)value; } /// /// Converts a System.Half to a 64-bit signed integer. /// /// A System.Half to convert. /// A 64-bit signed integer that represents the converted System.Half. public static explicit operator long(Half value) { return (long)(float)value; } /// /// Converts a System.Half to a single-precision floating-point number. /// /// A System.Half to convert. /// A single-precision floating-point number that represents the converted System.Half. public static implicit operator float(Half value) { return (float)HalfHelper.HalfToSingle(value); } /// /// Converts a System.Half to a double-precision floating-point number. /// /// A System.Half to convert. /// A double-precision floating-point number that represents the converted System.Half. public static implicit operator double(Half value) { return (double)(float)value; } /// /// Converts a System.Half to a decimal number. /// /// A System.Half to convert. /// A decimal number that represents the converted System.Half. public static explicit operator decimal(Half value) { return (decimal)(float)value; } /// /// Converts an 8-bit signed integer to a System.Half. /// /// An 8-bit signed integer. /// A System.Half that represents the converted 8-bit signed integer. public static implicit operator Half(sbyte value) { return new Half((float)value); } /// /// Converts a 16-bit unsigned integer to a System.Half. /// /// A 16-bit unsigned integer. /// A System.Half that represents the converted 16-bit unsigned integer. public static implicit operator Half(ushort value) { return new Half((float)value); } /// /// Converts a 32-bit unsigned integer to a System.Half. /// /// A 32-bit unsigned integer. /// A System.Half that represents the converted 32-bit unsigned integer. public static implicit operator Half(uint value) { return new Half((float)value); } /// /// Converts a 64-bit unsigned integer to a System.Half. /// /// A 64-bit unsigned integer. /// A System.Half that represents the converted 64-bit unsigned integer. public static implicit operator Half(ulong value) { return new Half((float)value); } /// /// Converts a System.Half to an 8-bit signed integer. /// /// A System.Half to convert. /// An 8-bit signed integer that represents the converted System.Half. public static explicit operator sbyte(Half value) { return (sbyte)(float)value; } /// /// Converts a System.Half to a 16-bit unsigned integer. /// /// A System.Half to convert. /// A 16-bit unsigned integer that represents the converted System.Half. public static explicit operator ushort(Half value) { return (ushort)(float)value; } /// /// Converts a System.Half to a 32-bit unsigned integer. /// /// A System.Half to convert. /// A 32-bit unsigned integer that represents the converted System.Half. public static explicit operator uint(Half value) { return (uint)(float)value; } /// /// Converts a System.Half to a 64-bit unsigned integer. /// /// A System.Half to convert. /// A 64-bit unsigned integer that represents the converted System.Half. public static explicit operator ulong(Half value) { return (ulong)(float)value; } #endregion /// /// Compares this instance to a specified System.Half object. /// /// A System.Half object. /// /// A signed number indicating the relative values of this instance and value. /// Return Value Meaning Less than zero This instance is less than value. Zero /// This instance is equal to value. Greater than zero This instance is greater than value. /// public int CompareTo(Half other) { int result = 0; if (this < other) { result = -1; } else if (this > other) { result = 1; } else if (this != other) { if (!IsNaN(this)) { result = 1; } else if (!IsNaN(other)) { result = -1; } } return result; } /// /// Compares this instance to a specified System.Object. /// /// An System.Object or null. /// /// A signed number indicating the relative values of this instance and value. /// Return Value Meaning Less than zero This instance is less than value. Zero /// This instance is equal to value. Greater than zero This instance is greater /// than value. -or- value is null. /// /// value is not a System.Half public int CompareTo(object obj) { int result = 0; if (obj == null) { result = 1; } else { if (obj is Half) { result = CompareTo((Half)obj); } else { throw new ArgumentException("Object must be of type Half."); } } return result; } /// /// Returns a value indicating whether this instance and a specified System.Half object represent the same value. /// /// A System.Half object to compare to this instance. /// true if value is equal to this instance; otherwise, false. public bool Equals(Half other) { return ((other == this) || (IsNaN(other) && IsNaN(this))); } /// /// Returns a value indicating whether this instance and a specified System.Object /// represent the same type and value. /// /// An System.Object. /// true if value is a System.Half and equal to this instance; otherwise, false. public override bool Equals(object obj) { bool result = false; if (obj is Half) { Half half = (Half)obj; if ((half == this) || (IsNaN(half) && IsNaN(this))) { result = true; } } return result; } /// /// Returns the hash code for this instance. /// /// A 32-bit signed integer hash code. public override int GetHashCode() { return value.GetHashCode(); } /// /// Returns the System.TypeCode for value type System.Half. /// /// The enumerated constant (TypeCode)255. public TypeCode GetTypeCode() { return (TypeCode)255; } #region BitConverter & Math methods for Half /// /// Returns the specified half-precision floating point value as an array of bytes. /// /// The number to convert. /// An array of bytes with length 2. public static byte[] GetBytes(Half value) { return BitConverter.GetBytes(value.value); } /// /// Converts the value of a specified instance of System.Half to its equivalent binary representation. /// /// A System.Half value. /// A 16-bit unsigned integer that contain the binary representation of value. public static ushort GetBits(Half value) { return value.value; } /// /// Returns a half-precision floating point number converted from two bytes /// at a specified position in a byte array. /// /// An array of bytes. /// The starting position within value. /// A half-precision floating point number formed by two bytes beginning at startIndex. /// /// startIndex is greater than or equal to the length of value minus 1, and is /// less than or equal to the length of value minus 1. /// /// value is null. /// startIndex is less than zero or greater than the length of value minus 1. public static Half ToHalf(byte[] value, int startIndex) { return Half.ToHalf((ushort)BitConverter.ToInt16(value, startIndex)); } /// /// Returns a half-precision floating point number converted from its binary representation. /// /// Binary representation of System.Half value /// A half-precision floating point number formed by its binary representation. public static Half ToHalf(ushort bits) { return new Half { value = bits }; } /// /// Returns a value indicating the sign of a half-precision floating-point number. /// /// A signed number. /// /// A number indicating the sign of value. Number Description -1 value is less /// than zero. 0 value is equal to zero. 1 value is greater than zero. /// /// value is equal to System.Half.NaN. public static int Sign(Half value) { if (value < 0) { return -1; } else if (value > 0) { return 1; } else { if (value != 0) { throw new ArithmeticException("Function does not accept floating point Not-a-Number values."); } } return 0; } /// /// Returns the absolute value of a half-precision floating-point number. /// /// A number in the range System.Half.MinValue ≤ value ≤ System.Half.MaxValue. /// A half-precision floating-point number, x, such that 0 ≤ x ≤System.Half.MaxValue. public static Half Abs(Half value) { return HalfHelper.Abs(value); } /// /// Returns the larger of two half-precision floating-point numbers. /// /// The first of two half-precision floating-point numbers to compare. /// The second of two half-precision floating-point numbers to compare. /// /// Parameter value1 or value2, whichever is larger. If value1, or value2, or both val1 /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. /// public static Half Max(Half value1, Half value2) { return (value1 < value2) ? value2 : value1; } /// /// Returns the smaller of two half-precision floating-point numbers. /// /// The first of two half-precision floating-point numbers to compare. /// The second of two half-precision floating-point numbers to compare. /// /// Parameter value1 or value2, whichever is smaller. If value1, or value2, or both val1 /// and value2 are equal to System.Half.NaN, System.Half.NaN is returned. /// public static Half Min(Half value1, Half value2) { return (value1 < value2) ? value1 : value2; } #endregion /// /// Returns a value indicating whether the specified number evaluates to not a number (System.Half.NaN). /// /// A half-precision floating-point number. /// true if value evaluates to not a number (System.Half.NaN); otherwise, false. public static bool IsNaN(Half half) { return HalfHelper.IsNaN(half); } /// /// Returns a value indicating whether the specified number evaluates to negative or positive infinity. /// /// A half-precision floating-point number. /// true if half evaluates to System.Half.PositiveInfinity or System.Half.NegativeInfinity; otherwise, false. public static bool IsInfinity(Half half) { return HalfHelper.IsInfinity(half); } /// /// Returns a value indicating whether the specified number evaluates to negative infinity. /// /// A half-precision floating-point number. /// true if half evaluates to System.Half.NegativeInfinity; otherwise, false. public static bool IsNegativeInfinity(Half half) { return HalfHelper.IsNegativeInfinity(half); } /// /// Returns a value indicating whether the specified number evaluates to positive infinity. /// /// A half-precision floating-point number. /// true if half evaluates to System.Half.PositiveInfinity; otherwise, false. public static bool IsPositiveInfinity(Half half) { return HalfHelper.IsPositiveInfinity(half); } #region String operations (Parse and ToString) /// /// Converts the string representation of a number to its System.Half equivalent. /// /// The string representation of the number to convert. /// The System.Half number equivalent to the number contained in value. /// value is null. /// value is not in the correct format. /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. public static Half Parse(string value) { return (Half)float.Parse(value, CultureInfo.InvariantCulture); } /// /// Converts the string representation of a number to its System.Half equivalent /// using the specified culture-specific format information. /// /// The string representation of the number to convert. /// An System.IFormatProvider that supplies culture-specific parsing information about value. /// The System.Half number equivalent to the number contained in s as specified by provider. /// value is null. /// value is not in the correct format. /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. public static Half Parse(string value, IFormatProvider provider) { return (Half)float.Parse(value, provider); } /// /// Converts the string representation of a number in a specified style to its System.Half equivalent. /// /// The string representation of the number to convert. /// /// A bitwise combination of System.Globalization.NumberStyles values that indicates /// the style elements that can be present in value. A typical value to specify is /// System.Globalization.NumberStyles.Number. /// /// The System.Half number equivalent to the number contained in s as specified by style. /// value is null. /// /// style is not a System.Globalization.NumberStyles value. -or- style is the /// System.Globalization.NumberStyles.AllowHexSpecifier value. /// /// value is not in the correct format. /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. public static Half Parse(string value, NumberStyles style) { return (Half)float.Parse(value, style, CultureInfo.InvariantCulture); } /// /// Converts the string representation of a number to its System.Half equivalent /// using the specified style and culture-specific format. /// /// The string representation of the number to convert. /// /// A bitwise combination of System.Globalization.NumberStyles values that indicates /// the style elements that can be present in value. A typical value to specify is /// System.Globalization.NumberStyles.Number. /// /// An System.IFormatProvider object that supplies culture-specific information about the format of value. /// The System.Half number equivalent to the number contained in s as specified by style and provider. /// value is null. /// /// style is not a System.Globalization.NumberStyles value. -or- style is the /// System.Globalization.NumberStyles.AllowHexSpecifier value. /// /// value is not in the correct format. /// value represents a number less than System.Half.MinValue or greater than System.Half.MaxValue. public static Half Parse(string value, NumberStyles style, IFormatProvider provider) { return (Half)float.Parse(value, style, provider); } /// /// Converts the string representation of a number to its System.Half equivalent. /// A return value indicates whether the conversion succeeded or failed. /// /// The string representation of the number to convert. /// /// When this method returns, contains the System.Half number that is equivalent /// to the numeric value contained in value, if the conversion succeeded, or is zero /// if the conversion failed. The conversion fails if the s parameter is null, /// is not a number in a valid format, or represents a number less than System.Half.MinValue /// or greater than System.Half.MaxValue. This parameter is passed uninitialized. /// /// true if s was converted successfully; otherwise, false. public static bool TryParse(string value, out Half result) { float f; if (float.TryParse(value, out f)) { result = (Half)f; return true; } result = new Half(); return false; } /// /// Converts the string representation of a number to its System.Half equivalent /// using the specified style and culture-specific format. A return value indicates /// whether the conversion succeeded or failed. /// /// The string representation of the number to convert. /// /// A bitwise combination of System.Globalization.NumberStyles values that indicates /// the permitted format of value. A typical value to specify is System.Globalization.NumberStyles.Number. /// /// An System.IFormatProvider object that supplies culture-specific parsing information about value. /// /// When this method returns, contains the System.Half number that is equivalent /// to the numeric value contained in value, if the conversion succeeded, or is zero /// if the conversion failed. The conversion fails if the s parameter is null, /// is not in a format compliant with style, or represents a number less than /// System.Half.MinValue or greater than System.Half.MaxValue. This parameter is passed uninitialized. /// /// true if s was converted successfully; otherwise, false. /// /// style is not a System.Globalization.NumberStyles value. -or- style /// is the System.Globalization.NumberStyles.AllowHexSpecifier value. /// public static bool TryParse(string value, NumberStyles style, IFormatProvider provider, out Half result) { bool parseResult = false; float f; if (float.TryParse(value, style, provider, out f)) { result = (Half)f; parseResult = true; } else { result = new Half(); } return parseResult; } /// /// Converts the numeric value of this instance to its equivalent string representation. /// /// A string that represents the value of this instance. public override string ToString() { return ((float)this).ToString(CultureInfo.InvariantCulture); } /// /// Converts the numeric value of this instance to its equivalent string representation /// using the specified culture-specific format information. /// /// An System.IFormatProvider that supplies culture-specific formatting information. /// The string representation of the value of this instance as specified by provider. public string ToString(IFormatProvider formatProvider) { return ((float)this).ToString(formatProvider); } /// /// Converts the numeric value of this instance to its equivalent string representation, using the specified format. /// /// A numeric format string. /// The string representation of the value of this instance as specified by format. public string ToString(string format) { return ((float)this).ToString(format, CultureInfo.InvariantCulture); } /// /// Converts the numeric value of this instance to its equivalent string representation /// using the specified format and culture-specific format information. /// /// A numeric format string. /// An System.IFormatProvider that supplies culture-specific formatting information. /// The string representation of the value of this instance as specified by format and provider. /// format is invalid. public string ToString(string format, IFormatProvider formatProvider) { return ((float)this).ToString(format, formatProvider); } #endregion #region IConvertible Members float IConvertible.ToSingle(IFormatProvider provider) { return (float)this; } TypeCode IConvertible.GetTypeCode() { return GetTypeCode(); } bool IConvertible.ToBoolean(IFormatProvider provider) { return Convert.ToBoolean((float)this); } byte IConvertible.ToByte(IFormatProvider provider) { return Convert.ToByte((float)this); } char IConvertible.ToChar(IFormatProvider provider) { throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "Char")); } DateTime IConvertible.ToDateTime(IFormatProvider provider) { throw new InvalidCastException(string.Format(CultureInfo.CurrentCulture, "Invalid cast from '{0}' to '{1}'.", "Half", "DateTime")); } decimal IConvertible.ToDecimal(IFormatProvider provider) { return Convert.ToDecimal((float)this); } double IConvertible.ToDouble(IFormatProvider provider) { return Convert.ToDouble((float)this); } short IConvertible.ToInt16(IFormatProvider provider) { return Convert.ToInt16((float)this); } int IConvertible.ToInt32(IFormatProvider provider) { return Convert.ToInt32((float)this); } long IConvertible.ToInt64(IFormatProvider provider) { return Convert.ToInt64((float)this); } sbyte IConvertible.ToSByte(IFormatProvider provider) { return Convert.ToSByte((float)this); } string IConvertible.ToString(IFormatProvider provider) { return Convert.ToString((float)this, CultureInfo.InvariantCulture); } object IConvertible.ToType(Type conversionType, IFormatProvider provider) { return (((float)this) as IConvertible).ToType(conversionType, provider); } ushort IConvertible.ToUInt16(IFormatProvider provider) { return Convert.ToUInt16((float)this); } uint IConvertible.ToUInt32(IFormatProvider provider) { return Convert.ToUInt32((float)this); } ulong IConvertible.ToUInt64(IFormatProvider provider) { return Convert.ToUInt64((float)this); } #endregion } }