无符号双人
我需要使用unsigned double,但事实certificateC#不提供这样的类型。
有谁知道为什么?
浮点数只是IEEE 754规范的实现。 据我所知,在那里没有无符号双人。
https://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元素的宽度和高度尺寸在大多数应用程序中不能为负,因为这是不合逻辑的; 那么,为什么支持不需要的负数呢?
像PositiveInfinity
和NaN
这样的值可能仍然适用; 因此,我们提供直观的参考。 double
和UDouble
之间的巨大差异是UDouble
不需要常量NegativeInfinity
(或者至少我假设这么多;毕竟我不是数学家)并且MinValue
常量只是0
。 此外, Epsilon
是积极的,但我不确定在无符号数字的相同上下文中使用它是否合乎逻辑。
注意,此实现会自动截断负数,如果您尝试设置为NegativeInfinity
则会引发exception。
上述就是C#学习教程:无符号双人分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/985080.html