カメヲラボ

主にプログラミングとお勉強全般について書いてます

log1pデスカ!!!

namasuteさんの日記を見るまでlog1pという存在を知らなかった^^;
http://d.hatena.ne.jp/namasute0/20060608#1149731313
log1pという関数は、log(1+x)でxが非常に小さい場合に誤差が大きくなる問題を解決するための関数のようで、log1p(x)とすればlog(1+x)を高精度で計算してくれる。これはJavaにもあったみたいで、Math.log1pを用いることで超簡単なコードが通った。


import java.util.*;
import java.text.*;

class Main{

public static void main(String s[]){

Scanner c=new Scanner(System.in);
double n;
DecimalFormat d = new DecimalFormat("0.00000000000000");

for(; (n=c.nextDouble()) > 0;)
{
double t = ( n - 2.0 ) * Math.log1p( -1.0 / n );
n = Math.exp( t ) -5e-15;
System.out.println(d.format( n ));
}
}
}

こちらは-5e-16で大丈夫みたいw