将无穷大的数学行为添加到Decimal

时间:2013-11-27 18:23:27

标签: c# generics math infinity

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

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

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

Infinity Math Operations

Decimal

1 个答案:

答案 0 :(得分:4)

如果您查看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被添加到模型货币中并尽可能精确地避免舍入误差和损失金钱:)。在“钱”这个概念中,无穷大没有多大意义。 :)

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

相关问题