[#48044] Re: ruby 1.9.2とRails3 へのアップグレード — "Endo Akira" <endo4917@...>

アスカルさん

12 messages 2011/05/04
[#48045] Re: ruby 1.9.2とRails3 へのアップグレード — "Y. NOBUOKA" <nobuoka@...> 2011/05/04

アスカルさん

[#48062] 小数点つき時刻情報とTime#parse — Mitsuo KASAHARA <m.kasahara13@...>

笠原ともうします。

18 messages 2011/05/09
[#48068] Re: 小数点つき時刻情報とTime#parse — Tanaka Akira <akr@...> 2011/05/09

2011年5月9日10:29 Mitsuo KASAHARA <m.kasahara13@gmail.com>:

[#48070] Re: 小数点つき時刻情報とTime#parse — EGUCHI Osamu <eguchi@...> 2011/05/09

えぐち@エスアンドイーです

[#48072] Re: 小数点つき時刻情報とTime#parse — Tanaka Akira <akr@...> 2011/05/09

2011年5月9日13:43 EGUCHI Osamu <eguchi@sandeinc.com>:

[#48092] 後継者募集 — MoonWolf <moonwolf@...>

MoonWolfです。

22 messages 2011/05/22
[#48095] Re: 後継者募集 — Youhei SASAKI <uwabami@...> 2011/05/23

MoonWolf 様: 佐々木と申します.

[#48096] Re: 後継者募集 — MoonWolf <moonwolf@...> 2011/05/23

MoonWolfです。

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

From: Mitsuo KASAHARA <m.kasahara13@...>
Date: 2011-05-09 02:36:53 UTC
List: ruby-list #48065
笠原です。

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

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

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

[root@fedora 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@fedora test]# ./qaz.rb
0.00629800000000004
0.006298
0.006408
0.006408
[root@fedora test]#

2011年5月9日10:44 Shota Fukumori (sora_h) <sorah@tubusu.net>:
> sora_hです。
>
> 2011/5/9 Mitsuo KASAHARA <m.kasahara13@gmail.com>:
>> と、小数点以下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@gmail.com>

In This Thread

Prev Next