浮動小数点値の内部表記

float.png
double.png

計算機イプシロン

Javaでの実装

C では、浮動小数点型変数のポインタからメモリの内容を取得したり、Union で同じメモリ領域を指す float と int を作ったりしたけど、Java ではどうすんだろ? ⇒ Float クラスに内部表記を取り出すための API がある

package com.mycompany.sandbox;

public class FloatExam {

    public static void main(String[] args) {
        System.out.println(floatExpression(2.5f));
        System.out.println(floatExpression(-2.5f));
        System.out.println(floatExpression(1.0f));
        System.out.println(floatExpression(0.1f));

        // 1 より大きい最小の数
        float ce = ieee2float(0, 127, 1);
        System.out.println("1.0+ε = " + floatExpression(ce));

        // 計算機イプシロン
        System.out.println(" ε = " + floatExpression(ce - 1.0f));
    }

    private static String floatExpression(final float f) {
        int i = Float.floatToIntBits(f);

        StringBuilder sb = new StringBuilder();

        int sign = subint(i, 31, 31);
        int exponent = subint(i, 30, 23);
        int fraction = subint(i, 22, 0);

        sb
        .append(f).append(" = ")
        .append(0 == sign ? "+1" : "-1")
        .append(" * 2^(").append(exponent).append("-127)")
        .append(" * ").append(1.0F + fraction * Math.pow(2.0, -23))
        .append("\n");

        sb
        .append(sign).append(" ")
        .append(int2bin(exponent, 8)).append(" ")
        .append(int2bin(fraction, 23)).append("\n");

        return sb.toString();
    }

    private static float ieee2float(final int sign, final int exponent, final int fraction) {
        double f = 
            (0 == sign ? +1.0 : -1.0) 
            * Math.pow(2.0, exponent - 127) 
            * (1.0 + fraction * Math.pow(2.0, -23));

        return (float) f;
    }

    private static int subint(final int i, final int from, final int to) {
        return (i << (31 - from) >>> (31 - from + to));
    }

    private static String int2bin(final int i, final int size) {
        StringBuilder sb = new StringBuilder();
        sb.append(Integer.toString(i, 2));
        while (sb.length() < size) {
            sb.insert(0, "0");
        }
        return sb.toString();
    }
}

Java#JavaSE


添付ファイル: filefloat.png 1941件 [詳細] filedouble.png 1865件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2016-02-21 (日) 00:30:18 (3214d)
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=b55dc34501
ISBN10
ISBN13
9784061426061