C++中的float&double的存储原理

参考:https://cloud.tencent.com/developer/article/1473541

C++中的float&double的存储原理

C++中的float&double的存储原理

对于任何数字表示成二进制科学计数法以后,一定是1点几(尾数)乘以2的多少次方(指数)。对于小于零的负数来说,就是负1点几(尾数)乘以2的多少次方(指数)。所以要存这个数,需要存储三个部分:正负号,尾数,指数。( 尾数:二进制科学计数法中小数点后面的值,指数:2的幂

C++中的float&double的存储原理

以float类型的0.6为例:

C++中的float&double的存储原理

这种二进制表示小数的方法,造成了一个隐含的问题:一些本来不是无限循环的十进制小数,表示成二进制之后成了无限循环小数。比如上图中的十进制数字0.6,表示成二进制之后成了循环体为1001的无限循环小数。这就是”浮点数有精度问题”的根源之一,你在代码中声明一个变量double a = 0.6;时,计算机底层其实是无法精确存储那个无限循环二进制数的,只能存一个四舍五入(准确说应该是零舍一入,毕竟是二进制)后的近似值,所以即引入了 有效精度这一概念。

(1)对于float类型:由于尾数部分位数是固定的小数点后23位,23位所能表示的最大数是2^23−1=8388607,所以十进制的尾数部分最大数值是8388607,也就是说尾数数值超过这个值之后,float将无法精确表示,所以float最多能表示小于8388607的小数点后7位,但绝对能保证的为6位,也即float的十进制的精度为为6~7位。

(2)对于double类型:double数据类型的推算过程和上述同理,唯一的区别在于尾数由23位扩展到52位,阶码由8位增加到了11位,计算方法不变。所以double的阶码(移码表示)为1~2046,偏移量为1023,故指数范围为-1022~1023,得表示范围为(2^10232)~(-2^10232)即为-1.7E+308~1.7E+308,绝对值最小可以取到2^-1022,精度则为2^52-1=4503599627370495,为16位。所以精度最高位16位,一定可以保证15位。

Original: https://www.cnblogs.com/zf-blog/p/14306839.html
Author: outthinker
Title: C++中的float&double的存储原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535564/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • c++中捕捉内存泄露、异常

    cpp;gutter:false; //在Watch面板加上可以观察当前断点处最后一条异常信息:@err,hr#include "stdafx.h"</p…

    C++ 2023年5月29日
    053
  • libnode 0.4.0 发布,C++ 语言版的 Node.js

    libnode 0.4.0 支持 Windows ,提升了性能,libuv 更新到 0.10.17 版本,libj 更新到 0.8.2 版本。 libnode 是 C++ 语言版的…

    C++ 2023年5月29日
    072
  • Google C++ 单元测试 GTest

    from : http://www.cnblogs.com/jycboy/p/6057677.html 一、设置一个新的测试项目 在用google test写测试项目之前,需要先编…

    C++ 2023年5月29日
    037
  • C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    总地来说,C++11 标准库中的 std::atomic 针对整形(integral)和指针类型的特化版本新增了一些算术运算和逻辑运算操作。具体如下: 下面我们来简单介绍以上的 s…

    C++ 2023年5月29日
    041
  • Modern C++ 模板通用工厂

    Modern C++ 模板通用工厂 1 简单应用示例 1.1 示例代码 1.2 分析说明 2 简单工厂模式 2.1 示例代码 2.2 分析说明 3 工厂 + 静态注册 3.1 示例…

    C++ 2023年5月29日
    067
  • 选择排序 C++实现

    实现思想: 1.寻找[i, n)区间里的最小值min ( i>= 0 ) 2.交换min和第i的数 ( i>= 0 ) #include #include using …

    C++ 2023年5月29日
    061
  • C++中 线程函数为静态函数 及 类成员函数作为回调函数

    线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程…

    C++ 2023年5月29日
    064
  • C++:继承访问属性(public/protected/private)

    我不去想是否能够成功 既然选择了远方 便只顾风雨兼程 Original: https://www.cnblogs.com/adylee/p/11432895.htmlAuthor:…

    C++ 2023年5月29日
    071
  • c++11并行、并发与多线程编程

    首先,我们先理解并发和并行的区别。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃…

    C++ 2023年5月29日
    054
  • C++匿名函数-Lambda表达式

    为什么存在匿名函数 使用 STL 时,往往会大量用到函数对象,为此要编写很多函数对象类。有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪…

    C++ 2023年5月29日
    064
  • 【转】C++知识点总结

    其他路径: 微信公众号:程序喵星人 更多资源和视频教程,QQ:1902686547 这篇文章是对C++的知识点做了一些简单的总结,基本包含了所有的C++基础知识点。以下提到的知识点…

    C++ 2023年5月29日
    055
  • C++ 11 关键字:thread_local(转)

    thread_local 是 C++ 11 新引入的一种存储类型,它会影响变量的存储周期。 C++ 中有 4 种存储周期: 有且只有 thread_local 关键字修饰的变量具有…

    C++ 2023年5月29日
    047
  • C++/CLI

    【 C++/CLI】 A C++/CLI application or component uses extensions to C++ syntax (as allowed by…

    C++ 2023年5月29日
    069
  • 347. 前 K 个高频元素 (优先队列 c++)

    【C++】优先队列的预备知识 对于我这种初学者来说,一个优先队列就给我搞蒙了,在此记录一下,造福后来人 定义 priority_queue<type, container, …

    C++ 2023年5月29日
    054
  • C++11新特性学习

    http://www.cprogramming.com/c++11/c++11-lambda-closures.html Original: https://www.cnblogs…

    C++ 2023年5月29日
    049
  • C++11 正则表达式——基础知识介绍

    C++11开始支持正则表达式,使得处理文本更加简洁方便。C++11 支持六种正则表达式语法:ECMAScript, basic(POSIX Basic Regular Expres…

    C++ 2023年5月29日
    039
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球