double类型的精度问题

Posted 华东交通ACM训练基地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

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

以上是关于double类型的精度问题的主要内容,如果未能解决你的问题,请参考以下文章

float,double类型小数计算结果为啥不一样

输出double形数据,用%啥

double类型的精度问题

浮点类型说明浮float,double有啥区别啊

double类型,小数点后的位数

float和double有啥区别?