指数部
日本語 | 浮動小数点の指数の部分 |
英語 | 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の累乗」が小数点の位置を示すのと同じである。これが、「浮動小数点」という名称の由来である。
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の累乗」が小数点の位置を示すのと同じである。これが、「浮動小数点」という名称の由来である。
// 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() );
}
}
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() );
}
}
// 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() ); } }