跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
GSXAB的知识库
搜索
搜索
外观
登录
个人工具
登录
Advertising:
查看“︁浮点数”︁的源代码
页面
讨论
简体中文
阅读
查看源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
查看源代码
查看历史
刷新
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
←
浮点数
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[分类:数字编码]] [[分类:数据类型]] {{InfoBox |name=浮点数 |eng_name=floating-point number }} {{InfoBox |name=浮点型 |eng_name=floating-point type }} {{InfoBox |name=浮点格式 |eng_name=floating-point format }} {{InfoBox |name=符号位 |eng_name=sign bit }} {{InfoBox |name=有效数 |eng_name=significand |aliases=有效数字 }} {{InfoBox |name=尾数 |eng_name=mantissa |aliases=trailing significand }} {{InfoBox |name=指数 |eng_name=exponent }} {{InfoBox |name=阶码 |eng_name=biased exponent }} {{InfoBox |name=规格化数 |eng_name=normal number |aliases=normalized number }} {{InfoBox |name=非规格化数 |eng_name=subnormal number |aliases=denormalized numbers,denormal numbers }} '''浮点数'''('''floating-point number''', '''FP''')是一类计算机内的数的表示方法([[机器数]])的统称。类似[[科学记数法]],小数被分为'''符号'''、'''指数'''、'''有效数'''三部分。 '''浮点型'''('''floating-point type''')指以这种方式保存实数近似值的[[数据类型]],小数的三部分被对应为'''符号位'''、'''阶码'''、'''尾数''',分别存储于指定位数的二进制位中。 涉及这些二进制位具体物理存储方式的称为'''浮点格式'''('''floating-point format''')。 浮点数这一称呼与固定小数点位置,将多余位数全部用于保存真实值的[[定点数]]相对。由于浮点数中指数可以在一定范围内改变,浮点数比定点数能表达变化范围更大的数据,而且可以处理极大或极小的数值;但是浮点数由于比相等位数的定点数表示有效数字的部分减少了位数,而且最低有效位所实际对应的数位随指数改变,相对精度更加有限,且在相对精度大致固定的情况下,绝对精度随着数字本身的大小发生不均匀的变动。 == 定义 == '''浮点数'''('''floating-point number''')是一类实数表示法,其将实数分为三个部分;对应的数据类型称为'''浮点型'''('''floating-point type''')数据,其以某种固定的'''浮点格式'''('''floating-point format''')对应存储三个位段。 * '''符号位'''('''sign bit'''),一般是最高位,有 0 (正)和 1 (负)两个取值。对应数值一般记作 <math>S=\pm 1</math> 。 * '''有效数'''('''significand''')部分。对应科学记数法中的有效数字的部分。由于二进制科学记数法中,有效数字的整数部分必定为 1 ,存储时省略,因此称为'''隐藏位'''('''hidden bit'''),实际保存的是后续的小数部分,因此称为'''尾数'''('''mantissa''' / '''trailing significand''')部分<ref>尾数的 mantissa 一词因为词源是借用自计算常用对数时的小数部分,有观点认为用在这里指真数的小数部分会造成误解,所以较新的材料中不推荐使用这一词汇而是用 trailing significand 表示这一概念。</ref>,记作 <math>M</math> 。 * '''指数'''('''exponent''')部分。对应科学记数法中的指数。由于指数是有符号数,常常根据所需要表达的范围加上一定偏移值 <math>B</math> 以全部移动到非负范围(即[[移码]])便于运算,这种被移动过的编码也称为'''阶码'''('''biased exponent'''),以防止与“指数”的真值混淆,记作 <math>E</math> 。 注意:这里存在两套用于不同语境的术语:在逻辑上、在数学相关的学术语境上,包括'''浮点数、指数、有效数'''三部分;而在工程中,或者在硬件存储语境中,包括'''符号位、阶码、尾数'''三部分。其中阶码是指数部分的硬件表示,尾数是有效数部分的硬件表示。可以认为是数学实体(“浮点数”)和存储编码(“浮点型”和“浮点格式”)的两套语境。通常可以混用“浮点数”和“浮点型”两个词,只有“浮点格式”一定指硬件表示。绝大多数情况下,包括指代某个具体浮点类型时,也可以直接使用“某某'''浮点数'''”代替“某某'''浮点型'''”,通常也可以大部分程度上代替“浮点格式”。尽管严格地说,数、数据类型、数和存储的映射是三种不同的东西,还是导致了两种场景只能用语境区分。 按以上记号,一个浮点数所表示的真值为 <math>S (1 + M) \cdot 2^{E - B}</math> ,所使用的二进制位的位数为 <math>(1+n_M+n_E)</math> 位。 这里表达的是绝大多数浮点数,因此假定了浮点数的有效数字都以 1 开头,也就是符合标准的科学记数法形式,这种情况称为'''规格化数'''('''normal numbers''' / '''normalized numbers''')。在标准的实践中,为了表达一些不便于使用规格化表达的数(如 0 和其他接近 0 的数),也会使用一些不符合这一规则的特殊值,称为'''非规格化数'''('''subnormal numbers''' / '''denormalized numbers''')。 {{GiteaSvg|floating_point_number}} === 子格式 === 浮点数因为结构复杂,需要称为'''浮点运算单元'''('''FPU''')的硬件单独处理,支持其[[四则运算]]及其他复杂操作。这使得浮点数通常只使用标准位数的指定格式,通常遵循的标准为 [[IEEE 754]] 。 由于近年来深度神经网络发展,又出现了指数部分变化范围更大、尾数部分精度需求较低的浮点数,也就是 [[bfloat16]] 等浮点数。 由于浮点数需要单独根据各段长度定制化处理,并不会产生一种表达任意位浮点数的方法,非标准浮点数也相当少见。 == 运算 == 浮点数运算涉及大量的硬件算法,以保证硬件可以以较小开销直接快速支持。 <blockquote> 由于本 wiki 主要讲述软件知识,避免过多展开硬件算法,只进行简单介绍。 </blockquote> === 规格化 === '''规格化'''('''normalization''')指将有效数字不符合科学记数法,或者说不是''规格化''(''normalized'')数的表达变成''规格化''数的过程。朴素地检查最高位有效数字(即最高位的 1 )是否处在隐藏位该在的位置上,并按需要进行[[左移]][[右移]]并增减阶码。 === 浮点加减法 === 包括四个步骤: * 对阶:指将指数部分较小的浮点数尾数右移至两数阶码相同。 * 尾数相加:通过[[并行加法器]]对小数点已经对齐的两个数据进行加法(若为减法,执行补码加法)。需要保证额外的'''保护位'''('''guard bit''')处理溢出,'''黏性位'''('''sticky bit''')处理被对阶操作移动到尾数外的位,以保证后续舍入能判断后续位要如何舍入。 * 规格化:在上一步中,相加结果可能向前溢出一位或存在前导 0 ,此时对其执行规格化。 * 舍入处理:按规则舍弃规格化后超出尾数部分的多余位。 浮点数的加法因为存在对阶和舍入,是有精度下降以及运算误差的。经过多次浮点运算后会形成累计误差,而且也不满足[[结合律]]。 === 浮点乘法 === 由于阶码和尾数在乘法中可以单独运算,浮点数的称除法也处理成几个部分。 * 符号位处理:符号位进行异或。 * 指数相加:将阶码相加再减去一次偏移值,以避免结果带有两次偏移。 * 尾数相乘:补全隐藏位然后进行乘法,过程中处理进位,可能需要两倍长度的位数来处理全部进位。这里可能使用 Booth 算法等。 * 规格化 * 舍入处理 * 特殊值:对 0 等特殊值,直接按照特殊值规则产生结果。 {{数的编码}}
返回
浮点数
。
Advertising: