double类型的精度问题

https://www.nowcoder.com/acm/contest/127/E

一道很简单的期望题,已知概率p求期望

显然期望为1/p

但在精度处理上就有点麻烦了,题目要求答案以最简分数的形式输出,误差要小于1e-6

但我一开始错误的使用了除法运算求1/p,再求(1/p*1e6)/1e6的最简分数

很显然精度丢失

这是一条大忌,在高精度问题中一定要避免使用除法

所以正解是求1e6/(p*1e6)的最简分数

但这里又有一个精度问题,我们算式里的p,是对题目给出数据q,求p=1.0-q得到的

如果我们直接求1.0-q,同样会丢失精度(经测试,1.0-q只保留小数点后6位,会导致最终误差会大于1e-6)

但先乘以1e6就可以避免这个问题,所以解为1e6/(1e6-1e6*q)

 

所以在高精度问题中,尽量避免除法,在加减法中也要提防精度丢失

posted @ 2018-06-03 15:40  诚信肥宅  阅读(443)  评论(0编辑  收藏  举报