Float类型的有效位数有几位

news2024/9/21 12:35:06

大家好,今天我们来聊一聊C语言中的Float类型。

正如标题所说,你知道Float类型的有效位数有几位吗?

或者你知道为什么Float类型可以表示数字16777218但是却无法表示16777217吗?

如果你不是很确定那我们就一起来看看吧,有疑问或者想法可以在评论区讨论~

有效位数与科学计数法

理解有效位数科学计数法是理解Float精度的关键概念。

这两个概念在二进制与十进制下是一样的,我们所要讨论的Float有效位数也是针对于十进制而言的。

有效位数是指一个数值中确切有效的数字,即所有可以精确表示的数字。

有效位数的规则:

  • 有效位数从第一个非零数字开始。

    0.00123 有3个有效位数,因为有效位数从第一个非零的1开始

  • 数字中的所有非零数字都是有效的。

    123.45 有5个有效位数,因为所有的数字都是确定的

  • 小数点右边的所有零如果是有效数字的一部分,则计入有效位数。

    100.0 有4个有效位数,因为小数点右边的零是有意义的

  • 小数点左边的零不算有效位数。(这条很重要

    100 有1个有效位数

科学计数法的主要目的是简化书写和计算,同时使数值中的有效位数更容易理解。

它的写法如下:
N = M × 1 0 k N=M×10^k N=M×10k
其中:

  • M 是一个1到10之间的实数,是有效位数的表示。
  • k 是一个整数,表示这个数是乘以或除以10的k次幂。

示例:

  • 123000 的有效位数为3,用科学计数法表示为:
    1.23 × 1 0 5 1.23×10^5 1.23×105

  • 0.000456 的有效位数为3,用科学计数法表示为:
    4.56 × 1 0 − 4 4.56 \times 10^{-4} 4.56×104
    Tips:

    科学计数法中指数部分不影响有效位数

上面两个概念明白以后,我们就可以来分析下Float类型的有效位数了。

Float类型在计算机中的表示

Float类型是单精度浮点数,它在计算机中存储与表示的方法其实就是有效位数+科学计数法。

Float类型占用4个字节(32位),按照IEEE 754标准的结构,单精度浮点数被划分为三个部分:
在这里插入图片描述

  • 符号位(sign):1位,表示数值的正负号。

  • 指数部分(exponent):8位,用于表示数值的范围,通过偏移量来确定实际指数。

  • 尾数部分(mantissa):23位,用于表示数值的有效位,隐含一位1,所以实际上有24位有效数字。

    Tips:

    对于非零数值,浮点数的二进制表示是以**1.XXXX…**的形式存在的,小数点前的1是隐含的,不需要实际存储。

    由于这个1总是存在,因此可以把它省略掉,从而节省1位存储空间。

    这就是所谓的隐含的1位。

浮点数表示的形式为:
V = ( − 1 ) sign × 1. mantissa × 2 exponent − 127 V = (-1)^{\text{sign}} \times 1.\text{mantissa} \times 2^{\text{exponent} - 127} V=(1)sign×1.mantissa×2exponent127

Tips:

对单精度浮点数来说,指数部分占8位,其表示范围是0到255。为了表示负指数和正指数的范围,存储的指数实际值需要减去127,称为偏移量。

Float类型的有效位数

现在我们知道,Float类型的有效位是由尾数决定的,由于尾数的位数是固定的,因此尾数也就有了最大值的限制。

不难想到,当有效数字超过了尾数所能表示的最大的数时,Float类型就会丢失精度。

那么尾数所能表示的最大数字是多少呢?

由于有符号位,因此所有尾数都可以用来表示数值,于是24位二进制数能表示的最大值就是:

1111 1111 1111 1111(有效位数为24位)

转换为十进制就是:16777215

然后我们来看下167772161677721716777218的二进制表示:

  • 16777216: 1 0000 0000 0000 0000

    有效数字为1位,小于24位

  • 16777217: 1 0000 0000 0000 0001

    有效数字为25位,大于24位

  • 16777218: 1 0000 0000 0000 0010

    有效数字为24位,等于24位

看到这里,大家应该明白为什么Float类型可以表示16777218,却不能表示16777217了。

所以,当数值不超过16777216时,Float类型可以精确表示每一个整数;

当数值超过16777216时,Float类型不能再精确表示所有的数值,精度开始丢失

因此,float类型的有效位数是7位(因为7位数是一定可以精确表示的)。

最后,我们可以通过一个简单的C程序来演示上述现象:

#include <stdio.h>

int main() 
{
    float num1 = 16777216.0f;  // 可以表示的数
    float num2 = 16777217.0f;  // 超出精度的数
    float num3 = 16777218.0f;  // 可以表示的数

    printf("num1 = %.0f\n", num1);  // 输出:16777216
    printf("num2 = %.0f\n", num2);  // 输出:16777216
    printf("num3 = %.0f\n", num3);  // 输出:16777218

    return 0;
}

输出结果:

num1 = 16777216
num2 = 16777216
num3 = 16777218

可以看到,16777217 无法被精确表示,而 16777218 则可以。
希望本文对大家有帮助,最后欢迎大家关注我的微信公众号《嵌入式三分钟》
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AcWing算法基础课-789数的范围-Java题解

大家好&#xff0c;我是何未来&#xff0c;本篇文章给大家讲解《AcWing算法基础课》789 题——数的范围。本文详细解析了一个基于二分查找的算法题&#xff0c;题目要求在有序数组中查找特定元素的首次和最后一次出现的位置。通过使用两个二分查找函数&#xff0c;程序能够高效…

数据结构(Day13)

一、学习内容 内存空间划分 1、一个进程启动后&#xff0c;计算机会给该进程分配4G的虚拟内存 2、其中0G-3G是用户空间【程序员写代码操作部分】【应用层】 3、3G-4G是内核空间【与底层驱动有关】 4、所有进程共享3G-4G的内核空间&#xff0c;每个进程独立拥有0G-3G的用户空间 …

【C++】深入理解作用域和命名空间:从基础到进阶详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、域的概念 1. 类域 2. 命名空间…

Redis——常用数据类型string

目录 常用数据结构&#xff08;类型&#xff09;Redis单线程模型Reids为啥效率这么高&#xff1f;速度这么快&#xff1f;&#xff08;参照于其他数据库&#xff09; stringsetgetMSET 和 MGETSETNX&#xff0c;SETEX&#xff0c;PSETEXincr&#xff0c;incrby&#xff0c;decr…

sshj使用代理连接服务器

之前我是用jsch连接服务器的&#xff0c;但是没办法使用私钥连接&#xff0c;搜了一下似乎是不支持新版的SSH-rsa&#xff0c;并且jsch很久没更新了&#xff0c;java - "com.jcraft.jsch.JSchException: Auth fail" with working passwords - Stack Overflow 没办法…

mybatis的基本使用与配置

注释很详细&#xff0c;直接上代码 项目结构 源码 UserMapper package com.amoorzheyu.mapper;import com.amoorzheyu.pojo.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select;import java.util.List;Mapper //在运行时生成代…

从数据仓库到数据中台再到数据飞轮:金融行业的数据技术进化史

前言​ 大家好&#xff0c;我是一名大数据开发工程师&#xff0c;在金融行业深耕多年&#xff0c;其实数据技术的演进不仅是技术层面的革新&#xff0c;更是业务模式与决策方式的深刻变革。从最开始的数据仓库兴起&#xff0c;到数据中台的普及&#xff0c;再到数据飞轮的出现…

MFEA/D-DRA--基于分解和动态资源分配的多目标多任务优化

MFEA/D-DRA–基于分解和动态资源分配的多目标多任务优化 title&#xff1a; A Multiobjective multifactorial optimization algorithm based on decomposition and dynamic resource allocation strategy author&#xff1a; Shuangshuang Yao, Zhiming Dong, Xianpeng Wang…

跨界融合,GIS如何赋能游戏商业——以《黑神话:悟空》为例

在数字化时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术正以其独特的空间分析和可视化能力&#xff0c;为游戏产业带来革命性的变革。《黑神话&#xff1a;悟空》作为中国首款3A级别的动作角色扮演游戏&#xff0c;不仅在游戏设计和技术上取得了突破&#xff0c…

金融行业中如何利用数据中台的数据来有效的驱动业务决策呢?

前言​ 在金融行业中&#xff0c;利用数据中台的数据来有效驱动业务决策是一个复杂而关键的过程。其实我们的核心就是帮助金融机构最大化数据中台的价值&#xff0c;并推动业务决策的科学性和准确性。本文我从技术的角度来剖析一下这一过程。​ 什么是数据中台&#xff1f;​…

Git常用指令大全详解

Git常用指令大全详解 Git&#xff0c;作为目前最流行的分布式版本控制系统&#xff0c;其强大的功能和灵活性为开发者提供了极大的便利。无论是个人项目还是团队协作&#xff0c;Git都扮演着不可或缺的角色。本文将详细总结Git的常用指令&#xff0c;帮助大家更好地掌握这一工…

PHP:强大的Web开发语言

PHP&#xff1a;强大的Web开发语言 一、PHP 简介及优势 PHP 的基本概念 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即 “超文本预处理器”&#xff0c;是一种通用开源脚本语言&#xff0c;最初由 Rasmus Lerdorf 于 1994 年创建。它可以在服务器上执行&#xf…

题目:单调栈

1、关于栈的概述 栈是一种数据结构&#xff0c;遵循“后进先出”&#xff08;LIFO, Last In, First Out&#xff09;的原则。这意味着最后被插入栈中的元素会最先被移除。可以把它想象成一个垒盘子的情况&#xff0c;新的盘子总是放在最上面&#xff0c;而最上面的盘子会最先被…

Matlab:科学计算与工程应用的强大利器

Matlab&#xff1a;强大的科学计算工具 一、Matlab 简介与重要性 Matlab 作为一款强大的科学计算软件&#xff0c;在工程、科学、数学等多个领域都有着广泛的应用及至关重要的地位。 在工程计算领域&#xff0c;它涵盖了众多方面。例如&#xff0c;线性代数与矩阵运算中&…

CODESYS资源使用表

1、CODESYS标准化编程之输入输出映射请参考下面文章链接: CODESYS标准化编程之输入输出映射-CSDN博客文章浏览阅读78次。在介绍输入输出映射之前大家需要了解开关量防抖滤波功能块,相关链接如下:开关量防抖滤波器(梯形图和SCL源代码)_开关量输入滤波程序-CSDN博客文章浏览阅…

禹神:一小时彻底搞懂跨域解决方案

1. 浏览器的同源策略 2. 跨域会受到哪些限制 4. CORS 解决 Ajax 跨域问题 exposedHeaders 不加这个&#xff0c;js拿不到这个响应头(浏览器控制台network中能看见&#xff0c;但是js拿不到) 5. JSONP 解决跨域问题 JSOP只能解决get请求 服务端代码 客户端代码 服务端代码升…

Gartner发布报告揭秘微软数据安全功能和许可

制定数据安全计划以增强合规性并降低数据风险仍然是安全和风险管理领导者关注的问题。这项研究阐明了 Microsoft 的数据安全许可结构&#xff0c;并确定了围绕 Purview 构建数据安全计划的关键要素。 主要发现 客户对微软数据安全的询问表明&#xff0c;安全和风险管理 (SRM) 领…

transformer模型进行英译汉,汉译英

上面是在测试集上的表现 下面是在训练集上的表现

全面掌控大模型:MaxKB与Ollama的高效本地部署策略

随着大模型的广泛应用&#xff0c;越来越多的开发者希望能够在本地运行这些模型&#xff0c;既提高数据隐私性&#xff0c;又避免依赖云端服务。本文将详细介绍如何在本地使用 Ollama 进行大模型部署&#xff0c;以及如何通过 MaxKB 导入本地知识库并进行交互操作。为了使该过程…

在线包装盒型生成工具,各种异型包装盒型,PDF导出方便

1、templatemaker.nl Passepartout ✂ Templatemaker ︎https://www.templatemaker.nl/en/passepartout/这是一个荷兰设计师建的一个在线盒型自动生成工具&#xff0c;包含各类新奇盒型&#xff0c;大家可以一起去观摩一下。 网站首页顶部各种盒型展示&#xff0c;大家根据需…