zoukankan      html  css  js  c++  java
  • 计算涉及到的精度问题

    关于精度丢失问题

    昨天晚上做到刘汝佳粉书的一道题,源代码如下:

    #include <stdio.h>
    int main(void)
    {
    	double i;
    	for(i = 0; i != 10; i += 0.1)
    		printf("%.1f
    ", i);
    	return 0;
    }
    

    一开始我以为这就是简单的循环,到10就停了,然后却发现循环没有终结,陷入了死循环。
    后来仔细思考了一下。发现了其中的缘由:

    • 计算机做加减法的时候用的是二进制作计算。
    • 十进制在转化成二进制的时候,整数部分没有误差,而小数部分却有,因为转化小数部分的时候用的是乘基取整法,有时候无法刚好乘完,必然会出现误差,这样的话每次加上去的就不是0.1(针对此题),而是在0.1上下波动(当然误差很小),这样就完美错过10这个数字了,从而陷入死循环。

    另外附带一下单精度和双精度的区别。

    • 单精度(float)

    • 双精度(double)

    原来人类的悲欢并不相通, 我只觉得他们吵闹。
  • 相关阅读:
    BSGS
    聪聪可可(未完成)
    强连通分量,缩点
    bozj 1823(未完成)
    网络流
    bzoj1026
    点分治 poj1741
    bzoj 3270 博物馆
    高斯消元 模板
    bzoj 3143 [Hnoi2013]游走
  • 原文地址:https://www.cnblogs.com/zhlabcd/p/8527706.html
Copyright © 2011-2022 走看看