From: EGUCHI Osamu Date: 2011-05-10T16:08:59+09:00 Subject: [ruby-list:48081] Re: 小数点つき時刻情報とTime#parse 2011年5月10日15:22 Tanaka Akira : > 2011年5月10日14:28 EGUCHI Osamu : >>> 条件なしで使われているんですか? >>> 存在する時だけに使われるのでなく? >> >> 1.8と1.9の実装では方針が違うようで、、 > > 64bit 整数型の存在に関する仮定に関して、 > 1.9 で変化したという覚えはないんですが、 > なにかありましたっけ? 64bit 整数型の有無により条件コンパイルで ある場合は処理系の組み込み型を使い、 必要に応じてBignumにシフトチェンジするようです。 >> 1.9では64bit 整数型が存在しない場合、自前の倍長演算ルーチンを呼んでいました。 >> #Timeの内部表現もスケーリングがナノセコンドになっていました > > time.c の中身は知っていますが、自前の倍長演算ルーチンという > 覚えはないですね。 wideint_t の事です。 32bitにおける倍長はその一部の特徴で、Bignumを適宜使っているようですね。 === % ruby18 -ve 'p Time.at(10**99)' ruby 1.8.7 (2010-08-16 patchlevel 302) [amd64-freebsd8] -e:1:in `at': bignum too big to convert into `long' (RangeError) from -e:1 % ruby19 -ve 'p Time.at(10**99)' ruby 1.9.2p0 (2010-08-18 revision 29036) [amd64-freebsd8] 31688738506811430964562103462970695015158624952118316116207927812546661667451279832095319667-05-08 10:46:40 +0900 % ruby19 -ve 'p Time.at(10**99,234.567)-Time.at(10**99,123.456)' ruby 1.9.2p0 (2010-08-18 revision 29036) [amd64-freebsd8] 0.000111111 === その意味で 2011年5月9日14:23 Tanaka Akira : > C に Bignum が組み込まれてればいいんですが。 という田中さんの指摘を支持します。 >> いま話題にしている1.8では64bit 整数型をイミュレーションするコードはないですが、 >> そのようなプラットホームでも [ruby-list:48070]で私が示したワークアラウンドは有効です。 > > 理解できません。 ワークアラウンド= Cで書かれたTime同士の引き算の桁落ちを Rubyで書いたメソッドで 回避することができているという意味です。 #そのようなプラットホーム=bccでコンパイルされた環境 > パッチの形で書いていただけると理解できるかもしれません。 > > なお、私の案はパッチとして [ruby-list:48068] に書きました。 Cで書かれたメソッドを計算結果に変化がある形で変更するのは (それが精度向上であっても)1.8 には取り込むべきではない と言うのが私のスタンスです。 そもそも、時刻の差を Float で返すのは difftime() からの流れなのでしょうが、 溢れや丸め桁落ちなどの厄介を持ち込んでしまいました。 # 時刻の差(期間?)を示すクラスを用意すればよかった? Time#at() にマイクロ秒を指定する第二引数を追加した時に見直すべきでしたが、 結果論ですね。  えぐち