• 【C/C++】 浮点数的存储结构以及与之相关的存储误差观察


    本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
    叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
    1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
    2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
    3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

    ​浮点数就是所谓的小数,一个float类型的对象占据4个字节共32比特。这32个比特以类似于科学计数法的形式来表达一个浮点数,按照IEEE 754标准,其数学表示为:
    在这里插入图片描述

    如图2-6所示,最高的1位(第31位)用做符号位,接着的 8 位(第23-30位)是指数E,剩下的 23 位(第0-22位)为有效数字 M。
    图2-6 float的存储结构
    相对于float,double类型使用8个字节来存储一个浮点数,它的储值范围以及精度都会高一些。习惯上,我们称float为单精度浮点数,double为双精度浮点数。所有的浮点数类型都是有符号的。

    受限于有效数字的位数,浮点数的精度受到限制,会存在微小的误差。为了观察float与double的精度差异及其存储误差,我们创建一个Plain C Application,并修改main.c如下:

    //Project - FloatError
    #include 
     
    int main(){
        float f = 0.00001;
        printf("The stored value of 0.00001 with float:   %.30f\n",f);
       
        double d = 0.00001;
        printf("The stored value of 0.00001 with double:   %.30f\n",d);
       
        f = f * 99000;
        if (f==0.99)
            printf("f*99000 == 0.99");
         else
             printf("f*99000 <> 0.99");
       
         return 0;
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    上述代码的执行结果为:

    The stored value of 0.00001 with float:   0.000009999999747378751600000000
    The stored value of 0.00001 with double:   0.000010000000000000001000000000
    f*99000 <> 0.99
    
    • 1
    • 2
    • 3

    代码第6,第9行的输出结果表明,0.00001存储至浮点数内,均有微弱误差,但double双精度浮点数的误差显然比float要小。

    第12 ~ 15行是后面章节要讨论的条件分支语句▲,其语义可以简单理解为“如果… 则… 否则…”。当12行括号内的条件判断成立时,执行第13行,否则,执行第15行。(f0.99)中的号用于判断两端的值是否相等,如果相等,表示逻辑真,否则为逻辑假。从执行结果可以看出,由于存储误差的原因,与预期不符,上述相等判断被认为是假的,第15行代码被执行。

    注意一般不要对浮点数进行逻辑相等判断,误差的存在会导致意料之外的结果。很多IDE环境会对上述代码的第12行发出警告:浮点数之间进行==,!= 判断▲是危险的。

    为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

    简洁的C及C++
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
    Python编程基础及应用
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

    如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

    Python编程基础及应用

    Python编程基础及应用实验教程
    在这里插入图片描述

  • 相关阅读:
    Java实战项目之图书借阅管理系统【源码+课后指导】
    uni-app集成使用SQLite
    立体式校验保护,让你的系统避免 90% 以上的 bug
    深度学习进度显示神器:tqdm详解
    rust编程-rust所有权理解(chapter 4.2 引用实质是借用)
    docker容器之网络模型动手实验篇一
    彻底改变日常生活:面向消费类应用的物联网
    Git将本地仓库上传到github
    【Java】正则表达式,校验数据格式的合法性。
    数据结构 冒泡排序 选择排序 学习笔记
  • 原文地址:https://blog.csdn.net/SeaBiscuitUncle/article/details/127164774