为什么Decimal
数据类型没有Epsilon
字段?
根据手册,取值范围decimal
为 ±1.0 × 10e−28 到 ±7.9 × 10e28。
Double
表示大于零的最小正值
所以看起来,Decimal
也有这样一个(非平凡的)价值。但是为什么它不容易访问呢?
我确实明白 +1.0 × 10e−28 正是大于零的最小正 Decimal 值:
decimal Decimal_Epsilon = new decimal(1, 0, 0, false, 28); //1e-28m;
顺便说一句,有几个问题可以提供有关 Decimal 数据类型的内部表示的信息:
Epsilon
这是一个有用的例子。
假设我有来自某个采样集的值的加权总和以及所取样本的权重(或计数)总和。现在我想计算加权平均值。但我知道权重(或计数)的总和可能仍然为零。为了防止被零除,我可以做if... else...
并检查零。或者我可以这样写:
T weighted_mean = weighted_sum / (weighted_count + T.Epsilon)
这段代码在我看来更短。或者,或者,我可以跳过+ T.Epsilon
并改为初始化:
T weighted_count = T.Epsilon;
当我知道实际重量的值永远不会接近时,我可以这样做Epsilon
。
对于某些数据类型和用例,这可能更快,因为它不涉及分支。据我了解,即使分支很短,处理器也无法同时使用两个分支进行计算。而且我可能知道零点以 50% 的比率随机出现 :=) 对于Decima
l,速度方面可能并不重要,甚至在第一种情况下也可能没有积极作用。
我的代码可能是通用的(例如,生成的),我不想为小数编写单独的代码。因此,人们希望看到它Decimal
与其他实值类型具有相似的接口。