【发布时间】:2013-11-27 18:23:26
【问题描述】:
C# 支持二进制浮点类型(Double 和 Single)的无穷数学(请参阅:Express mathematical infinity in C#),但不支持 Decimal. 我喜欢 Decimal 类型提供的精度,但我还需要对无穷数学的支持(详情如下)。
是否有一种“懒惰”的方式来创建一个添加对 -Inf/+Inf/NaN 支持的 InfinityDecimal 结构,就像 Nullable 通用结构添加对 Nullable 类型的支持一样?也许有一些可能适用的属性的有趣用途?包含这样一个野兽的现有数学库?
否则我应该创建一个具有Decimal value 属性的类或结构,并显式实现struct Decimal 类型的每个公共方法,返回等效的Decimal 操作的结果,除非操作数是,或者结果应该是 +/-Inf 或 NaN。
对吧?
+INF + N = +INF (where –INF < N < INF)
-INF + N = -INF (where –INF < N < INF)
+INF + +INF = +INF
-INF - +INF = -INF
+INF - +INF = NAN
+INF * +INF = +INF
+INF * -INF = -INF
-INF * -INF = +INF
+INF / +INF = NAN
-INF / -INF = NAN
-INF / +INF = NAN
+INF / -INF = NAN
+INF / 0 = +INF
-INF / 0 = -INF
+INF / N = +INF (where 0 < N < INF)
【问题讨论】:
-
您是建议将其添加到 BCL 中,还是询问 如何 在 C# 中执行此操作?
-
@PeterRitchie 很明显 OP 正在寻找后者..
-
"否则我应该创建一个具有 Decimal 值属性的类或结构,并显式实现 struct Decimal 类型的每个公共方法" 是的,您需要这样做。这会很乏味,但不是特别难。
-
怎么做。理想情况下,我希望将它添加到 BCL 中,但在短期内,我想看看是否可以通过找到现有实现或通过一些合理的捷径来实现。
-
定义自己的类型,封装一个十进制值和一个枚举来指示该值是无穷大还是十进制值。 FWIW,十进制与精度无关。这是关于十进制表示。十进制具有有限的精度,就像双精度。但是十进制是十进制,而双精度是二进制。所以也许你应该重新考虑一下为什么你认为十进制这么好。