跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
GSXAB的知识库
搜索
搜索
外观
登录
个人工具
登录
Advertising:
查看“︁IEEE 754”︁的源代码
页面
讨论
简体中文
阅读
查看源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
查看源代码
查看历史
刷新
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
←
IEEE 754
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[分类:数字编码]] [[分类: IEEE 标准]] {{InfoBox |name=IEEE754 |eng_name=IEEE 754 }} {{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 |aliases=阶码 }} {{InfoBox |name=规格化数 |eng_name=normal number |aliases=normalized number }} {{InfoBox |name=非规格化数 |eng_name=subnormal number |aliases=denormalized numbers,denormal numbers }} '''IEEE 754''',即 '''IEEE 二进制浮点数算术标准'''('''IEEE Standard for Floating-Point Arithmetic''')是 IEEE 关于[[浮点数]]存储及算术运算的标准。 IEEE 标准及其他兼容标准解决了上世纪 80 年代前浮点数物理表示不同造成的大量可靠性和兼容性问题,是现在最通用的标准,大量硬件中'''浮点运算单元'''('''floating-point unit''', '''FPU''')都使用这一标准。 IEEE 754 的第一个版本是 IEEE 754-1985 ,只包含单精度和双精度的浮点数算术,因此网络上很多材料都会说 IEEE 754 只有其中前三种类型。后续 IEEE 754-2008 版本中,除了继承自身外,还融合了来自 IEEE 854-1987 (IEEE 基数无关浮点数算术标准(IEEE Standard for Radix-Independent Floating-Point Arithmetic))的标准类型。之后 ISO/IEC/IEEE 60559:2011 开始,这一标准进入 ISO/IEC 标准。目前最新标准为 IEEE 754-2019 和 ISO/IEC 60559:2020 。 == 格式 == 本 wiki 本章摘录主要格式定义<ref>{{doi|10.1109/IEEESTD.1985.82928}}。参考文件来源: https://www.ime.unicamp.br/~biloti/download/ieee_754-1985.pdf 。</ref><ref>{{doi|10.1109/IEEESTD.2019.8766229}}。参考文件来源: https://www-users.cse.umn.edu/~vinals/tspot_files/phys4041/2020/IEEE%20Standard%20754-2019.pdf 。</ref>,忽略和算术相关的部分。 === 相关定义 === * '''格式'''('''format'''):一种 IEEE 754 格式是数值与数字符号的表示形式的集合,也可能伴有一种编码。 * '''浮点数据'''('''floating-point datum'''):可以表示为浮点格式的,浮点数或 NaN 。 * '''浮点数'''('''floating-point number'''):可以表示为浮点格式的有限或无穷的数。不是 NaN 的浮点数据。全部浮点数,包括 0 和无穷,都是有符号数。 * '''NaN''' ('''not a number''',可译为'''非数字'''):“非数字”,一个符号性的浮点数据。分为两种:不触发异常信号的 '''qNaN''' (quite NaN) 和无效操作时触发异常信号的 '''sNaN''' (signaling NaN) 。 * '''基数'''('''radix''''):二进制或十进制浮点数中的基数,即 2 或 10 。用 <math>b</math> 表示。 * '''指数'''('''exponent'''):有限浮点数的一个组成部分,包含其浮点表示中基数幂部分的指数。当有效数部分看成小数时,指数用 <math>e</math> 表示。当有效数部分看成整数时,指数用 <math>q</math> 表示。 * '''阶码'''('''biased exponent'''):指数与一个常数之和,其中常数选择使得指数范围非负。 * '''有效数'''('''significand'''):有限浮点数的一个组成部分,包含其有效数字。有效数本身是选择了合适的指数偏离之后得到的,可以看成整数、小数或其他定点形式。十进制和非规格化的有效数可以有前导 0 。 * '''尾数域'''('''trailing significand field'''):二进制或十进制浮点格式编码中的一个组成部分,包含除首位外的有效数字。在这些格式中,阶码或组合域会编码或隐含有效数字的首位。 * '''精度'''('''precision'''):格式中表达有效数的位数,或者舍入时舍入目标的位数。用 <math>p</math> 表示。 * '''规格化数'''('''normal number'''):对一种特定形式,指其中绝对值大于等于 <math>b^{emin}</math> 的有限非零浮点数。规格化数可以使用全部精度。 * '''非规格化数'''('''subnormal number''' / '''denormalized number'''):对一种特定格式,指其中绝对值小于该格式下最小规格化数绝对值的非零浮点数。非规格化数无法完整使用同一格式下规格化数所能够使用的精度。(注意:在标准文件中,非规格化数不包括 0 ,但是格式其实是一致的,所以一般说法中非规格化数包括 0 的表示。具体需要根据上下文推断) === 实数和浮点数据对应层级关系 === {| class='wikitable' width='100%' | Level 1 | <math>\{-\infty, \cdots, 0, \cdots, +\infty\}</math> | [[扩展实数]] |- | ↑多对一↓ | colspan=2 | (上到下)舍入/(下到上)投影,除 NaN 外 |- | Level 2 | <math>\{-\infty, \cdots, -0\} \cup \{+0, \cdots, +\infty\} \cup \mathbf{NaN}</math> | 浮点数据 |- | ↑一对多↓ | colspan=2 | (上到下)浮点数的表示 |- | Level 3 | <math>(\mathbf{Sign}\times\mathbf{Exponent}\times\mathbf{Signifcand})\cup</math><br/><math>\{-\infty,+\infty\} \cup \mathbf{qNaN} \cup \mathbf{sNaN}</math> | 浮点数的表示,<br/>浮点格式 |- | ↑一对多↓ | colspan=2 | (上到下)浮点表示的编码 |- | Level 4 | <math>\{\mathbf{0},\mathbf{1}\}^n = \{\mathbf{0000\cdots}, \mathbf{0001\cdots}, \cdots\}</math> | [[二进制串]] |} === 浮点数据集及相关记号 === 本节刻画浮点格式中所有可表示的浮点数据。 首先明确描述数据范围时使用的参数。 * <math>b</math> :基数。 * <math>p</math> :精度(有效数位数)。 * <math>emax</math> :指数 <math>e</math> 的最大值。 * <math>emin</math> :指数 <math>e</math> 的最小值。总是取 <math>emin=1-emax</math> 。 如果将数字部分看作小数,浮点数据的集合包括: * 有符号 0 及有符号非零浮点数有形式 <math>(-1)^s \times b^e \times m</math> : ** <math>s</math> 是符号位,取 0 或 1 。 ** <math>e</math> 是指数,满足 <math>emin \leq e \leq emax</math> 。 ** <math>m</math> 是数码串 <math>d_0 \cdot d_1 d_2 \cdots d_{p-1}</math> ,其中 <math>0 \leq d_i < b</math> 。 * 两个无穷, <math>-\infty, +\infty</math> * 两个 NaN , <math>\mathrm{qNaN}</math> 和 <math>\mathrm{sNaN}</math> 如果将数字部分看作小数,则可以表示成: * 有符号 0 及有符号非零浮点数有形式 <math>(-1)^s \times b^q \times c</math> : ** <math>s</math> 是符号位,取 0 或 1 。 ** <math>q</math> 满足 <math>emin \leq q+p-1 \leq emax</math> 。 ** <math>c</math> 是数码串 <math>d_0 d_1 d_2 \cdots d_{p-1}</math> ,其中 <math>0 \leq d_i < b</math> 。 至于真值本身,因为精度是根据数的有效数字位数确定的,相对精度几乎固定,绝对精度在不同大小的数下有不同。 如果考虑具体能表示哪些数比较复杂, 但是可以根据表示给出一个大致范围: 规格化数中,能表示的最小正数为 <math>b^{emin}</math> ,最大整数为 <math>b^{emax} (b - b^{1-p})</math> 。 非规格化数用于表示绝对值过小无法规格化的数,其中指数部分取最小可能指数,尾数部分因为过于小而具有前导 0 。英语称为 subnormal ,其中 sub- 指的是绝对值比规格化要小。 非规格化数能表示的最小数为 <math>b^{-emin} \times b^{1-p}</math> 。 === 基本格式 === '''基本格式'''('''basic formmat''')指五种类型:二进制类型 binary32 、 binary 64 、 binary128 ,十进制类型 decimal64 、 decimal128 。 === 二进制的交换格式 === 交换格式(interchange format)指的是在实现间交换浮点数据的格式,规定了每个格式下的精度和范围,保证以此标准交换浮点数据时必然可以完全准确地得到结果。在交换格式中, IEEE 754 标准制定了 16 、 32 、 64 、 128 位,以及一个长度不少于 128 且是 32 倍数的通用格式。 在二进制交换格式中,由于规格化数有效数部分最高位总是 1 ,省略掉(严格地说是通过判断阶码来是否是规格化数来确定)并将剩余的 <math>p-1</math> 位尾数作为尾数段保存。 ==== binary16 ==== 在[[数据类型]]中称为[[半精度浮点数]]。 符号位 1 位、阶码 5 位、尾数 10 位(精度 11 位)。 {{GiteaSvg|floating_point_binary16}} ==== binary32 ==== 在数据类型中称为[[单精度浮点数]]。在 IEEE 754-1985 中曾被称为 single 。 符号位 1 位、阶码 8 位、尾数 23 位(精度 24 位)。 {{GiteaSvg|floating_point_binary32}} ==== binary64 ==== 在数据类型中称为[[双精度浮点数]]。在 IEEE 754-1985 中曾被称为 double 。 符号位 1 位、阶码 11 位、尾数 52 位(精度 53 位)。 {{GiteaSvg|floating_point_binary64}} ==== binary128 ==== 在数据类型中称为[[四精度浮点数]]。 符号位 1 位、阶码 15 位、尾数 112 位(精度 113 位)。 {{GiteaSvg|floating_point_binary128}} ==== 通用 binary 格式 ==== 记位数为 <math>k</math> ,则符号位 1 位、阶码 <math>\operatorname{round}(4 \log_2 k) - 13</math> 位、精度 <math>k - \operatorname{round}(4\log_2 k) - 13</math> 。 ==== binary256 ==== 类型 binary256 在 IEEE 754-2008 中交换格式部分声明。在 IEEE 754-2019 中并入通用 binary 格式,不再直接单独提出。 在数据类型中称为[[八精度浮点数]]。 符号位 1 位、阶码 19 位、尾数 236 位(精度 237 位)。 {{GiteaSvg|floating_point_binary256}} === 扩展格式 === IEEE 754 标准还规定了扩展精度格式(extended precision format)和可扩展精度格式(extendable precision format)。 可以简单地认为是扩展精度格式就是允许新的格式继承某一种比其位数更小的格式,使得精度不少于原精度,阶码范围的 <math>emax</math> 不小于原阶码范围,且仍然要求有 <math>emin = 1-emax</math> 等。 可扩展精度是允许在某一格式的基础上由用户指定精度和阶码范围。 ==== x87 80bit 扩展精度浮点数 ==== 一种较为常见的扩展精度格式是在 Intel 8087 协处理器(co-processor)芯片。早期 x86 架构芯片,如 8086/80286/80386/80386SX 处理器中没有硬件浮点运算单元,只能由软件模拟浮点运算,速度较慢,如果想要浮点算力,需要额外搭配对应的 8087/80287/80387/80387SX 协处理器专门进行浮点运算。其中支持一种额外的,扩展精度浮点数,长 80 位。尽管后续浮点运算能力一起合并进处理器中,其中的 80 位浮点数相关的寄存器与运算指令至今仍然用 x87 称呼<ref>[https://www.zhihu.com/question/541008992/answer/3174020732 有人知道x87是怎么一回事吗? - MoMo的回答 - 知乎]</ref>。 这一格式中有符号位 1 位、阶码 15 位、精度 64 位,包含整数位 1 位和尾数位 63 位。 这个浮点格式本身也用于承载如双精度浮点数取幂等复杂需要额外精度运算的中间结果,因此整数部分没有按照一般隐藏位的方式隐藏掉,而且阶码位数和 binary64 一致 。 === 舍入方向属性 === IEEE 754 中规定了一些具有语义的参数,这些参数逻辑上关联于程序块、控制浮点数行为、可用于平衡精度和性能等,称为'''属性'''('''attribute''')。这里只介绍舍入方向属性。 舍入方向属性(rounding-direction attribute)顾名思义指有限浮点数在尾数超过精度范围后,即出现无法表示部分时的舍入规则,标准中规定了 5 种不同的属性取值。 * <code>roundTiesToEven</code> 四舍五入,平分时取最近偶数:无法表示部分通过四舍五入舍去或加到最后一位尾数上,也就是取最近的可表示浮点数,当两侧可表示整数距离相同时,取其中尾数的末尾为整数的那一侧。 * <code>roundTiesToAway</code> 四舍五入,平分时取远离的:无法表示部分通过四舍五入舍去或加到最后一位尾数上,也就是取最近的可表示浮点数,当两侧可表示整数距离相同时,取其中绝对值更大的。(这一条对二进制格式不是必须提供) * <code>roundTowardPositive</code> 向上取整:总是取最接近且不小于精确结果的可表示数,可以是正无穷。 * <code>roundTowardNegative</code> 向下取整:总是取最接近且不大于精确结果的可表示数,可以是负无穷。 * <code>roundTowardZero</code> 向零取整:总是取最接近且绝对值不大于精确结果的可表示数。 === 规格化数、非规格化数、特殊值 === 本节只讨论二进制浮点数的类型。十进制浮点数因为不是隐藏位,规则与下列规则有区别。 在术语列表一节提到过,浮点数据包括几类:正常使用精度的数即规格化数,绝对值过小所以不要求小数点对齐来换取更大表示范围的非规格化数,以及无穷、 NaN 等特殊值。在 IEEE 754 标准中,这些值通过阶码部分区分。阶码全 0 的数分配给非规格化数,全 1 的数分配给特殊值,中间的部分分配给规格化数。 ==== 规格化数 ==== 由于不存在全零和全一,规格化数阶码范围为 <math>1\sim 2^w-2</math> ,而阶码范围被映射到指数范围 <math>emin\sim emax</math> ,因此,偏移量 <math>b=2^{w-1}-1</math> ,也就是映射到 <math>emin=1-b=-2^{w-1}+2 \sim emax=2^w-2-b=2^{w-1}-1</math> 。 因此,一个符号位为 <math>s</math> 、尾数为 <math>M</math> 、阶码为 <math>E</math> 的规格化数,真值为 <math>(-1)^s 2^(E-b) (1+M)</math> 。 通过 <math>E</math> 的变化,实际上规格化数以 <math>p</math> 位有效数字的精度,也就是真值最高位的 <math>\tfrac{1}{2^p}</math> 的相对误差,粗略覆盖了绝对值 <math>1\times 2^{-2^{w-1}+2} \sim (2-2^{-p+1})\times 2^{2^{w-1}-1}</math> 的范围。 ==== 非规格化数及 0 ==== 由于 0 不存在科学记数法,还有范围在 <math>-1 \times {2^{w-1}+2} \sim 1 \times {2^{w-1}+2}</math> 以内这些数如果用规格化数表示,其绝对值会过小,导致阶码向下溢出。全 0 的阶码被分配给非规格化数。 非规格化数中,尾数不存在隐藏位,也就是说有效数不是 <math>1+M</math> 而是 <math>M</math> ,尽管阶码是 0 ,这个数指数仍然当作 <math>emin = -2^{w-1}+2</math> 处理,也就是让 <math>(-1)^s \times 2^{-2^{w-1}+2} (0\sim 1)</math> 和最小规格化数 <math>(-1)^s \times 2^{-2^{w-1}+2} (1 + 0)</math> 相邻,就好像其阶码也是 1 一样。 因此,一个符号位为 <math>s</math> 、尾数为 <math>0</math> 、阶码为 <math>E</math> 的非规格化数,真值为 <math>(-1)^s 2^{1-b} M = (-1)^s 2^{-2^{w-1}+2} M</math> 。 通过 <math>M</math> 的变化, 实际上规格化数以 <math>2^{-2^{w-1}+2} 2^{-p} = 2^{-2^{w-1}-p+2}</math> 的绝对误差,粗略覆盖了绝对值 <math>0 \sim 1\times 2^{2^{w-1}+2}</math> (包含左侧不包含右侧)的范围。 ===== 正负 0 ===== 在这一中表示法中, 0 的尾数和阶码都是 0 ,但是符号位没有额外要求,这意味着在这一类浮点数表示中,数 0 有 +0 和 -0 两种。一般来说,加减中得到的都是 +0 ,乘除时取符号异或、复制符号等传播符号的操作,以及在 <math>\tfrac{1}{-\infty}</math> <math>\tfrac{-1}{+\infty}</math> 之类的特殊算式会产生 -0 。一些其他的规定浮点运算中表示从负方向趋近 0 的值也会使用 -0 。 特别地,其中 +0 由于符号位也是 0 ,所有的位都是 0 。 ==== 关于无穷 ==== 指数全 1 、尾数全 0 、符号位任意的编码有两个,分别按照符号位对应给 <math>+\infty</math> 和 <math>-\infty</math> 。 ==== 关于 NaN ==== 指数全 1 、尾数不是全 0 的全体编码,无论符号位取值都看成 NaN 。看尾数最高位,即 <math>d_1</math> 的取值,取 1 的视为 qNaN ,取 0 的视为 sNaN 。如果尾数最高位为 0 ,其他后续位必须有非零为来保证其不会与 <math>-\infty</math> 冲突。后续其他位可以有着任意负载,比如给用户的诊断信息等。 ===== NaN 的传播 ===== 绝大多数浮点数与 NaN 运算时都会得到 NaN ,两个 NaN 运算则按照具体实现选择与其中一个相同负载的 NaN 。 ==== 编码分布总结 ==== {{GiteaSvg|floating_point_classes}} === 浮点运算 === 类似于行为决定数据类型的理念, IEEE 754 标准中还对这些数的行为,即运算,进行了规定。这些规定除了作为指定浮点数具体行为以外,也解决了之前由于硬件实现不同造成同一未定义错误在不同硬件上出现不同结果的问题。 ==== 必需运算 ==== 仍然指列出二进制类型相关的元素。 {| class="wikitable" width=100% ! rowspan=11 | 同类型运算 (homogeneous operations) ! rowspan=6 | [[取整函数|取整]]、[[四舍五入|舍入]] | <code>roundToIntegralTiesToEven</code> 舍入到最近整数,平分时取最近偶数 |- | <code>roundToIntegralTiesToAway</code> 舍入到最近整数,平分时取远离 0 |- | <code>roundToIntegralTowardZero</code> 向零取整 |- | <code>roundToIntegralTowardPositive</code> 向上取整 |- | <code>roundToIntegralTowardNegative</code> 向下取整 |- | <code>roundToIntegralExact</code> 取准确整数:失败则 <code>inexact</code> 异常 |- ! rowspan=2 | 相邻浮点数 | <code>nextUp</code> 更大的下个浮点数;只有 <math>+\infty</math> 还是 <math>+\infty</math> |- | <code>nextDown</code> 更小的下个浮点数;只有 <math>-\infty</math> 还是 <math>-\infty</math> |- ! [[取余]] | <code>remainder</code> 取余 |- ! rowspan=2 | 以 b 为底格式转换 | <code>scaleB</code> 以 b 为底缩放, <math>x b^N</math> |- | <code>logB</code> 以 b 为底整数对数,即浮点数的指数部分 <math>e</math> |- ! rowspan=6 | 算术运算 | colspan=2 | <code>addition</code> [[加法]] |- | colspan=2 | <code>subtraction</code> [[减法]] |- | colspan=2 | <code>multiplication</code> [[乘法]] |- | colspan=2 | <code>division</code> [[除法]] |- | colspan=2 | <code>squareRoot</code> [[算术平方根]];只有正数和 -0 可用,特别地, <code>squareRoot(-0)</code> 应为 -0 |- | colspan=2 | <code>fusedMultiplyAdd</code> 也叫 FMA 或 fmadd ;单个指令进行乘法并放入累加器,只做一次舍入 |- ! rowspan=11 | 与整数的转换 | colspan=2 | <code>convertFromInt</code> 将整数转换为浮点数 |- | colspan=2 | <code>convertToIntegerTiesToEven</code> 舍入到最近整数,平分时取最近偶数;结果为整数 |- | colspan=2 | <code>convertToIntegerTiesToAway</code> 舍入到最近整数,平分时取远离 0 ;结果为整数 |- | colspan=2 | <code>convertToIntegerTowardZero</code> 向零取整;结果为整数 |- | colspan=2 | <code>convertToIntegerTowardPositive</code> 向上取整;结果为整数 |- | colspan=2 | <code>convertToIntegerTowardNegative</code> 向下取整;结果为整数 |- | colspan=2 | <code>convertToIntegerExactTiesToEven</code> 舍入到最近整数,平分时取最近偶数;结果为整数;不精确时异常 |- | colspan=2 | <code>convertToIntegerExactTiesToAway</code> 舍入到最近整数,平分时取远离 0 ;结果为整数;不精确时异常 |- | colspan=2 | <code>convertToIntegerExactTowardZero</code> 向零取整;结果为整数;不精确时异常 |- | colspan=2 | <code>convertToIntegerExactTowardPositive</code> 向上取整;结果为整数;不精确时异常 |- | colspan=2 | <code>convertToIntegerExactTowardNegative</code> 向下取整;结果为整数;不精确时异常 |- ! 浮点格式间转换 | colspan=2 | <code>convertFormat</code> 转换到其他基数的类型,或者窄化到精度更低的类型 |- ! rowspan=2 | 和字符序列间转换 | colspan=2 | <code>convertFromDecimalCharacter</code> |- | colspan=2 | <code>convertToDecimalCharacter</code> |- ! rowspan=2 | 和十六进制字符序列间转换 | colspan=2 | <code>convertFromHexCharacter</code> |- | colspan=2 | <code>convertToHexCharacter</code> |- ! rowspan=4 | 计算-无异常(quiet-computational)操作 ! rowspan=4 | 符号位 | <code>copy</code> 复制操作数 |- | <code>negate</code> 复制操作数,但[[位反转|反转]]符号位 |- | <code>abs</code> 复制操作数,但[[位清除|清除]]符号位 |- | <code>copySign</code> 带两个操作数,复制操作数 1 ,但符号位赋值自操作数 2 |- ! rowspan=2 | 计算-异常(signaling-computational)操作 ! rowspan=2 | 比较 | <code>compareQuietEqual</code><br/><code>compareQuietNotEqual</code><br/><code>compareQuietGreater</code><br/><code>compareQuietGreaterEqual</code><br/><code>compareQuietLess</code><br/><code>compareQuietLessEqual</code><br/><code>compareQuietUnordered</code><br/><code>compareQuietNotGreater</code><br/><code>compareQuietLessUnordered</code><br/><code>compareQuietNotLess</code><br/><code>compareQuietGreaterUnordered</code><br/><code>compareQuietOrdered</code><br/>涉及 NaN 时比较结果为 unordered ,其他按正常比较顺序且 ±0 相等 |- | <code>compareSignalingEqual</code><br/><code>compareSignalingNotEqual</code><br/><code>compareSignalingGreater</code><br/><code>compareSignalingGreaterEqual</code><br/><code>compareSignalingLess</code><br/><code>compareSignalingLessEqual</code><br/><code>compareSignalingNotGreater</code><br/><code>compareSignalingLessUnordered</code><br/><code>compareSignalingNotLess</code><br/><code>compareSignalingGreaterUnordered</code><br/>涉及 NaN 时比较结果为 unordered ,触发 invalid operation 异常,其他按正常比较顺序且 ±0 相等 |- ! rowspan=20 | 非计算运算 ! 一致性判断 | <code>is754version1985</code><br/><code>is754version2008</code><br/><code>is754version2019</code><br/>判断是否和指定标准一致 |- ! rowspan=7 | 一般运算 | <code>class</code> 返回给定浮点数所属十类之一: sNaN 、 qNaN 、 -∞ 、负规格化数、负非规格化数、 -0 、 +0 、正非规格化数、正规格化数、 +∞ 。 |- | <code>isSignMinus</code> 返回符号位是否是负号,对 ±0 和 NaN 也有效。 |- | <code>isNormal</code> 是否是规格化数<br/><code>isFinite</code> 是否有限(即是规格化数、非规格化数或 0 ,不是无穷或 NaN)<br/><code>isZero</code> 是否是 ±0<br/><code>isSubnormal</code> 是否是非规格化数(不包括 0)<br/><code>isInfinite</code> 是否是无穷<br/><code>isNaN</code> 是否是 NaN<br/><code>isSignaling</code> 是否是 sNaN |- | <code>isCanonical</code> 是否是规范的有限数、无穷、 NaN 。用于具体实现中对不可交换的格式返回是否正规 |- | <code>radix</code> 基数 2 或 10 |- | <code>totalOrder</code> 返回两个参数在浮点数[[全序]]下的比较;浮点数全序是 -qNaN<-sNaN<-∞<按大小负数<-0<+0<按大小正数<+∞<+sNaN<+qNaN ,但不规定不同负载的同种 NaN 的顺序 |- | <code>totalOrderMag</code> 返回两个参数绝对值在浮点数全序下的比较, <code>totalOrderMag(x,y)</code> 和 <code>totalOrder(abs(x), abs(y))</code> 等价 |- ! rowspan=6 | 标识位子集运算 | <code>lowerFlags</code> 从当前标识位中,按掩码清理给定标识位 |- | <code>raiseFlags</code> 向当前标识位中,按掩码[[位设置|设置]]给定标识位 |- | <code>testFlags</code> 在当前标识位中,按掩码检查是否有任何一个被设置 |- | <code>testSavedFlags</code> 在参数 1 中,检查参数 2 给出的标识位掩码中是否有任何一个被设置 |- | <code>restoreFlags</code> 在当前标识位中,按参数 2 给定的标识位掩码,置为参数 1 中的取值 |- | <code>saveAllFlags</code> 将当前标识位返回;可以用于 <code>testSavedFlags</code> 和 <code>restoreFlags</code> |} ==== 推荐运算 ==== 这些基本运算有不同算法,在计算机上一些是软件实现,一些是硬件实现,在缺少乘法的机器上以及计算器上,还有 CORDIC 及其变种算法。 因为本 wiki 不多涉及硬件算法,不做过多展开,举例时以泰勒展开作为值的说明。 表中部分运算在取值区间边界处存在除零异常。 这些运算只是推荐,有些函数在部分平台上可能不可移植,这些不可移植的函数也没有进入 [[C 语言]]标准。 {| class="wikitable" width="100%" ! rowspan=4 | [[幂函数]]和[[对数函数]]类 | <code>exp</code> <math>\exp x = \mathrm{e}^x, x \in [-\infty,+\infty]</math><br/> <code>exp2</code> <math>2^x, x \in [-\infty,+\infty]</math><br/> <code>exp10</code> <math>10^x, x \in [-\infty,+\infty]</math><br/> | - |- | <code>expm1</code> <math>\exp x - 1 = \mathrm{e}^x - 1, x \in [-\infty,+\infty]</math><br/> <code>exp2m1</code> <math>2^x-1, x \in [-\infty,+\infty]</math><br/> <code>exp10m1</code> <math>10^x-1, x \in [-\infty,+\infty]</math> | 考虑 <math>\exp x = \sum_{n=0}^\infty \tfrac{1}{n!} x^n = 1 + x + \tfrac{1}{2!}x^2 + \tfrac{1}{3!}x^3 + \cdots</math> ,<br/>当 <math>x</math> 接近 0 时, <code>exp(x)-1</code> 因为计算 <code>exp(x)</code> 时精度相对首项的 1 开始计二进制位数,<br/>所以有专门指令给出一个计算时不加第一项的变体。 |- | <code>log</code> <math>\ln x, x\in [0, +\infty]</math><br/> <code>log2</code> <math>\log_2 x, x\in [0, +\infty]</math><br/> <code>log10</code> <math>\log_{10} x, x\in [0, +\infty]</math> | - |- | <code>logp1</code> <math>\ln (1+x), x\in [-1, +\infty]</math><br/> <code>log2p1</code> <math>\log_2 (1+x), x\in [-1, +\infty]</math><br/> <code>log10p1</code> <math>\log_{10} (1+x), x\in [-1, +\infty]</math> | 考虑 <math>\ln x = \sum_{n=1}^\infty (-1)^{n+1} \tfrac{(x-1)^n}{n}</math> ,<br/>当 <math>x</math> 接近 0 时, <code>ln(1+x)</code> 会在加 1 时舍入损失精度,而这个 1 在运算过程中又是一定要减去的,<br/>所以有专门指令给出一个计算时不用减去一的变体。 |- ! rowspan=4 | 特殊幂与整数指数幂 | <code>rSqrt</code> <math>\tfrac{1}{\sqrt{x}}, x\in [0,+\infty]</math> | - |- | <code>compound</code> <math>(1+x)^n, x\in [-1,\infty], n\in \mathbf{Z}</math> | - |- | <code>rootn</code> <math>x^\tfrac{1}{n}, x\in [-\infty,+\infty], n\in \mathbf{Z}</math> | - |- | <code>pown</code> <math>x^n, x\in [-\infty,+\infty],n\in\mathbf{Z}</math> | - |- ! rowspan=2 | 指数 | <code>pow</code> <math>x^y, x\in [-\infty, +\infty], y \in [-\infty, +\infty]</math> | - |- | <code>powr</code> <math>x^y, x\in [0, +\infty], y \in [-\infty, +\infty]</math> | - |- ! rowspan=9 | [[三角函数]]类和幅角、长度类 | <code>sin</code> <math>\sin x, x\in (-\infty,+\infty)</math><br/> <code>cos</code> <math>\cos x, x\in (-\infty,+\infty)</math><br/> <code>tan</code> <math>\tan x, x\in (-\infty,+\infty)</math> | - |- | <code>sinPi</code> <math>\sin x\pi, x\in (-\infty,+\infty)</math><br/> <code>cosPi</code> <math>\cos x\pi, x\in (-\infty,+\infty)</math><br/> <code>tanPi</code> <math>\tan x\pi, x\in (-\infty,+\infty)</math> | - |- | <code>asinPi</code> <math>\tfrac{1}{\pi}\arcsin x, x\in [-1,+1]</math><br/> <code>acosPi</code> <math>\tfrac{1}{\pi}\arccos x, x\in [-1,+1]</math><br/> <code>atanPi</code> <math>\tfrac{1}{\pi}\arctan x, x\in [-\infty,+\infty]</math> | - |- | <code>asin</code> <math>\arcsin x, x\in [-1,+1]</math><br/> <code>acos</code> <math>\arccos x, x\in [-1,+1]</math><br/> <code>atan</code> <math>\arctan x, x\in [-\infty,+\infty]</math> | - |- | <code>asinh</code> <math>\operatorname{arsinh} x, x\in [-\infty,+\infty]</math><br/> <code>acosh</code> <math>\operatorname{arcosh} x, x\in [+1,+\infty]</math><br/> <code>atanh</code> <math>\operatorname{artanh} x, x\in [-1,+1]</math> | - |- | <code>hypot</code> 斜边长 <math>\sqrt{x^2+y^2}</math> | - |- | <code>atan2</code> 幅角 | - |- | <code>atan2Pi</code> 幅角除以 <math>\pi</math> | - |} === 异常及处理 === 主要的异常有 5 个,会根据不同的可选择异常处理属性(alternate exception handling attributes)更改是否发生异常,简略起见这里只介绍默认属性下的处理: * 无效运算:参数不在运算定义域;默认属性下有 signaling 的运算名可以返回 sNaN ,否则只返回 qNaN ; * 除以零:除数为 0 ,以及取对数时真数为 0 等场景;默认属性下只返回对应无穷; * 上溢:数字绝对值过大,舍入时会舍入到无穷;默认属性下只返回对应无穷; * 下溢:数字绝对值过小,舍入时会低于最小规格化数;默认属性下选择一个舍入结果,可以是 0 、非规格化数或最小规格化数; * 不准确:操作中有 exact 的函数在舍入时发现无法准确表示的情况;默认返回舍入结果。 {{数的编码}}
返回
IEEE 754
。
Advertising: