ページ更新: 2013-07-01 (月) (1873日前)

浮動小数点数のデータフォーマットと演算の規格 IEEE 754 と、各種のCPUの実装についてのリンクとメモ。

一部、IEEE 754-2008 = IEEE 754r + IEEE 854 も含む。

目次

[編集]

浮動小数点数とは #

[編集]

IEEE 754 #

(2013-06-06 更新)

  • 2007-09-07 【コラム】コンピュータアーキテクチャの話 (92) IEEE 754規格と浮動小数点演算 | マイコミジャーナル
    • IEEE 754以前の浮動小数点データフォーマット / ヒドン(Hidden)ビットで精度を1ビットを稼ぐ / IEEE754規格の特徴 / ガードビット、ラウンドビットとスティッキービット / デノーマル数(非正規化数) / 無限大とNaN / 例外の記録と割り込みの発生 / IEEE754規格の拡張 / 加算結果のノーマライズ / 丸め / 浮動小数点加算のパイプライン処理 / 積和演算は命令コードの設計に負担 / 積和演算器では巨大なシフタとアダーを使う / 浮動小数点除算器 / 平方根演算器 / Newton-Raphson法による除算 / Goldschmidt法 / 反復法による平方根の計算 / IEEE 754rの10進浮動小数点データフォーマット / 10進数を圧縮格納するDensely Packed Decimal形式 / ExponentとBias / Combination Field / 10進浮動小数点データの範囲 / 10進数の演算ハードウェア / 演算器シリーズの終わりにあたって
  • 2005-11 数値計算ガイド Sun™ Studio 11 (PDF)
    • SPARC, x86, x64
    • 付録 C x86の動作と実装 (いわく「この付録では、x86またはx64とSPARCの互換性問題のうちx86またはx64システムで使用される浮動小数点ユニットに関連する部分について説明します。」
  • IEEE754 浮動小数点数表現 (浅煎り珈琲 -Java アプリケーション入門)
    • 試してみた (JDK 6u18):
      public final class FloatingPoint {
          public static void main(final String[] args) {
              for (final String arg: args) {
                  // 文字列 arg を double 型に変換
                  final double f = Double.parseDouble(arg);
      
                  // double 型 f のビット表現を文字列 str に変換
                  final String str = Long.toBinaryString(Double.doubleToRawLongBits(f));
                  System.out.format("%-10s = %s\n", arg, str);
              }
          }
      }

      コンパイル、実行:
      $ javac FloatingPoint.java
      
      $ java FloatingPoint 0.5 0.25 0.1
      0.5        = 11111111100000000000000000000000000000000000000000000000000000
      0.25       = 11111111010000000000000000000000000000000000000000000000000000
      0.1        = 11111110111001100110011001100110011001100110011001100110011010
[編集]

半精度浮動小数点数 #

メモ: (2014-06-25) Sysinternals で F16C 命令の有無を調べる

C:> coreinfo | findstr F16

Coreinfo v3.21 - Dump information on system CPU and memory topology
Copyright (C) 2008-2013 Mark Russinovich
Sysinternals - www.sysinternals.com
F16C            *       Supports half-precision instruction
[編集]

x86 FPU, SSE, AVX, FMA #

(2013-06-06 更新)

(関連: C++/Xbyak, C++/asmjit)

  • 2005-08-08, 2009-09-02 float型とdouble型 (With Unz an Advanced Optimization for x86-CPU)
    • x86 FPU, 所要時間, 生成されたコード, 演算精度の変更, SSE
[編集]

Visual C++ #

(2013-06-06) (関連: Intel SSE/AVX/FMA, intrinsics, amd64)

コマンドラインオプション

Visual Studio プロジェクトの「プロパティ」→ 構成プロパティ → C/C++ → コード生成

  • 拡張命令セットを有効にする:
    • VS2008, VS2010: なし, SSE, SSE2
    • VS2012: なし, SSE, SSE2, AVX
  • 浮動小数点モデル: Presise, Strict, Fast
[編集]

Java strictfp #

(2013-06-06 更新)

The Java Language Specification, Java SE 7 Edition :

The Java Virtual Machine Specification, Java SE 7 Edition

The Java Language Specification, Third Edition

The Java Virtual Machine Specification, Second Edition (Updated)

[編集]

ARM VFP, NEON #

(2013-06-06 追加)

VFP:

NEON:

  • NEON は英語のページに「Data types can be: signed/unsigned 8-bit, 16-bit, 32-bit, 64-bit, single precision floating point」と 書いてあるので、日本語版の該当個所は「対応データ型: 符号付き/符号なし 8ビット/16ビット/32ビット/64ビット, および単精度浮動小数点」が正解だろう。(要するに 整数がデータ幅 8, 16, 32, 64 bitの4種類を符号付きと符号なしで扱えて、他に単精度浮動小数点(IEEE 754 の binary32, C++のfloat)が扱える,ということだろう)

ARM Compiler toolchain Assembler Reference:

AArch64 (A64):

[編集]

Visual C++ #