2011年5月 9日

[ruby-list:48065] Re: 小数点つき時刻情報とTime#parse 【解決だと思う】

笠原です。

早速の助言ありがとうございます。

切り捨てて良いのか(*)分からなかったのですが・・・ご助言いただいた
BigDecimal
を使って以下のような感じで書いたら、ほしい結果が得られました。

(*)参考に教えて頂いたURLを熟読すれば分かるのかもしれないのですが、
私にはチンプンカンプンでした。ごめんなさい。

[root@xxxxx test]# cat qaz.rb
#! /usr/bin/ruby -KU
require 'time'
require 'bigdecimal'

keta=6

def jikoku_hennkann(t,keta_n)
return(BigDecimal((Time.parse(t).to_f*keta_n).truncate.to_s))
end

def jikoku_sabunn(a,b,keta)
keta_n=10**keta
print("#{Time.parse(a)-Time.parse(b)}\n")
ans=(jikoku_hennkann(a,keta_n)-jikoku_hennkann(b,keta_n))/keta_n
print(sprintf("%.#{keta}f\n", ans))
end

a="2011-04-15 10:52:51.004956"
b="2011-04-15 10:52:50.998658"
jikoku_sabunn(a,b,keta)

a="2011-04-15 10:52:48.977298"
b="2011-04-15 10:52:48.970890"
jikoku_sabunn(a,b,keta)
[root@xxxxx test]# ./qaz.rb
0.00629800000000004
0.006298
0.006408
0.006408
[root@xxxxx test]#

2011年5月9日10:44 Shota Fukumori (sora_h) <sorah@xxxxx>:
> sora_hです。
>
> 2011/5/9 Mitsuo KASAHARA <m.kasahara13@xxxxx>:
>> と、小数点以下6桁の情報を持つ時刻情報の差分を計算したら、何故か
>> 一つ目の方では
>> 0.00629800000000004
>> と
>> 00000000004
>> が余計にくっついて出力されました。
>
> 浮動小数点数の仕様で誤差が生じてしまいます。
> 参考:
> * http://download.oracle.com/docs/cd/E19957-01/806-4847/ncg_goldberg.html
> * http://wiki.github.com/rdp/ruby_tutorials_core/ruby-talk-faq#floats_imprecise
> * http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
>
>> パターンをイロイロ試したわけではないのですが、とあるログの時刻情報の差分を
>> 大量に計算していたところto_fをしなかったときに390個中1個だけ
>> 上記のように余計な桁が出力されました。
>>
>> 何が悪いのかよく分からないのですが、小数点以下6桁の引き算なので、
>> そのまま小数点以下6桁(以内)の答えが欲しいのですが、どのようにしたら良いか
>> ご助言いただけませんでしょうか。
>
> 誤差が無いのを望んでいるのなら、 BigDecimal (標準添付) の使用をおすすめします。
> しかし、TimeからFloatに変換するときにすでに誤差が生じるなどで誤差無しは厳しいと思います。
>
>
> --
> Shota Fukumori a.k.a. @sora_h - http://codnote.net/
>
>

--
かさはら みつお <m.kasahara13@xxxxx>


投稿者 xml-rpc : 2011年5月 9日 11:36
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103657
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。