c# - 将无穷大数学行为添加到 Decimal

标签 c# generics math infinity

C# 支持二进制浮点类型(DoubleSingle)的无穷数学(参见:Express mathematical infinity in C#),但不支持 Decimal。 我喜欢 Decimal 类型,因为它提供的精度,但我也需要对无穷数学的支持(详情如下)。

是否有一种“惰性”方式来创建一个添加对 -Inf/+Inf/NaN 支持的 InfinityDecimal 结构,就像 Nullable 通用结构添加对可空 类型?也许有一些有趣的属性使用可能适用?包含这样一个野兽的现有数学库?

否则,我应该创建一个具有Decimal value 属性的类或结构,并显式实现struct Decimal 的每个公共(public)方法类型,返回等效 Decimal 操作的结果,除非操作数是,或者结果应该是 +/-Inf 或 NaN。 对吧?

Infinity Math Operations :

+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)

最佳答案

如果您查看 DoubleSingle 的作用,它们基本上会保留一个值来表示正无穷大和负无穷大。该值基本上接近于在每种类型中合理可能表示的正无穷大和负无穷大。根据推论,这是 1 除以非零的最小值(即 Epsilon)。当然,Decimal 没有 Epsilon 属性。您可以通过创建一个非常接近于零而不是零的值来创建您自己的 epsilon 值:

var DecimalEpsilon = new decimal(1,0,0,false,27);

有效 0.000000000000000000000000001m

然后您可以像 Single 和 Double 一样创建正无穷大和负无穷大:

var DecimalPositiveInfinity =  1m / DecimalEpislon;
var DecimalNegativeInfinity = -1m / DecimalEpislon;

不幸的是,您必须自己处理 decimalValue/zeroValue 并自己包装 DivideByZeroException 并返回适当的无穷大常量——这实际上意味着包装所有除法。 NaN 可能也是如此,因为这也不是 Decimal 概念(在 Single/Double 中建模为 PositiveInfinity/PositiveInfinity

Decimal 被添加到货币模型中,并尽可能精确以避免舍入错误和金钱损失 :)。在“钱”的概念里,无限没有多大意义。 :)

实现你想要的其余部分是有效的比较......

关于c# - 将无穷大数学行为添加到 Decimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250188/

相关文章:

javascript - 在 HTML Canvas 上旋转多边形

java - 如何确定 GPS 坐标是否位于矩形区域内?

c++ - 我可以从这个矩阵算法中得到旋转吗

c# - DataGridView 自动添加新行 - 为什么?

c# - WPF自定义错误处理对话框?

c# - List<Interface> 的 object[] 返回 null

generics - F# 类型参数缺少约束

c# - 确保网络用户唯一性的最佳数据组合?

c# - 在另一个大图像中快速找到一个较小的图像

java错误两种方法对泛型有相同的删除