裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

多倍長精度計算結果を見やすく出力

2014年09月20日 | ブログラミング

http://r-statistics-fan.hatenablog.com/entry/2014/08/09/103123
Rで多倍長精度計算~とりあえず10000の階乗を計算してみる」であるが...

小数点以下も表示されてしまうので,整数部分だけを表示するように別解を。
先頭桁から区切っていくという仕様にした。別仕様は練習用。

library(Rmpfr)

one = mpfr(1,200000)
x = 10000
x = 100
fact.x = Reduce("*", c(one, 1:x))

print.mpfr = function(mpfr, n=100, m=10, Rev=FALSE) {
  num = sub("\\..+", "", formatMpfr(mpfr))
  blk = n-nchar(num) %% n
  num = c(unlist(strsplit(num, "")), rep(" ", blk))
  num = matrix(num, m)
  num = matrix(apply(num, 2, paste, collapse=""), n %/% m)
  num = apply(num, 2, paste, collapse=" ")
  num = gsub("  +", "", num)
  invisible(sapply(num, cat, "\n"))
}

> print.mpfr(fact.x) # print(fact.x) はよいが,fact.x だけではダメ
9332621544 3944152681 6992388562 6670049071 5968264381 6214685929 6389521759 9993229915 6089414639 7615651828
6253697920 8272237582 5118521091 6864000000 0000000000 00000000

なお,factorialZ() があるので,gmp パッケージも便利

print.gmp = function(gmp, n=100, m=10, Rev=FALSE) {
  num = as.character(gmp)
  blk = n-nchar(num) %% n
  num = c(unlist(strsplit(num, "")), rep(" ", blk))
  num = matrix(num, m)
  num = matrix(apply(num, 2, paste, collapse=""), n %/% m)
  num = apply(num, 2, paste, collapse=" ")
  num = gsub("  +", "", num)
  invisible(sapply(num, cat, "\n"))
}

> library(gmp)
> a = factorialZ(x)
> print.gmp(a) # print(a) ではダメ

9332621544 3944152681 6992388562 6670049071 5968264381 6214685929 6389521759 9993229915 6089414639 7615651828
6253697920 8272237582 5118521091 6864000000 0000000000 00000000

なお,文字列に直した後,gsub によって,m 桁ごとに空白,n桁ごとには改行文字を挿入してやるというのも一興かと。

print.gmp2 = function(gmp, n=100, m=10, Rev=FALSE) {
  num = as.character(gmp)
  com = sprintf('cat(gsub("(.{%i})", "\\\\1\n", gsub("(.{%i})", "\\\\1 ",num)))', (m+1)*n%/%m, m)
  eval(parse(text=com))
}

> print.gmp2(a)
9332621544 3944152681 6992388562 6670049071 5968264381 6214685929 6389521759 9993229915 6089414639 7615651828
6253697920 8272237582 5118521091 6864000000 0000000000 00000000

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 2 個の時系列データの相関を... | トップ | パスカルの三角形 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事