• [浮点型数据]数值精度&取值范围 完全不同的概念


    先来看个小程序:

    #include <stdio.h>
    int main()
    {
        double a = 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796;
        //这里的a是千位的pi
      if (a == 3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019893809525720106548586327886593615338182796) {
            printf("相等
    ");
        }
        else {
            printf("不相等
    ");
        }
        printf("%.30f
    ", a); //这里为了保证a输出小数点后30位
        return 0;
    }

    运行结果为:

    相等
    3.141592653589793115997963468544

    显然a是可以取到千位pi,毕竟pi只是在3.14与3.15之间,这个数值当然在双精度浮点型的所能表示的范围内.所以不会出现错误. 但如果把"3."去掉,会显示1415926535897932384....超过double的取值范围

    另一个问题是:如果我们仔细看运行结果3.141592653589793115997963468544

    会发现只有加粗的16位数字是准确的,后面的部分都是不准确的.

    所以对应我们知道的,double的有效数字一般有15-16位,其余部分都是不准确的.

    同样的可以测试float:

    #include <stdio.h>
    int main()
    {
    
        float a = 3.14159265;
        if (a == 3.14159265) {
             printf("相等
    ");
        }
        else {
            printf("不相等
    ");
        }
        printf("a = %.30f
    ", a);
        return 0;
    }

    运行结果为

    不相等
    a = 3.141592741012573242187500000000

    我们会发现,结果是不相等,虽然我们让a取了3.14159265,但是在计算机内部中却是运行结果里出现的a = 3.1415927410125732421875;

    运行结果里a = 3.141592741012573242187500000000

    只有加粗的7位是准确的,对应知道的:float类型的数据只有7-8位是有效的,其余是不准确的.

  • 相关阅读:
    MEF 编程指南(十一):查询 CompositionContainer
    MEF 编程指南(十):重组
    MEF 编程指南(九):部件生命周期
    MEF 编程指南(八):过滤目录
    MEF 编程指南(七):使用目录
    MEF 编程指南(六):导出和元数据
    MEF 编程指南(五):延迟导出
    MEF 编程指南(四):声明导入
    MEF 编程指南(三):声明导出
    MEF 编程指南(二):定义可组合部件和契约
  • 原文地址:https://www.cnblogs.com/profesor/p/12750174.html
Copyright © 2020-2023  润新知