在x86/x64体系里,由于x87 FPU硬件使用扩展双精度格式,因此必然会遇到single/double precision格式与double extended-precision格式之间的互换问题。
当由单精度数或双精度转换为扩展双精度数时,exponent部分必须基于扩展双精度数的biased码来调整。于是扩展双精度数的exponent值为:
① 从单精度转化:exponent – 127 + 16383。
② 从双精度转化:exponent – 1023 + 16383。
而扩展双精度数的significand部分,由单/双精度数的significand部分移植过来。
以单精度数1.11...×2120为例,它转换为扩展双精度的过程如下所示。
单精度数1.11...×2120的编码值为0x7BFFFFFF,它的exponent值为0xF7(11110111B),significand部分全为1值。
于是扩展双精度数的exponent值为0xF7-127 + 16383=0x4077(1000 0000 0111 0111B),单精度23位的significand部分直接移到扩展双精度的bit62到bit40位,低40位补0。
最终的扩展双精度编码值为0x4077_FFFFFF00_00000000。而对于双精度数来说:52位的significand部分将直接移到扩展双精度的bit62到bit11位。
而从扩展双精度转换为单/双精度数的情形会复杂得多,涉及目标格式的precison(精度)问题。当扩展双精度significand部分的值超出目标格式的精度时,就会发生rounded(舍入)操作,从而引发precision异常。
要检查超出精度的significand是否为0值,如下所示。
目标格式
|
超出精度部分
|
备注
|
单精度数
|
bit 39~bit 0
|
是否为0值
|
双精度数
|
bit 10~bit 0
|
这部分不为0值时,就会发生rounded操作。
下面,我们以扩展双精度数1.11...×2120转化为单精度格式为例进行描述。当1.11...×2120为扩展双精度格式时,它的编码值为0x4077_FFFFFFFF_FFFFFFFF。
目标格式exponent部分的计算如下。
① 单精度数:exponent-16383+127。
② 双精度数:exponent-16383+1023。
这个转换过程较为复杂,如下所示。
图中的阴影部分是超出精度的significand部分(bit 39~bit 0),它的值不为0,需要进行rounded操作,在x87 FPU中这个舍入依赖于rounded控制位。
IEEE754定义了以下4种舍入模式。
① round to nearest模式:朝±∞(正和负方向的无穷大值)方向舍入。
② round down模式:正数朝最大normal值舍入,负数朝-∞方向舍入。
③ round up模式:正数朝+∞方向舍入,负数朝最大normal值舍入。
④ round zero模式:正数和负数都朝最大normal值舍入。
上图中的舍入是朝+∞方向舍入,如图所示:bit 39的值为1,它将向bit 40进行舍入,效果等于+1值。目标格式中的significand部分舍入的结果值为0。
目标格式的exponent部分为扩展双精度的exponent-16383+127=0xF7(11110111B),可是由于significand部分还是进位值,因此目标格式的最终exponent部分为0xF8(加上1值)。
因此,最终转换的单精度值为0x7C000000,转换得到的浮点数是1.0...×2121,结果大于原来的扩展双精度浮点数。
这和转换为单精度数是一致的。在双精度格式里,它的精度是52位,因此超出精度部分为bit10到bit0位。
exponent的计算是扩展双精度的exponent-16383+1023。
本文节选自《x86x64体系探索及编程》
电子工业出版社出版
邓志著
分享到:
相关推荐
本主题将深入探讨双精度浮点数及其与其他数值表示形式,如十六进制和二进制之间的转换。 首先,让我们理解浮点数的基本概念。浮点数由两部分组成:指数部分和尾数部分。在IEEE 754标准中,单精度浮点数(float)...
浮点数转换器,可将浮点数、单精度 双精度的数值转换为16进制发送
本文将详细介绍如何使用S7-200SMART进行双精度浮点数到单精度浮点数的转换,并提供相应的库文件及使用说明。 1. **浮点数类型**: 浮点数在计算机中分为单精度浮点数(32位,IEEE 754标准)和双精度浮点数(64位,...
单精度双精度浮点数转换,浮点数与16进制转换工具
浮点数整数转换工具,用于浮点数与整数之间相互转换
单精度浮点数转换工具是一种专门用于处理和转换单精度浮点数的软件。在计算机科学中,浮点数是用于表示带有小数的数值的一种数据类型,它在科学计算、图形处理等领域广泛应用。单精度浮点数是IEEE 754标准定义的一种...
labview IEE754浮点数转换程序,通过串口采集到的十六进制字符串转换成单精度的浮点数,浮点数转换成十六进制字符串
IEEE 754 单精度浮点数转换工具,支持十进制与单精度浮点数/双精度浮点数之间的互相转换
在进行单精度和双精度浮点数与十六进制转换时,需要注意的是,由于浮点数的存储方式涉及舍入误差,转换过程中可能会导致微小的精度损失。此外,不是所有的十六进制数都能准确表示为浮点数,特别是对于超出浮点数范围...
根据给定的文件信息,本知识点讲解将围绕AB-Micro系列PLC中如何将双精度浮点数转换为整形数进行展开,以下是详细知识点: 1. PLC在工业中的应用 PLC(可编程逻辑控制器)是工业自动化控制的核心设备之一。在物联网...
4. 双精度转换算法的具体实现:通过特定的算法和移位指令,S7-200 PLC可以实现双精度数据转换为长整形数的过程。该过程避免了单精度计算导致的数据丢失,提高了转换精度。 5. 现场总线技术在工业中的应用:现场总线...
本篇文章主要探讨了如何在S7-200 PLC中处理双精度浮点数转换为单精度浮点数的问题,这对于管理智能电表、远传水表等远程抄表系统的数据一致性至关重要。双精度浮点数提供了更高的精度,但在处理能力有限的S7-200 PLC...
IEEE 754是计算机科学中广泛采用的一个标准,定义了如何用二进制表示浮点数,包括单精度(32位)和双精度(64位)格式。这个工具可能是为了帮助程序员、硬件工程师或者教育工作者理解浮点数的内部结构,进行精确的...
本代码将双精度浮点数转换为单精度浮点数,适合浮点数为正值的转换。 使用后将占用VD2810~VD2970字节,欢迎交流。 本代码的完成经历了一段时间的刻苦研究,无偿提供给真正需要的人,希望同行少走弯路。 代码允许复制...
在探讨“单精度浮点数与十六进制转换_C语言程序”这一主题时,我们首先需要理解几个核心概念:单精度浮点数、十六进制以及它们之间的转换机制。此外,我们将深入分析C语言中实现这些转换的具体方法,以及如何在...
浮点数与二进制转换在计算机科学中是至关重要的概念,特别是在通信开发、数据存储和计算领域。本文将深入探讨浮点数和二进制之间的转换,以及如何利用工具进行这种转换。 浮点数是一种表示实数的方式,它允许在有限...
- 精度损失:浮点数转`char`会丢失一部分精度,可能需要对转换结果进行检查和校验。 - 波形格式:在通信协议中,浮点数通常被转换为特定的字符串格式,例如科学记数法。 - 错误处理:考虑到可能出现的溢出、下溢...
此外,当涉及到32位整数和32位浮点数之间的转换时,整数转浮点数时可能会因为浮点数的精度而产生非预期的结果,而浮点数转整数时可能因四舍五入规则产生误差。因此,在编写程序时,应充分考虑这些潜在问题,并进行...
转换浮点数通常是指将一个浮点数从一种格式(如单精度)转换为另一种格式(如双精度)。这个过程需要保留尽可能多的精度,同时处理溢出或下溢的情况。转换时,指数和尾数都要进行相应的调整,确保结果的正确性。 总...