Gauche > Archives > 2012/10/01

2012/10/01 01:50:21 UTCyamasushi
#
$ make
if [ . != "." ]; then ./wirebuildlibs "." "ln -s"; fi
for d in gc src lib ext doc; do (cd $d; make all); done
make[1]: ディレクトリ `/home/shuji/gauche-dev/Gauche/gc' に入ります
make[2]: ディレクトリ `/home/shuji/gauche-dev/Gauche/gc' に入ります
make[2]: ディレクトリ `/home/shuji/gauche-dev/Gauche/gc' から出ます
make[1]: ディレクトリ `/home/shuji/gauche-dev/Gauche/gc' から出ます
make[1]: ディレクトリ `/home/shuji/gauche-dev/Gauche/src' に入ります
GAUCHE_LOAD_PATH="" GAUCHE_DYNLOAD_PATH="" gosh -l./preload -I../src -I../lib ./precomp -D LIBGAUCHE_BODY libnum.scm
Error in compiling (define-in-module gauche.internal (%exact-integer-sqrt k) (if (< k 9007199254740992) (let1 s (floor->exact (%sqrt k)) (values s (- k (* s s)))) (let loop ((s (let1 ik (%sqrt k) (if (finite? ik) (floor->exact (%sqrt k)) (ash 1 (quotient (integer-length k) 2)))))) (let1 s2 (* s s) (if (< k s2) (loop (quotient (+ s2 k) (* 2 s))) (let1 s2+ (+ s2 (* 2 s) 1) (if (< k s2+) (values s (- k s2)) (loop (quotient (+ s2 k) (* 2 s))))))))))
*** ERROR: Autoloaded symbol expt is not defined in the file "gauche/numerical"
Stack Trace:
_______________________________________
  0  (expt 2 31)
        At line 531 of "../lib/gauche/cgen/literal.scm"
  1  (< (- (expt 2 31)) value (- (expt 2 32)))
        At line 531 of "../lib/gauche/cgen/literal.scm"
  2  (cgen-literal (cadr code))
        At line 696 of "../lib/gauche/cgen/precomp.scm"
  3  (extract-literals cv)
        At line 642 of "../lib/gauche/cgen/precomp.scm"
  4  (cgen-literal (cadr code))
        At line 694 of "../lib/gauche/cgen/precomp.scm"
  5  (extract-literals cv)
        At line 642 of "../lib/gauche/cgen/precomp.scm"
  6  (cgen-literal compiled-code)
        At line 520 of "../lib/gauche/cgen/precomp.scm"
  7  (fn item r)
        At line 263 of "/usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/procedure.scm"
  8  (port-fold compile-toplevel-form '() read)
        At line 163 of "../lib/gauche/cgen/precomp.scm"
  9  (with-input-from-file src (cut emit-toplevel-executor (reverse (po ...
        At line 161 of "../lib/gauche/cgen/precomp.scm
#
最新をビルドすると上のようなエラーになります。
2012/10/01 03:17:37 UTCshiro
#
あれ、なんでうちだとビルドできるんだろ。確かに最新ソースのgauche/numericalにexptは無いから、ホストのgoshでコンパイルするとエラーになってもおかしくないんだが。
2012/10/01 03:38:17 UTCshiro
#
make maintainer-clean; ./DIST gen; gauche-config --reconfigure |sh からやってもやっぱりエラーになりますか? > yamasushi
2012/10/01 04:15:29 UTCyamasushi
#
maintainer-cleanした結果のはずですが、念の為、上のコマンドをコピペしてもう一度やってみます。
2012/10/01 04:19:49 UTCshiro
#
もし同じエラーが出たら、 touch libnum.scm ; GAUCHE_LOAD_PATH="" GAUCHE_DYNLOAD_PATH="" gosh -fload-verbose -l./preload -I../src -I../lib ./precomp -D LIBGAUCHE_BODY libnum.scm として結果を教えてください (-fload-verboseを追加してあるので、どのファイルをロードしたかわかります)
2012/10/01 04:25:50 UTCyamasushi
#
shuji@shuji-PC-LL750FD:~/gauche-dev/Gauche/src$ touch libnum.scm ; GAUCHE_LOAD_PATH="" GAUCHE_DYNLOAD_PATH="" gosh -fload-verbose -l./preload -I../src -I../lib ./precomp -D LIBGAUCHE_BODY libnum.scm 
;;Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche-init.scm...
;;Loading ./preload.scm...
;; Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/collection.scm...
;;  Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/srfi-1.scm...
;;   Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/srfi-1.so...
;;  Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/gauche--collection.so...
;;  Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/procedure.scm...
;;   Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/common-macros.scm...
;; Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/sequence.scm...
;;  Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/gauche--sequence.so...
;; Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/hook.scm...
;;  Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/mop/validator.scm...
;;  Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/gauche--hook.so...
;; Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/parameter.scm...
;;  Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/gauche--parameter.so...
;; Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/uvector.scm...
;;  Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/util/queue.scm...
;;   Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/util--queue.so...
;;  Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/libgauche-uvector.so...
;; Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/regexp.scm...
;;  Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/condutil.scm...
;;   Loading /usr/local/share/gauche-0.9/0.9.3.3/lib/util/match.scm...
;;    Dynamically Loading /usr/local/lib/gauche-0.9/0.9.3.3/i686-pc-linux-gnu/util--match.so...
;;  Loading /usr/
#
;;Loading ../lib/gauche/numerical.scm...
Error in compiling (define-in-module gauche.internal (%exact-integer-sqrt k) (if (< k 9007199254740992) (let1 s (floor->exact (%sqrt k)) (values s (- k (* s s)))) (let loop ((s (let1 ik (%sqrt k) (if (finite? ik) (floor->exact (%sqrt k)) (ash 1 (quotient (integer-length k) 2)))))) (let1 s2 (* s s) (if (< k s2) (loop (quotient (+ s2 k) (* 2 s))) (let1 s2+ (+ s2 (* 2 s) 1) (if (< k s2+) (values s (- k s2)) (loop (quotient (+ s2 k) (* 2 s))))))))))
*** ERROR: Autoloaded symbol expt is not defined in the file "gauche/numerical"
Stack Trace:
_______________________________________
  0  (expt 2 31)
        At line 531 of "../lib/gauche/cgen/literal.scm"
  1  (< (- (expt 2 31)) value (- (expt 2 32)))
        At line 531 of "../lib/gauche/cgen/literal.scm"
  2  (cgen-literal (cadr code))
        At line 696 of "../lib/gauche/cgen/precomp.scm"
  3  (extract-literals cv)
        At line 642 of "../lib/gauche/cgen/precomp.scm"
  4  (cgen-literal (cadr code))
        At line 694 of "../lib/gauche/cgen/precomp.scm"
  5  (extract-literals cv)
        At line 642 of "../lib/gauche/cgen/precomp.scm"
  6  (cgen-literal compiled-code)
        At line 520 of "../lib/gauche/cgen/precomp.scm"
  7  (fn item r)
        At line 263 of "/usr/local/share/gauche-0.9/0.9.3.3/lib/gauche/procedure.scm"
  8  (port-fold compile-toplevel-form '() read)
        At line 163 of "../lib/gauche/cgen/precomp.scm"
  9  (with-input-from-file src (cut emit-toplevel-executor (reverse (po ...
        At line 161 of "../lib/gauche/cgen/precomp.scm"
 10  (do-it src ext-initializer sub-initializers)
        At line 233 of "../lib/gauche/cgen/precomp.scm"
 11  (apply %cgen-precompile src keys)
        At line 157 of "../lib/gauche/cgen/precomp.scm"
 12  (cgen-precompile src :out.c out.c :out.sci (or out.sci ext-module) ...
        At line 69 of "././precomp"
#
よくわからないのですが、これでいいでしょうか?
2012/10/01 04:30:11 UTCshiro
#
最初にはってあるやつが多分字数制限で切れちゃってますね。知りたいのはそこと Loading ../lib/gauche/numerical.scm の間なのですが… gistやpastebinあたりに貼ってもらってもいいです。
#
あ、いや、取り消し。わかりました。64bit環境ではそのエラーが出てるexptの実行まで達しないからだ。
#
このパッチでどうですか? https://gist.github.com/3809482
2012/10/01 04:34:33 UTCyamasushi
#
すいません。パッチの使い方を知らないのです。(汗
2012/10/01 04:35:05 UTCshiro
#
そんではこっちで確認したあとコミットしますね。ちょいお待ち。
2012/10/01 04:42:07 UTCshiro
#
pushしました。試してみてください。
2012/10/01 04:55:20 UTCyamasushi
#
make checkでエラーになります。
#
Testing numbers ...                                              failed.
discrepancies found.  Errors are:
test inexact->exact->inexact roundtrip "1+d": expects 1.0000000000000002 => got 1.0000000000000004
test inexact->exact->inexact roundtrip "1-d": expects 0.9999999999999999 => got 0.9999999999999998
#
testのlogha
#
make checkのlogはどこかにあるのでしょうか?
#
2つ失敗しているのですけれど・・・
2012/10/01 04:59:15 UTCshiro
#
それも32bitアーキテクチャのせいかも。
2012/10/01 05:04:24 UTCyamasushi
#
src/test.log https://gist.github.com/3809547
2012/10/01 05:08:47 UTCshiro
#
手元の32bit環境で再現しました。
2012/10/01 05:27:03 UTCshiro
#
だいたいわかった。bignum同士の割り算をinexactで返す計算ルーチンに誤差があって、exact->inexactもそれに影響されてた (64bitでは上のテストはbignum同士の割り算を使わないので回避)。inexact->exactの方がより正確な処理を必要とする数値を返すようになったために、前者の誤差が表面化した、ということのようだ。
2012/10/01 05:37:02 UTCshiro
#
i686とx86_64とで浮動小数点除算の結果が違う… (結果は64bitに変換済み) どういうこっちゃ。
#
80bit演算で丸めがあって、64bitにするときにまた丸めがあって1LSBずれたかな。
#
もともと浮動小数点数演算器って1LSB前後の誤差は許容されてたっけ。こういう1LSBの差異が問題になるところはdoubleを使わずに自力で計算するしかないか…
2012/10/01 05:43:20 UTC_ko1@twitter
#
Java の strict モードはそのためみたいなイメージが
2012/10/01 05:50:56 UTCmaru
#
あるある。
2012/10/01 06:07:21 UTCshiro
#
何が起きてたかをまとめました http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3a%E4%BA%8C%E9%87%8D%E4%B8%B8%E3%82%81%E3%81%AE%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B4 こういうのって問題をピンポイントで突くテストデータってのを見つけるのが面倒なので、今回は見つかってラッキーだったかも。
2012/10/01 07:57:54 UTCshiro
#
さて、正しく計算するにはbignumの除算が必要になることが多い (64bitならfixnumでカバーできる場合もあるけど32bitだと確実にbignumになる) のだが、1/10 を 0.1 に変換するのにbignum演算するのも癪だなあ。精密計算が必要な場合と必要でない場合を判別する方法はないものか。
2012/10/01 18:35:40 UTCshiro
#
defectは動詞だと亡命という意味なのか。名詞しか知らんかった。 http://us.cnn.com/2012/10/01/world/new-york-iran-cameraman/index.html