用C++表示概率

Dav*_*ave 2 c++ rounding-error probability

我试图在C++中表示一组简单的3个概率.例如:

a = 0.1  
b = 0.2  
c = 0.7
Run Code Online (Sandbox Code Playgroud)

(据我所知,概率必须加起来为1)

我的问题是,当我尝试将C++中的0.7表示为浮点数时,我最终会得到0.69999999,这在我稍后进行计算时无济于事.同样为0.8,0.80000001.

有没有更好的方法在C++中表示0.0到1.0之间的数字?

请记住,这与数字如何存储在内存中有关,因此在对值进行测试时,我不关心它们的显示/打印方式.

lyr*_*cat 22

这与C++无关,而与浮点数如何在内存中表示有关.您永远不应该使用相等运算符来比较浮点值,请参阅此处以获得更好的方法:http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

  • 他确实特别询问了C++方法,并没有提出任何与比较浮点值相关的问题. (2认同)

Mar*_*Ray 14

我的问题是,当我尝试将C++中的0.7表示为浮点数时,我最终会得到0.69999999,这在我稍后进行计算时无济于事.同样为0.8,0.80000001.

这真的是个问题吗?如果您只需要更高的精度,请使用double而不是float.这应该可以让你获得大约15位数的精度,对于大多数工作来说已经够了.

考虑您的源数据.0.7真的比0.69999999更正确吗?

如果是这样,您可以使用有理数字库,例如:

http://www.boost.org/doc/libs/1_40_0/libs/rational/index.html

如果问题是概率根据定义加起来为1,则将它们存储为数字集合,省略最后一个.通过从1中减去其他值的总和来推断最后一个值.

  • 将精度从 float 更改为 double 并不能解决问题,它只是推迟了问题。 (2认同)

Ada*_*erg 8

你需要多少精度?您可以考虑缩放值并以定点表示量化它们.