概率应该使用啥数据类型? [关闭]

Posted

技术标签:

【中文标题】概率应该使用啥数据类型? [关闭]【英文标题】:What data type should be used for a probability? [closed]概率应该使用什么数据类型? [关闭] 【发布时间】:2018-06-14 08:41:32 【问题描述】:

应该使用什么数据类型来存储概率(因此从 0 到 1)?有没有比使用带有值控制的doublefloat (0 ≤ x ≤ 1) 更有效的方法?

【问题讨论】:

为什么效率低? 您可以使用几乎任何您喜欢的类型(无论是 int 还是 float)。这完全取决于您想要获得多少结果(例如 intlong long)以及您愿意编写什么样的代码。 你需要什么样的粒度?如果 int 在 0-10000 之间不起作用,而您只是将其表示为百分比? “高效”是什么意思? 概率应该使用double。如果担心空间,请使用float 并牺牲一些精度。 【参考方案1】:

一个常见的替代选择是在unsigned shortunsigned int 上进行定点运算,小数点设置在最左边:因此,对于通常的unsigned short,值范围是从 0.00000 = 0/65535到 1.0000 = 65535/65535,或 0.0000 = 0/65536 到 0.99998 = 65535/65536,这取决于您是希望能够准确表示 1.0 还是 0.5。

这种设计的主要优点是可表示的概率在单位间隔上是均匀分布的,并且任何计算都不可能产生超出数学意义范围的值。主要缺点是 P(AB) 不能通过简单的乘法计算,您必须选择 1.0 和 0.5 中的哪一个可以精确表示,并且下溢更有可能咬到您。性能可能是现代 CPU 的一大败笔。

我不知道你所说的“更高效”是什么意思,所以我不能更具体。

【讨论】:

【参考方案2】:

是的,有一种更有效的方法来使用概率。只需使用普通的旧归一化整数,其中 1 相当于您机器中整数中的最大数。

这意味着您只需要缩放 (0 ≤ x ≤ 1) 的浮点数。你可以在这里找到关于最大数量的讨论:What is the maximum value for an int32?

还有其他方法,比如Q数类型和数据格式,但它们通常应用于TI的DSP处理器架构中:https://en.wikipedia.org/wiki/Q_%28number_format%29

【讨论】:

我不相信这一点。这取决于你用概率做什么。如果您对其应用大量浮点计算,那么除非您使用double,否则您糟糕的运行时间将花费大量时间进行不必要的转换。 我理解你的意思,但是如果概率已经用高效的定点算术表示,你为什么还要使用浮点运算。是的,这取决于应用程序,但这不是问题。此外,TI 现有的数百个 DSP 处理器全部使用定点,并进行非常精确的定点运算。在某些情况下需要浮点处理器或协处理器,但它们非常罕见,而且我从未见过概率是用浮点数完成的。但是,不假思索地设计带有浮点的软件更容易。

以上是关于概率应该使用啥数据类型? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

金钱应该使用啥数据类型

硬排序问题 - 我应该使用啥类型的算法?

如果映射时间戳类型的数据库列,我应该在 C# 中使用啥数据类型? [复制]

Laravel 数据库,我应该使用啥数据类型来存储护照号码?

在这种情况下我应该使用啥正确的数据类型?

Java 中应该使用啥数据类型来代表价格