1.連続量の表現
問題1
x^2 - 3000x + 1 = 0
を解きたい。精度は例えばfloat
class Main{
public static void main(String [] argv){
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt(), b = scanner.nextInt(), c = sc
anner.nextInt();
float d = b * b - 4 * a * c;
System.out.println("%f", (-b + (float)Math.sqrt(d))/ 2 *
a);
System.out.println("%f", (-b - (float)Math.sqrt(d))/ 2 *
a);
}
}
class Main{//こちらのほうが小さい数に対する精度がよい。
public static void main(String [] argv){
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt(), b = scanner.nextInt(), c = sc
anner.nextInt();
float d = b * b - 4 * a * c;
float x1 = (-b + (float)Math.sqrt(d))/ 2 * a;
float x2 = (-b + (float)Math.sqrt(d))/ 2 * a;
System.out.printf("%f\n", x1);
System.out.printf("%f\n", 1 / x1);//2つの解は互いに逆数
の関係であることを利用
}
}
SAMPLE INPUT
1 -3000 1
SAMPLE OUTPUT
2999.999667
0.000333
算術的には引き算が問題となる。
問題2
int maxをx_Mとおく。その時に、解も入力もintの範囲内だが、計算途中でオー
バーフローし得る。
そんな時にはimport java.math.BigInteger;もしくはjava.math.BigDecimal;
あるいはアルゴリズムの考察
IEEE 754-1985
s 符号部 1 bit
e 指数部 8 / 11 bit
f 端数部(仮数部) 23 / 52 bit
32 / 64 bit
32bit
if(e == 255 && f != 0){
return NaN(Not a Number)
}else if(e == 255){
return (-1)^s * ∞
}else if(e > 0){
//正規化数
return (-1)^s * 2^(e - 127) * 1.f
}else if(e == 0 && f != 0){
//非正規化数
return (-1)^s * 2^(-126) * 0.f
}else{//e == 0 && f == 0
(-1)^s * 0
}
64bit
s/255/2047/gi;
s/127/1023/gi;
s/126/1022/gi;
SAMPLE INPUT
+1.0
SAMPLE OUTPUT
(-1)^0 2^0 1.0
0 01111111 00000000000000000000000
0 01111111111 0000000000000000000000000000000000000000000000000000
NaN
1) signaling NaN
Invalid calculation like
0 * ∞ or ∞ - ∞
or calculation using NaN
2) quiet NaN
Exception like "Not Exist Data"
表現誤差
正規表現の範囲の実数 R'
R' = {x| 2^(-126) <= |x| < 2^127}
x ∈ R' fl(x)を内部表現とする。
fl(x) = (1+δ(x))x
Max(|δ(x)|) = ε_M 計算機イプシロン
ε_M = 2^(-24) 32bit
ε_M = 2^(-53) 64bit
Y.Sawa, Mon Oct 3 16:23:28 2005学科ノートの仕様
http://www-6.ibm.com/jp/pc/thinkpad/tpt42/tpt42s.shtml#170ghz
ノートの裏には2374とかいてあるが、それは見付からなかったので、
画面右下にあったT42を参照しました。
というか、どれもキャッシュの大きさは大差ないわけですが。
letter, Sat Oct 8 11:04:31 2005http://www.cpuid.com/
これによると、L1:32KB L2:2048KB だそうです。
こじま, Sat Oct 8 18:26:28 2005演習第二回7番の問題。
(x1,x2)=(2,1)が一つの解だったり。
letter, Wed Nov 2 16:04:11 2005gnuplotで3次元表示する例。
ファイルに保存して実行可能にして引数にデータファイル"hoge"を渡すと、
"hoge.eps"というファイルに出力する。
データファイルの書式は、
x y z(return)
...
という形式。
64というのは分割サイズなので、適当にいじってください。
#!/bin/sh
gnuplot -persist << EOF
set term postscript eps enhanced color
set output "$1.eps"
set dgrid3d 64,64
set size 1.5,1.5
splot "$1" with lines
letter, Wed Nov 30 12:28:37 2005