首页 > 其他分享 >非一般的小数:小数的概念新解、小数分类、浮点数的存储

非一般的小数:小数的概念新解、小数分类、浮点数的存储

时间:2025-01-04 20:31:58浏览次数:8  
标签:循环小数 存储 浮点数 小数点 整数 新解 小数

非一般的小数:小数的概念新解、小数分类、浮点数的存储

一、小数的概念

这还用解释吗?小学三年级就开始学,你当我是吃干饭的?
那么,请尝试回答以下几个问题:

  • 所有的分数都是小数吗?
  • 所有的小数都是分数吗?
  • 8.0是不是小数?
  • 8是不是小数?
  • 整数是不是小数?
  • 有理数是不是小数?
  • 无理数是不是小数?
  • 实数是不是小数?

小数可不是看着那么简单,它实在是“非同一般”的数。
先看看小学课本中的定义:
在这里插入图片描述
有点草率哈!也难怪,小学三年级,这样说孩子最容易理解。
再看看百度百科中的定义:

小数,是实数的一种特殊的表现形式。所有分数都可以表示成小数,小数中的圆点叫做小数点,它是一个小数的整数部分和小数部分的分界号。其中整数部分是零的小数叫做纯小数,整数部分不是零的小数叫做带小数。

这里面有两个关键词:实数、表现形式。
“小数,是实数的一种特殊的表现形式”,这句话道出了小数的本质:
(1)小数是数的一种表现形式
什么叫表现形式,就是表现在外面的形式上的东西,它无关本质。好比人的衣服,它并不能真正代表这个人。
好比同样是数字,有罗马数字、阿拉伯数字、中文数字、财务上还有专用的大写数字,它们统统都是数字的表现形式。
因此,说到底,小数只不过是数的一种写法而已。
只要一个数能写成这样的形式:整数部分.小数部分,那么它就是小数。所以说,小数完全是形式化的东西。
(2)只要是实数,都能用小数的形式表现出来
任何实数都能写成小数。
用一张图可以表示出小数与实数范围内其他数的关系:
在这里插入图片描述
比如前面说的整数8,可以写成小数8.0、8.00、8.0000。
这里老金要指出一个关于小数的个人观点,不一定对,仅供参考。
老金认为,在表述小数和实数范围内的数之间的关系时,一定要注意用词。比如我们能说“实数可以写成小数”、“整数可以写成小数”,但不能说“实数是小数”、“整数是小数”。
如果说“实数是小数”、“整数是小数”,那数学就要乱套了。
这就好比我们可以说“数字都可以写成阿拉伯数字”,但不能说“数字是阿拉伯数字”。
因为上图中黑色部分都是根据数本身的不同性质进行分类的,只有小数不同,它只和写法有关,和性质无关。因此,小数和图左边那些数是完全不同的数,不能混为一谈。
所以,前面提的那一大堆问题,只有“8.0是不是小数?”这一条是肯定的。
据此,老金认为,我们小学时都学到的一个说法可能是不严谨的: π \pi π是无限不循环小数。
老金认为:严格来讲,我们可以说“ π \pi π可以写成无限不循环小数”,但不能说“ π \pi π是无限不循环小数”。

二、小数的分类

1.有限小数、无限循环小数、无限不循环小数

按小数点后的数字的性质可分为:
有限小数:小数点后只有有限个数字的小数,如0.5、0.25、1.75等。有限小数都可以表示为两个整数的比(分母不为0)。
无限小数:小数点后有无限多个数字。分为两类:

  • 无限循环小数:小数点后的数字序列中,有一部分数字会无限重复。比如0.333…(或写作0. 3 ‾ \overline{3} 3)、0.142857142857…(或写作0. 142857 ‾ \overline{142857} 142857)。无限循环小数也可以表示为两个整数的比。
  • 无限不循环小数:小数点后的数字序列不会重复,也不会终止。比如π、e(自然对数的底数)、 2 \sqrt{2} 2 ​等。无限不循环小数不能表示为两个整数的比。

2.纯小数、带小数

按整数部分是否为0可分为:
纯小数:整数部分为0的小数。
带小数:整数部分不为0的小数。

3.定点数、浮点数

按小数在计算机中的表示形式可分为:
定点数:指小数点在数中的位置是固定不变的。因为位置固定,所以实际上不需存储小数点。理论上讲,可以约定把小数点放在任何位置,但通常将其放在最后(纯整数:除符号位,所有数都表示整数)或最前(纯小数:除符号位,所有位都表示纯小数)。
浮点数:小数点的位置是不固定的,这使得浮点数可以表示非常大或非常小的数。
浮点数通常使用科学计数法来表示,即 M × R E M \times R^E M×RE,其中 M 是尾数(或有效数字),E 是指数(或阶码),R是进制。
尾数和阶码均为带符号数。尾数的符号表示数的正负,阶码的符号则表明小数点的实际位置。浮点数的精度由尾数决定,数的表示范围由阶码决定。
如二进制小数10011.101,按浮点数形式可表示为1.0011101×24
其中尾数为+1.0011101,阶码为+4。

三、浮点数的存储

浮点数的存储涉及到补码知识,参见“负数在计算机内的编码”一文。
补码规则如下:

  • 正数补码都是其自身。
  • 负数的补码是对应正数取反,再+1。

此外,还涉及到另一个概念:移码。
移码,就是对补码的符号位取反。假设用4位二进制数表示,-1的补码为1111,移码为0111;1的补码为0001,移码为1001。
0111在十进制下为7,1001在十进制下为9,相当于给原数加上了8(23)。
速算规律:n位二进制数的移码相当于加上2n-1
在C/C++中,存放浮点数的变量类型为float和double,分别占用32位、64位二进制数,其空间的分配规则如下:
在这里插入图片描述
以float类型数据为例,在32位二进制空间中,从左往右:

  • 符号位:最高位为符号位,用来表示正负(0为正数、1为负数)。
  • 指数位:接下来8位为指数位,用来存储浮点数阶码。只是实际存储的数据并非阶码的二进制值,而是将阶码先转为移码,再减1。也就是说,存入的数据为:阶码+27-1=阶码+127)。
  • 尾数位:再之后23位用来表示尾数部分(纯小数)。因为浮点数的尾数都为1.××××,所以可将1和小数点都舍去,只存储小数点后边的部分。

例如,十进制数19.625,若以float类型存储,计算过程如下:
浮点数:19.625转换为二进制数为10011.101,浮点数表示为1.0011101×24
符号位:正数,所以符号位为0。
阶码位:阶码为+4,8位二进制对应存储数据为:阶码+127=4+127=131=10000011B。
尾数位:尾数为1.0011101,舍去前面的1和小数点,只存储后面的0011101。
三个部分合在一起,得到19.625在内存中的存储形式如下:
0 10000011 00111010000000000000000
在这里插入图片描述
若以double类型存储,原理不变,只是指数位变为11位,对应的存储数据为:移码+1023(210-1)。
如十进制数2.5,若以double类型存储,计算过程如下:
浮点数:2.5转换为二进制为10.1,浮点表示为1.01×21
符号位:正数,符号位为0。
阶码位:阶码为+1,11位指数位的移码偏移为1023,1+1023=1024=10000000000B。
尾数位:尾数为1.01,舍去前面的1和小数点,存储为01(之后50个0)。
合在一起,得到2.5在内存中的存储形式如下:
0 10000000000 01(之后50个0)

标签:循环小数,存储,浮点数,小数点,整数,新解,小数
From: https://blog.csdn.net/jjmhx/article/details/144899161

相关文章

  • C/C++语言float转string保留两位小数
    在C/C++中,将浮点数(float或double)转换为字符串并保留两位小数,通常需要使用格式化函数。在C语言中,通常可以使用标准库中的sprintf或snprintf函数;在C++中,可以使用std::ostringstream或者C++11引入的std::to_string配合自定义格式。不过,std::to_string本身并不直接支持指定小数......
  • 使用js实现保留两位小数的方法有哪些?
    在JavaScript中,你可以通过多种方式实现保留两位小数。以下是一些常见的方法:toFixed()方法toFixed()是JavaScript的Number对象的一个方法,它可以将数字格式化为指定小数位数的字符串。letnum=123.456;letresult=num.toFixed(2);//"123.46"注意,toFixed()方法......
  • 【华为OD-E卷 - 组合出合法最小数 100分(python、java、c++、js、c)】
    【华为OD-E卷-组合出合法最小数100分(python、java、c++、js、c)】题目给一个数组,数组里面哦都是代表非负整数的字符串,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字输入描述一个数组,数组不为空,数组里面都是代表非负整数的字符串,可以是0开头,......
  • 32. 找最小数
    题目描述给一个正整数NUM1,计算出新正整数NUM2,NUM2为NUM1中移除N位数字后的结果需要使得NUM2的值最小。输入描述输入的第一行为一个字符串,字符串由0-9字符组成,记录正整数NUM1,NUM1长度小于32。输入的第二行为需要移除的数字的个数,小于NUM1长度。输出描述输出一个数字字符......
  • 域名重新解析到新服务器后出现 403 错误如何解决?
    域名重新解析到新服务器后报403错误,可能是由于多种原因引起的。首先,白名单设置可能存在问题,域名需要解析到特定的IP,白名单也应相应地提交到该IP上。如果白名单设置不正确,可能会导致服务器拒绝域名的访问请求,从而出现403错误。例如,之前遇到的情况,域名解析到新服务器的香港I......
  • 将一个浮点数或任何其他类型的值赋给 unsigned char 类型的变量时,C语言进行类型转换
    C语言中,unsignefcharTemp_Val;Temp_Val=(unsignefchar)rd_temperature();若rd_temperature()函数返回51.7,则Temp_Val等于多少?在C语言中,unsignedchar 类型通常用于存储0到255之间的无符号整数。当你将一个浮点数或任何其他类型的值赋给 unsignedchar 类型的变量时,C语言......
  • 写一个方法判断是否小数
    在前端开发中,如果你想判断一个给定的字符串或数字是否为小数,你可以使用JavaScript的正则表达式或者通过类型转换和比较来实现。以下是两种方法的示例:方法1:使用正则表达式你可以使用正则表达式来检查一个字符串是否包含小数点,并且小数点前后都有数字。functionisDecimal(value)......
  • LeetCode 2605 从两个数字数组里生成最小数字
    探寻两个数组数位关联下的最小数字问题题目描述给定两个只包含1到9之间数字的数组 nums1 和 nums2,并且每个数组中的元素都是互不相同的。我们需要返回最小的数字,要求这个数字满足两个数组都至少包含这个数字的某个数位。例如,若 nums1=[4,1,3],nums2=[5,7],那么......
  • 云手机:Facebook多账号管理的创新解决方案
    一、亚矩阵云手机简介亚矩阵云手机通过强大的ARM服务器模拟真实的手机操作系统环境,为用户提供远程访问和操作虚拟手机的能力。它不受地域限制,支持多系统兼容,且运行稳定高效。更重要的是,亚矩阵云手机专为解决账号关联问题设计,每个云手机都配备独立的IP和操作系统环境,确保用户可......
  • vue中做一个最多输入一位小数且可以为负数的输入框(包含最前面最后面为小数点及多个-符
    需求背景日常开发中会有对input做校验的需求 例如做一个只可以输入一位小数及可以为负数的输入框 这时候会出现0开头、多个--、多个小数点插入或开头结尾为小数点的情况实现过程<el-inputstyle="width:80px;"v-model="dataForm.low"......