無理数
日本語 | 無理数 |
英語 | irrational number |
ふりがな | むりすう |
フリガナ | ムリスウ |
「a / b」(a、b共に整数)で表現できない実数のこと。
整数同士の分数で表現できない実数のことを「無理数」と言う。
「ルート2」等のこと。
対して、「a / b」で表現できる実数を「有理数」と言う。
浮動小数点において丸め誤差が発生するのは、特定の10進数数値が仮数部の計算にとって無理数だからである。
仮数部は、指数部の値を2で割ることによって、指数部の間の数を表現する。つまり仮数部という「分数」によって、10進数の様々な値を表現しようとする。
だが、たとえば「1.1」という値のように、指数部を2で割り続けても表現できない値が存在する。これはつまり、仮数部の分数では表現できない値であり、つまり「無理数」だからである。そのような値は表現できないため丸め誤差が発生する。
整数同士の分数で表現できない実数のことを「無理数」と言う。
「ルート2」等のこと。
対して、「a / b」で表現できる実数を「有理数」と言う。
浮動小数点において丸め誤差が発生するのは、特定の10進数数値が仮数部の計算にとって無理数だからである。
仮数部は、指数部の値を2で割ることによって、指数部の間の数を表現する。つまり仮数部という「分数」によって、10進数の様々な値を表現しようとする。
だが、たとえば「1.1」という値のように、指数部を2で割り続けても表現できない値が存在する。これはつまり、仮数部の分数では表現できない値であり、つまり「無理数」だからである。そのような値は表現できないため丸め誤差が発生する。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 浮動小数点で実数を表現する場合の、ビットの状態。
outputDoubleBit( 1.0 );
outputDoubleBit( 1.25 );
outputDoubleBit( 1.5 );
// 0 01111111111 0000000000000000000000000000000000000000000000000000
// 0 01111111111 0100000000000000000000000000000000000000000000000000
// 0 01111111111 1000000000000000000000000000000000000000000000000000
// このように、2の分数で表現できる10進数は正確に表現できます。
// ですが、2の分数で表現できないと、丸め誤差が発生します。
outputDoubleBit( 1.1 );
// 0 01111111111 0001100110011001100110011001100110011001100110011010
// この値は「1.1の近似値」であり、正確には「1.1」ではありません。
// これが丸め誤差です。
}
/**
* 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 )
{
// 浮動小数点で実数を表現する場合の、ビットの状態。
outputDoubleBit( 1.0 );
outputDoubleBit( 1.25 );
outputDoubleBit( 1.5 );
// 0 01111111111 0000000000000000000000000000000000000000000000000000
// 0 01111111111 0100000000000000000000000000000000000000000000000000
// 0 01111111111 1000000000000000000000000000000000000000000000000000
// このように、2の分数で表現できる10進数は正確に表現できます。
// ですが、2の分数で表現できないと、丸め誤差が発生します。
outputDoubleBit( 1.1 );
// 0 01111111111 0001100110011001100110011001100110011001100110011010
// この値は「1.1の近似値」であり、正確には「1.1」ではありません。
// これが丸め誤差です。
}
/**
* 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 ) { // 浮動小数点で実数を表現する場合の、ビットの状態。 outputDoubleBit( 1.0 ); outputDoubleBit( 1.25 ); outputDoubleBit( 1.5 ); // 0 01111111111 0000000000000000000000000000000000000000000000000000 // 0 01111111111 0100000000000000000000000000000000000000000000000000 // 0 01111111111 1000000000000000000000000000000000000000000000000000 // このように、2の分数で表現できる10進数は正確に表現できます。 // ですが、2の分数で表現できないと、丸め誤差が発生します。 outputDoubleBit( 1.1 ); // 0 01111111111 0001100110011001100110011001100110011001100110011010 // この値は「1.1の近似値」であり、正確には「1.1」ではありません。 // これが丸め誤差です。 } /** * 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() ); } }
「みだし」に含まれているページ
「サンプルプログラムとか」に含まれているページ
- (参照している単語はありません)