最近のトラックバック

2019年5月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

« 2011年5月 | トップページ | 2011年7月 »

2011年6月

sqrt, exptの結果をなるべく正確な数で表すようにしました

sqrtとexptの結果をなるべく正確な数で表すようにしました。

例えば、今までは
(sqrt 4) → 2.0 (不正確数)
(expt (expt 111 4) 1/4) → 111.0 (不正確数)
でしたが、
(sqrt 4) → 2 (正確数)
(expt (expt 111 4) 1/4) → 111 (正確数)
となるようにしました。

開平法

筆算における開平法をJavaで実現したソースを以下に示します。
正確な整数の平方根を求めるときに使用できると思います。

参考:
Wikipedia: http://ja.wikipedia.org/wiki/%E9%96%8B%E5%B9%B3%E6%B3%95
ニコニコ大百科: http://dic.nicovideo.jp/a/%E9%96%8B%E5%B9%B3%E6%B3%95

// ------------------------------------------
// This code is public domain.
public class ExactSqrt {

private static int toInt(byte b) {
return (b < 0) ? (b & 0x7f) + 128 : b;
}

private static final int BASE = 16;

public static void main(String[] args) {
byte[] a;
long q = 123454321;
int i = 0;
int s = 0;
int t = 0;
int r = 0;

a = BigInteger.valueOf(q).toByteArray();
while(a[i] == 0);
for(; i < a.length; i++) {
int x = 0;

if(s == 0) {
t = toInt(a[i]);
x = s = (int)Math.sqrt(t);
} else {
int s0 = s;

t = (t * BASE * BASE) + toInt(a[i]);
do {
s = (s0 * BASE) + x;
} while(x++ * s <= t);
x -= 2;
s = (s0 * BASE) + x;
}
t = t - x * s;
s = s + x;
r = (r * BASE) + x;
}

if(t == 0) {
System.out.println("Exact: " + r);
} else {
System.out.println("Inexact: " + r);
}
}

}
// code end
// ------------------------------------------

Ver. 0.3.0をリリースしました

Ver. 0.3.0をリリースしました。変更点は以下の通りです。

  • Swingと連携したGUIアプリケーションが記述できます
  • 正規表現が使用可能です
  • ファイル操作が可能です
  • SRFI-0,2,4,10,13,16,25,38,39,41,44,47,58,63,66,69,98をサポートしました

ダウンロードは以下のサイトでできます。
http://sourceforge.jp/projects/schluessel/releases/

SRFI-0(機能による条件分岐)サポート

SRFI-0(機能による条件分岐)をサポートしました。
また、ユーザによる機能の追加をサポートしました。

SRFI-41(ストリーム)をサポートしました

SRFI-41(ストリームライブラリ)をサポートしました。
stream-unfoldsの実装だけ不完全です。

コミックマーケット80に当選しました

8/12(金)〜8/14(日)に東京ビッグサイトにて開催されますコミックマーケット80に当選しました。
場所は8/13(土) 東地区Sブロック 26bです。
ご来場をお待ちしております。

« 2011年5月 | トップページ | 2011年7月 »