JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 指数部とは

指数部

日本語 浮動小数点の指数の部分
英語 exponent bits
ふりがな しすうぶ
フリガナ シスウブ

解説

浮動小数点の中の「2の累乗」の部分。
doubleの場合、全64ビットの内、1ビット目~11ビット目(左端のビットを0ビット目とした場合)が指数部となる。
floatの場合、全32ビットの内、1ビット目~8ビット目(左端のビットを0ビット目とした場合)が指数部となる。

以下、doubleにおける、浮動小数点の指数部について説明する。
 
指数部には「2の累乗」が整数値として格納されている。-1023~1023の値を、整数と似たような形式で格納する。つまり指数部は「2の-1023乗」~「2の1023乗」までの値を表現できる。
つまり指数部は、「2の累乗」という非常におおざっぱな値しか表現しない。指数部はビット的に1増えただけで2倍されることになり、2、4、8、16...という飛び飛びの値を表現することになる。

この飛び飛びの値の「間の値」を作り出すために「仮数部」が存在する。指数部と仮数部を掛けた値が実際の値となる。
 
指数部に格納される「2の累乗」は、2進数での「小数点の位置」を意味する。
これは、10進数において「10の累乗」が小数点の位置を示すのと同じである。これが、「浮動小数点」という名称の由来である。

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // 浮動小数点で一番「普通」の値は「2.0」です。
        // この「2.0」という値を、指数部のビット「10000000000」
        // で表現します。
        outputDoubleBit( 2.0 );
        // 0 10000000000 0000000000000000000000000000000000000000000000000000
        //   ←指数部 → ←仮数部                                          →

        // double型の1ビット目~11ビット目は指数部が格納されます。
        // これは「2の累乗」を表します。
        outputDoubleBit( 0.125 );
        outputDoubleBit( 0.25 );
        outputDoubleBit( 0.5 );
        outputDoubleBit( 1.0 );
        outputDoubleBit( 2.0 );
        outputDoubleBit( 4.0 );
        outputDoubleBit( 8.0 );
        outputDoubleBit( 16.0 );
        // 0 01111111100 0000000000000000000000000000000000000000000000000000
        // 0 01111111101 0000000000000000000000000000000000000000000000000000
        // 0 01111111110 0000000000000000000000000000000000000000000000000000
        // 0 01111111111 0000000000000000000000000000000000000000000000000000
        // 0 10000000000 0000000000000000000000000000000000000000000000000000
        // 0 10000000001 0000000000000000000000000000000000000000000000000000
        // 0 10000000010 0000000000000000000000000000000000000000000000000000
        // 0 10000000011 0000000000000000000000000000000000000000000000000000

        // 指数のビットは、整数とほぼ同じです。
        // 01111111100 :  0.125 : 2の-3乗 : 
        // 01111111101 :  0.25  : 2の-2乗
        // 01111111110 :  0.5   : 2の-1乗
        // 01111111111 :  1.0   : 2の 0乗   ↓指数部の値を2進数で表現した場合。
        // 10000000000 :  2.0   : 2の 1乗 : 0001
        // 10000000001 :  4.0   : 2の 2乗 : 0010
        // 10000000010 :  8.0   : 2の 3乗 : 0100
        // 10000000011 : 16.0   : 2の 4乗 : 1000
        // このように、ビットは「累乗」を表しています。
        // ただし、2の-1023乗の時に00000000000、
        // 2の1023乗の時に11111111111となります。
        // つまり、マイナスの場合でも2の補数を使いません。

        // 上記の「指数部の値を2進数で表現した場合」にあるように、
        // 2進数では乗数が1増えれば桁が1増えます。
        // これが「小数点が動く」ということです。

        // 指数部では、おおざっぱな値しか取れません。
        outputDoubleBit( 512.0 );
        outputDoubleBit( 1024.0 );
        // 0 10000001000 0000000000000000000000000000000000000000000000000000
        // 0 10000001001 0000000000000000000000000000000000000000000000000000
        // このように、指数部のビット的には1しか増えていませんが、
        // 512から1024と大きく数が増えています。
        // この512と1024の値を埋めるのが、仮数部ということです。
    }

    /**
     * double型変数をビット形式で出力します。
     */
    private static void outputDoubleBit( double d )
    {
        // double型変数をビット形式で文字列化します。
        String source = Long.toBinaryString( Double.doubleToLongBits( d ) );
        // 左0埋めします。
        StringBuffer strbuf = new StringBuffer();
        forint iF1 = source.length(); iF1 < 64; ++iF1 )
        {
            strbuf.append( "0" );
        }
        strbuf.append( source );
        // 符号、仮数部、指数部の間にスペースを入れます。
        strbuf.insert( 12, " " );
        strbuf.insert( 1, " " );

        System.out.println( strbuf.toString() );
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // 浮動小数点で一番「普通」の値は「2.0」です。
        // この「2.0」という値を、指数部のビット「10000000000」
        // で表現します。
        outputDoubleBit( 2.0 );
        // 0 10000000000 0000000000000000000000000000000000000000000000000000
        //   ←指数部 → ←仮数部                                          →

        // double型の1ビット目~11ビット目は指数部が格納されます。
        // これは「2の累乗」を表します。
        outputDoubleBit( 0.125 );
        outputDoubleBit( 0.25 );
        outputDoubleBit( 0.5 );
        outputDoubleBit( 1.0 );
        outputDoubleBit( 2.0 );
        outputDoubleBit( 4.0 );
        outputDoubleBit( 8.0 );
        outputDoubleBit( 16.0 );
        // 0 01111111100 0000000000000000000000000000000000000000000000000000
        // 0 01111111101 0000000000000000000000000000000000000000000000000000
        // 0 01111111110 0000000000000000000000000000000000000000000000000000
        // 0 01111111111 0000000000000000000000000000000000000000000000000000
        // 0 10000000000 0000000000000000000000000000000000000000000000000000
        // 0 10000000001 0000000000000000000000000000000000000000000000000000
        // 0 10000000010 0000000000000000000000000000000000000000000000000000
        // 0 10000000011 0000000000000000000000000000000000000000000000000000

        // 指数のビットは、整数とほぼ同じです。
        // 01111111100 :  0.125 : 2の-3乗 : 
        // 01111111101 :  0.25  : 2の-2乗
        // 01111111110 :  0.5   : 2の-1乗
        // 01111111111 :  1.0   : 2の 0乗   ↓指数部の値を2進数で表現した場合。
        // 10000000000 :  2.0   : 2の 1乗 : 0001
        // 10000000001 :  4.0   : 2の 2乗 : 0010
        // 10000000010 :  8.0   : 2の 3乗 : 0100
        // 10000000011 : 16.0   : 2の 4乗 : 1000
        // このように、ビットは「累乗」を表しています。
        // ただし、2の-1023乗の時に00000000000、
        // 2の1023乗の時に11111111111となります。
        // つまり、マイナスの場合でも2の補数を使いません。

        // 上記の「指数部の値を2進数で表現した場合」にあるように、
        // 2進数では乗数が1増えれば桁が1増えます。
        // これが「小数点が動く」ということです。

        // 指数部では、おおざっぱな値しか取れません。
        outputDoubleBit( 512.0 );
        outputDoubleBit( 1024.0 );
        // 0 10000001000 0000000000000000000000000000000000000000000000000000
        // 0 10000001001 0000000000000000000000000000000000000000000000000000
        // このように、指数部のビット的には1しか増えていませんが、
        // 512から1024と大きく数が増えています。
        // この512と1024の値を埋めるのが、仮数部ということです。
    }

    /**
     * double型変数をビット形式で出力します。
     */
    private static void outputDoubleBit( double d )
    {
        // double型変数をビット形式で文字列化します。
        String source = Long.toBinaryString( Double.doubleToLongBits( d ) );
        // 左0埋めします。
        StringBuffer strbuf = new StringBuffer();
        for( int iF1 = source.length(); iF1 < 64; ++iF1 )
        {
            strbuf.append( "0" );
        }
        strbuf.append( source );
        // 符号、仮数部、指数部の間にスペースを入れます。
        strbuf.insert( 12, " " );
        strbuf.insert( 1, " " );

        System.out.println( strbuf.toString() );
    }
}

この単語を含むページ

「みだし」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2010/04/11
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。