FPU.java
/**
* Compile
* javac FPU.java
* javah FPU
*
* Execute
* setenv LD_LIBRARY_PATH .
* java FPU
*/
package org.mklab.cga.round;
import java.io.IOException;
import org.mklab.cga.platform.Library;
import org.mklab.cga.platform.Platform;
/**
* C言語でかかれたCPUの丸めモードを変更する関数を Javaで呼び出せるようにしたクラス。
*
*/
public final class FPU {
/**
* コンストラクタ
*/
private FPU() {
//
}
/**
* CPUの丸めモードを設定します。
*
* @param mode 丸めモードを指定する値。
*/
static native void setRoundMode(final int mode);
/**
* CPUの丸めモードを確認します。
*
* @return 現在のCPUの丸めモードの値
*/
static native int getRoundMode();
/**
* CPUの丸めモードを最近点への丸めに設定します。
*/
public static final int ROUND_NEAR = 0;
/**
* CPUの丸めモードを下向の丸めに設定します。
*/
public static final int ROUND_DOWN = 1;
/**
* CPUの丸めモードを上向きに設定します。
*/
public static final int ROUND_UP = 2;
/**
* Describe constant <code>ROUND_ZERO</code> here.
*
*/
public static final int ROUND_ZERO = 3;
/**
* Describe constant <code>ROUND_ERROR</code> here.
*
*/
public static final int ROUND_ERROR = -1;
static {
final String libname = Platform.IS_JVM_32 ? "FPUNative" : "FPUNative64"; //$NON-NLS-1$ //$NON-NLS-2$
try {
Library.loadlibrary(libname);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 指定されたCPUの丸めモードに設定します。
*
* @param args CPUの設定丸めモードが入る配列
*/
public static void main(final String[] args) {
if (args.length == 1) {
if (args[0].equals("near")) { //$NON-NLS-1$
setRoundMode(ROUND_NEAR);
System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
} else if (args[0].equals("down")) { //$NON-NLS-1$
setRoundMode(ROUND_DOWN);
System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
} else if (args[0].equals("up")) { //$NON-NLS-1$
setRoundMode(ROUND_UP);
System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
} else if (args[0].equals("zero")) { //$NON-NLS-1$
setRoundMode(ROUND_ZERO);
System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
} else if (args[0].equals("status")) { //$NON-NLS-1$
System.out.println("mode = " + getRoundMode()); //$NON-NLS-1$
}
}
}
}