1.IEEEとは
IEEE (Institute of Electrical and Electronics Engineers の正式名) は、電子技術および情報科学技術者の国際協会であり、世界最大の非営利専門技術協会です。
IEEE は、電気、電子、コンピュータ エンジニアリングおよび科学関連分野の開発と研究に注力しており、宇宙、コンピュータ、電気通信、生物医学、電力および家電製品の分野で 1,300 以上の業界標準を開発し、大きな影響力を持つ国際学術団体となる。
IEEE は、70 を超えるジャーナルや雑誌を発行し、毎年 300 を超える専門会議を開催し、電気電子工学、コンピューター、制御技術の分野における世界の文献のほぼ 3 分の 1 を出版しています。IEEE が定義する標準は業界に大きな影響を与え、IEEE が開発した標準は国際社会でも広く採用されています。
2. IEEE 754規格
IEEE 754 は、米国電気電子学会 (IEEE) によって策定された浮動小数点演算の標準であり、正式名称は「IEEE Standard for Floating-Point Arithmetic」で、1985 年に初めてリリースされ、その後 1987 年、2008 年、および 2008 年に改訂されました。 2019年。
IEEE 754 標準は、正の数、負の数、ゼロ、および特殊な値 (無限大や NaN - 非数値) を含む 2 進浮動小数点数の表現を定義します。主に次のように規定されています。
--> 1. 浮点数的格式:
包括单精度(32位)、双精度(64位)以及其他扩展精度格式。
每个浮点数由三部分组成:符号位(sign bit)、阶码(exponent field)和尾数(mantissa或fraction field)。
--> 2. 范围和精度:
根据不同的格式,浮点数可以表示非常大或非常小的数值,同时具有一定的有效数字精度。
--> 3. 特殊数值的表示:
例如,±0、±无穷大(infinity)以及非数字值(NaN)都有特定的编码方式。
--> 4. 运算规则:
包括加减乘除、舍入规则、比较大小等基本运算的行为规范。
その汎用性と効率性により、今日のほとんどすべてのコンピュータ システムとプログラミング言語は、浮動小数点演算を処理するために IEEE 754 標準を採用しているか、IEEE 754 標準と互換性があります。
3. コンピュータにおけるIEEE 754規格の表現と計算方法
IEEE 754 標準は、コンピュータで浮動小数点数を表現および計算する方法を定義します。以下では、単精度 (32 ビット) 浮動小数点数を例として、10 進数を IEEE 754 標準に準拠した 2 進数形式に変換する方法を説明します。
1. 単精度 (32 ビット) 形式
1、符号位(Sign bit)
最高位1位,0表示正数,1表示负数。
2、阶码(Exponent)
接下来8位,用于存储指数信息,通常采用偏移形式(即阶码减去某个固定的偏置值)来存储实际指数。
3、尾数(Mantissa或Fraction)
最后23位,存储小数部分,通常会省略第一位的隐藏位(该位始终为1),所以有效尾数是24位。
2. 変換手順
-->1. 处理符号位:
• 如果原数为正,则符号位设为0;
• 如果原数为负,则符号位设为1。
-->2. 转换为二进制并规范化:
• 把十进制数转换为二进制科学计数法的形式,例如 (-1)^s * m * 2^e,其中s是符号,m是规格化的尾数(范围在1到2之间的小数),e是指数。
• 规范化意味着确保尾数部分的第一位总是1(这个1在存储时会被隐含存储,不占用实际位数)。
-->3. 编码阶码:
• 对于单精度浮点数,阶码的实际值等于原始指数加上一个偏置常数,通常是127(对于双精度则是1023)。
• 计算 E = e + 127(对于单精度)并将结果以二进制补码形式存入8位阶码字段。
-->4. 编码尾数:
• 将规格化后的尾数(去掉第一位的1后剩余的部分)转换为二进制,并填充到尾数字段。
-->5. 特殊情况处理:
• 若数字为0,则尾数全为0,阶码根据实际情况决定是0还是最小负指数(表示±0)。
• 若数字为无穷大或NaN,则阶码字段全为1,尾数全为0,通过符号位区分正负无穷大,而某些特定的尾数模式用于表示不同类型的NaN。
-->6. 组合所有部分:
• 将符号位、阶码字段和尾数字段按照上述规则拼接起来形成32位的二进制数。
3. 例
将十进制数33.758转换为IEEE 754单精度浮点数(32位)
-->1. 符号位(Sign):
• 因为33.758是正数,所以符号位S设为0。
-->2. 转换为二进制并规范化:
• 首先将整数部分33转换为二进制:33 = 100001
• 将小数部分0.758转换为二进制。这通常需要不断地乘以2并记录下整数部分直到达到足够的精度或者达到 尾数部分的最大位数。对于单精度浮点数,尾数有23位精度(不包括隐含的最高位1)。
计算得到近似的二进制小数表示:
0.758 ≈ 0.11000100110001...
注意这里为了简化说明,我们没有实际展示完整精确的转换过程,但理论上要确保尾数部分在截断到23位后尽可能接近原始值。
-->3. 规格化:
移动小数点使第一位数字成为1(隐含),并相应地调整指数。由于原数大于1,我们需要向左移动两位得到规范化的结果:
1.1000100110001... * 2^2
-->4. 编码指数(E):
规范化后的指数是2,加上偏置常数127得到实际存储的指数E:
E = 2 + 127 = 129
将129转换为8位无符号偏移指数的二进制形式(即二进制补码形式,但因为这里是正数所以与无符号等价):
129 = 10000001 (二进制)
-->5. 编码尾数(M):
将规范化后的尾数去掉第一位的1,剩余部分填充到23位尾数字段:
Mantissa = 1.000100110001... -> 000100110001... (忽略首位的1,保留23位)
-->6. 组合成最终的单精度浮点数:
将符号位、指数和尾数组合起来:
单精度浮点数: S Exponent Mantissa
0 10000001 000100110001...
最后,将它们拼接起来形成32位的单精度浮点数。
注意:以上步骤中的尾数部分可能因为手头条件限制而进行了近似处理,在实际操作中,尾数应准确转换至23位,并且有可能需要四舍五入或舍去最低有效位以适应标准格式要求。同时,指数也需要正确按照IEEE 754单精度浮点数格式进行编码。
3. IEEE 754 標準がどのようにして誕生したか
IEEE 754 標準が登場する前は、業界に統一された浮動小数点数標準は存在せず、多くのコンピュータ メーカーが独自の浮動小数点数ルールと演算の詳細を設計しました。当時は、数値の正確さよりも実装のスピードとシンプルさが重視されていました。
1985 年まで、Intel は 8086 マイクロプロセッサに浮動小数点コプロセッサを導入することを計画していましたが、チップ設計者としての電子技術者や固体物理学者が数値解析を通じて最適な選択を選択できない可能性があることを賢明に認識していました。浮動小数点数の場合。
そこで、Intel は、最高の数値アナリストの 1 人であるカリフォルニア大学バークレー校の William Kahan 教授を 8087 FPU の浮動小数点フォーマットの設計に招待し、この教授が支援するために 2 人の専門家を雇ったため、KCS の組み合わせが誕生しました (カーン、クーナン、ストーン)。
彼らは共同でインテルの浮動小数点フォーマットの設計を完成させ、それが非常にうまくいったため、IEEE 組織は KCS に非常に近いソリューションを IEEE の標準浮動小数点フォーマットとして採用することを決定しました。
現在、ほぼすべてのコンピュータがこの標準をサポートしているため、科学アプリケーションの移植性が大幅に向上します。