gpt4 book ai didi

C# Decimal.Epsilon

转载 作者:IT王子 更新时间:2023-10-29 04:11:34 27 4
gpt4 key购买 nike

为什么 Decimal 数据类型没有 Epsilon 字段?

From the manualdecimal 值的范围是 ±1.0 × 10e−28 到 ±7.9 × 10e28。

The description of Double.Epsilon :

Represents the smallest positive Double value greater than zero

看来,Decimal 也有这样一个(非平凡的)值。但为什么它不容易访问?

我确实知道 +1.0 × 10e−28 恰好是大于零的最小正十进制值:

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% 的比率随机出现 :=) 对于 Decimal,速度方面可能并不重要,但在第一种情况下甚至没有积极意义。

我的代码可能是通用的(例如,生成的),我不想为小数编写单独的代码。因此,人们希望看到 Decimal 具有与其他实值类型类似的接口(interface)。

最佳答案

与该定义相反,epsilon 实际上是一个概念,用于消除值的二进制和十进制表示之间转换的歧义。例如,十进制的 0.1 没有简单的二进制表示,因此当您将 double 声明为 0.1 时,它实际上将该值设置为二进制的近似表示。如果将该二进制表示数字与其自身相加 10 次(以数学方式),您将得到一个大约为 1.0 的数字,但不完全是。一个 epsilon 会让你在数学上胡说八道,说 0.1 的近似表示加上它自身可以被认为等同于 0.2 的近似表示。

十进制值类型不需要这种由表示的性质引起的近似值,它已经是十进制表示。这就是为什么任何时候您需要处理实际数字和本身不是近似值的数字(即金钱而不是质量)时,要使用的正确浮点类型是十进制而不是 double 。

关于C# Decimal.Epsilon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com