无符号双人

我需要使用unsigned double,但事实certificateC#不提供这样的类型。

有谁知道为什么?

浮点数只是IEEE 754规范的实现。 据我所知,在那里没有无符号双人。

http://en.wikipedia.org/wiki/IEEE_754-2008

为什么需要无符号浮点数?

正如Anders Forsgren所指出的那样,IEEE规范中没有未签名的双精度数据(因此不在C#中)。

您可以通过调用Math.Abs​​()来获得正值,并且可以在结构中包含double并在那里强制执行约束:

public struct PositiveDouble { private double _value; public PositiveDouble() {} public PositiveDouble(double val) { // or truncate/take Abs value automatically? if (val < 0) throw new ArgumentException("Value needs to be positive"); _value = val; } // This conversion is safe, we can make it implicit public static implicit operator double(PositiveDouble d) { return d._value; } // This conversion is not always safe, so we make it explicit public static explicit operator PositiveDouble(double d) { // or truncate/take Abs value automatically? if (d < 0) throw new ArgumentOutOfRangeException("Only positive values allowed"); return new PositiveDouble(d); } // add more cast operators if needed } 

在我听过的任何语言或系统中都没有无符号双重的东西。

我需要能够传递一个变量,它可以是一个分数,必须是正数。 我想在我的Function签名中使用它来强制执行它。

如果要强制执行参数为正的约束,则需要使用运行时检查来执行此操作。

我在这里和那里推出了更详细的@Isak Savo的实现。 不确定它是否完美,但它是一个很好的起点。

 public struct UDouble { ///  /// Equivalent to . ///  public static UDouble Epsilon = double.Epsilon; ///  /// Represents the smallest possible value of  (0). ///  public static UDouble MinValue = 0d; ///  /// Represents the largest possible value of  (equivalent to ). ///  public static UDouble MaxValue = double.MaxValue; ///  /// Equivalent to . ///  public static UDouble NaN = double.NaN; ///  /// Equivalent to . ///  public static UDouble PositiveInfinity = double.PositiveInfinity; double value; public UDouble(double Value) { if (double.IsNegativeInfinity(Value)) throw new NotSupportedException(); value = Value < 0 ? 0 : Value; } public static implicit operator double(UDouble d) { return d.value; } public static implicit operator UDouble(double d) { return new UDouble(d); } public static bool operator <(UDouble a, UDouble b) { return a.value < b.value; } public static bool operator >(UDouble a, UDouble b) { return a.value > b.value; } public static bool operator ==(UDouble a, UDouble b) { return a.value == b.value; } public static bool operator !=(UDouble a, UDouble b) { return a.value != b.value; } public static bool operator <=(UDouble a, UDouble b) { return a.value <= b.value; } public static bool operator >=(UDouble a, UDouble b) { return a.value >= b.value; } public override bool Equals(object a) { return !(a is UDouble) ? false : this == (UDouble)a; } public override int GetHashCode() { return value.GetHashCode(); } public override string ToString() { return value.ToString(); } } 

至于为什么需要一个无符号的double ,考虑到UI元素的宽度和高度尺寸在大多数应用程序中不能为负,因为这是不合逻辑的; 那么,为什么支持不需要的负数呢?

PositiveInfinityNaN这样的值可能仍然适用; 因此,我们提供直观的参考。 doubleUDouble之间的巨大差异是UDouble不需要常量NegativeInfinity (或者至少我假设这么多;毕竟我不是数学家)并且MinValue常量只是0 。 此外, Epsilon是积极的,但我不确定在无符号数字的相同上下文中使用它是否合乎逻辑。

注意,此实现会自动截断负数,如果您尝试设置为NegativeInfinity则会引发exception。