zoukankan      html  css  js  c++  java
  • 还不会浮点数转二进制?下次有人问你,直接把这篇文章扔给他

    作为一名程序猿,假如某一天,有一个妹子拿着一个浮点数,求你教她怎么换算成二进制,如果你不能单手求出来,你都不能算一个合格的工具人.....好吧,是一个合格的程序猿(狗头保命)。

    在这里插入图片描述

    回归正题,有好多小伙伴去工作之后,早已经忘了最基本的计算机基础,今天,来讲下,在计算机中,怎么用二进制表示浮点数?下次再有人问你,就把这篇文章丢给他。

    作为一种数据类型,浮点数应用广泛。在处理诸如订单交易、货币计算、或者商品金额的方面,应该小心慎用浮点数。在定义浮点数变量的时候,不完全理解原理,就容易出现各种揪心的问题。

    那么,正题来了。

    浮点数在计算机中的存储方式遵循IEEE 754浮点数的计数标准,那么,IEEE 754浮点数的计数标准怎么表示浮点数的?

    • 浮点数数学表示:

    在这里插入图片描述

    • 符号位(sign):决定该浮点数的正负
    • 尾数(significand):二进制小数,范围在[1,2)或者[0,1)中
    • 阶码(exponent):对浮点数加权,权重为2的E次幂

    IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度。前两者正好对应C语言里头的float、double,限于篇幅,本文仅讨论单精度、双精度浮点格式。

    其实,IEEE754标准可以概括成一张图片,如下

    在这里插入图片描述
    采用尾数+阶码的编码方式。其实就是在我们学过的数学知识中,就是类似于科学计数法。即有效数字+指数位

    所以,只要给出:符号(S)、尾数部分(M)、阶码部分这三种信息,就可以正确的表示一个浮点数。在C语言中,浮点数的数据类型最常用的就是float、double,那么,他们在计算机中的存储结构是怎样的呢?

    在这里插入图片描述
    在这里插入图片描述
    浮点数的各个部分的含义如下表格所示

    符号部分(S) 阶码部分(E) 尾数部分(M)
    0表示正(+),1表示负(-) 阶码部分其实就是指数部分 float 指数部分8位,可以表示的指数范围位-127~128 double 指数部分11位,可以表示的指数范围位-1023~1024 决定浮点数的精度 float 尾数部分23位,换算成十进制为223 =8388608,因此精度为6~7位 double 尾数部分23位,换算成十进制为252 =4503599627370496,因此精度为15~16位

    结论

    浮点数交给计算机存储的,可能会有精度的丢失问题,出了问题的话,在大型的项目中,是很难找出问题的,因此提前做好规划与计算是有必要的。

    在这里插入图片描述

    计算实例

    第一个例子

    把十进制小数0.475转换成二进制,具体应该怎么操作?

    1. 将小数划分成整数+小数两部分

    2. 整数部分转换

    转换采用除2取余法,此处的0.475的整数部分为0,不需要操作。

    3. 小数部分转换

    转换采用乘2取整法。详细看下图

    在这里插入图片描述
    3. 合并结果

    整数部分+小数部分,得到二进制结果为 0.101.

    根据IEEE754标准,即符号位+尾数+阶码的计数方式,可以表示为

    1.01 × 2-1

    • 符号位:0
    • 阶码部分:以float为例子,则为 127 + (-1)=126,所以二进制为:01111110
    • 尾数部分:以float为例子,应为 23位,尾数补齐之后为0100000000000000000000

    最终结果为(以float表示)

    0011111100100000000000000000000

    第二个例子

    把十进制小数8.26转换成二进制,具体应该怎么操作?

    在这里插入图片描述
    整数部分+小数部分 得到二进制结果为1000.0100001 .....

    根据IEEE754标准,即符号位+尾数+阶码的计数方式,可以表示为

    1.0000100001 × 2 3

    • 符号位:0
    • 阶码部分:以float为例子,则为 127 + (3)=130,所以二进制为:10000010
    • 尾数部分0.0000100001...,,它本身无限不循环,但是如果以 float 为例子,截取 23位,表示为00001000010100011110110

    最终结果为(以float表示)

    01000001 00000100 00101000 11110110

    因此,对于这种无限位数的小数,用计算机去存储必然会导致精度的损失。所以,各位在使用过程中一定要谨慎小心。

    结语

    浮点数转换为二进制就讲解到这里了,觉得有用的老铁们,请点赞关注我吧,另外,关注我的老铁们可以私聊我,获取浮点数转换为二进制的神器,这样子,再也不用自己手撕浮点数转为二进制了。

    在这里插入图片描述

    如果觉得我写的不错的话,帮个忙呗

    1.关注我的知乎账号小丛,上面有我的文章同步,同时需要询问学习计算机经验的话,也欢迎私聊。
    2.点赞,关注我,这是对我最大的鼓励了,有了你们的鼓励,我会写出更多的优质文章。
  • 相关阅读:
    一笔期货成交的始末(可能有问题)
    tcp心跳模型
    spring boot 2.0 启动监控端点的方法(spring-boot-starter-actuator)
    netty channel的线程安全性与@Sharable
    为什么使用https
    angularjs post 跨域 Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.
    http的keep-alive和tcp的keepalive区别
    最大公约数 最小公倍数--------专题
    hdu 2024 C语言合法标识符
    hdu 2025 查找最大元素
  • 原文地址:https://www.cnblogs.com/codevald/p/codevald8.html
Copyright © 2011-2022 走看看