[#29170] Call for Papers Linux Conference 2001 — akira yamada / やまだあきら <akira@...>

18 messages 2001/04/10
[#30213] Re: Call for Papers Linux Conference 2001 — akira yamada / やまだあきら <akira@...> 2001/06/13

[#29190] Time Stamp Copy of File.copy — "たけ(tk)" <ggb03124@...>

 ftools.rb の move では utime を行っていて日付が同じになりますが、copy

42 messages 2001/04/11
[#29193] Re: Time Stamp Copy of File.copy — matz@... (Yukihiro Matsumoto) 2001/04/11

まつもと ゆきひろです

[#29201] Re: Time Stamp Copy of File.copy — " たけ (tk)" <ggb03124@...> 2001/04/11

たけ(tk)です。

[#29203] Re: Time Stamp Copy of File.copy — WATANABE Hirofumi <eban@...> 2001/04/11

わたなべです.

[#29212] Re: Time Stamp Copy of File.copy — Minero Aoki <aamine@...> 2001/04/12

あおきです。

[#29215] Re: Time Stamp Copy of File.copy — " たけ (tk)" <ggb03124@...> 2001/04/12

たけ(tk)です。

[#29220] Re: Time Stamp Copy of File.copy — Minero Aoki <aamine@...> 2001/04/12

あおきです。

[#29234] Re: Time Stamp Copy of File.copy — " たけ (tk)" <ggb03124@...> 2001/04/13

たけ(tk)です。

[#29236] Re: Time Stamp Copy of File.copy — matz@... (Yukihiro Matsumoto) 2001/04/13

まつもと ゆきひろです

[#29238] Array#include! — " たけ (tk)" <ggb03124@...> 2001/04/13

たけ(tk)です。

[#29244] Re: Array#include! — matz@... (Yukihiro Matsumoto) 2001/04/13

まつもと ゆきひろです

[#29348] Open3 — NISHIO Mizuho <mzh@...>

どうも西尾です。

16 messages 2001/04/20

[#29397] rnet.rb 〜高レベルネットライブラリ〜 — rubikitch <rubikitch@...>

るびきちです。

11 messages 2001/04/24

[ruby-list:29080] split split した配列要素の数字を BigFloat でスマートに扱う方法

From: wada@...2.off.ne.jp
Date: 2001-04-03 19:24:16 UTC
List: ruby-list #29080
--------
和田と申します. split した配列要素の数字を BigFloat でスマートに扱う方
法について質問があります.


例えば以下のようなファイルがあったとします. 

% cat /home/who/data.dat

 File: /home/who/data.dat
 REGION RATE(/ch) ERRonRATE
 190  0.00577636396  7.45997886E-06
 191  0.00576170641  7.45765601E-06
 192  0.00574876013  7.45882971E-06
 193  0.00573804469  7.46450814E-06
 194  0.00572819967  7.47198192E-06
 195  0.0057195074  7.48178263E-06
 196  0.00571131707  7.49256105E-06
<以下同様に 3 列の数字が続く>

このファイルの各レコードの 3 つのフィールドにわかれた数字について, そ
れぞれある計算をし, その結果を元ファイルと同様のフォーマットで出力する
こと考えます.  その時に要求される処理は,

* 数字以外の要素は 0.0 として扱う
* 有効数字は 15 桁

ということです. そこで, BigFloat を利用させて頂いて, 以下のようなスク
リプト (というのも恥ずかしいのですが) を作ってみました.

% cat dataconv.rb

require 'BigFloat'

# field が定義されていない即ち nil なフィールドは 0.0 として扱う
def nil.to_f
  0.0
end

# ある要素が Float に変換できる場合は BigFloat に変換し, ある要素が 
# Float に変換できない場合は Float の 0.0 に変換する to_bf という 
# module を定義
module BIGFLOAT
  def to_bf
    if self.to_f
      BigFloat::new(self, 12)
    else
      0l0
    end
  end
end

# String クラスに to_bf の定義をつけ加える
class String
  include BIGFLOAT
end

# nil に対して to_bf した時は 0.0 にする
def nil.to_bf
  0.0
end

# 例えば以下のような計算をする
tpch = BigFloat::new("0.000747758", 12)
while gets
  $_ = split
  $_[0] = ( $_[0].to_bf - 176.0 ) * tpch * 1000.0
  $_[1] = $_[1].to_bf / tpch
  $_[2] = $_[2].to_bf / tpch
  STDOUT << "#{$_[0]}\t#{$_[1]}\t#{$_[2]}\n"
end


こうした場合の実行結果は以下です. 

$ ruby dataconv.rb < data.dat

-0.13160540800E3        0.0     0.0
-0.13160540800E3        0.0     0.0
0.1046861200E2  0.77249109471246044843385159370E1       0.99764614487574857106176
0623089E-2
0.1121637000E2  0.77053089502218632231283383127E1       0.99733550293009235608311
7800144E-2
0.1196412800E2  0.76879954878449979806300969031E1       0.99749246547679864341137
1058552E-2
0.1271188600E2  0.76736653970937121368143169314E1       0.99825185955884122938169
<以下同様に続く>



同様の処理を Perl でやらせようと思うと, Perl はデフォルトで 15 桁まで
精度が出るので

% cat dataconv.pl

$tpch = 0.000747758;
while (<>)
{
    split;
    @_[0] = (@_[0] - 176.0) * $tpch * 1000.0;
    @_[1] /= $tpch;
    @_[2] /= $tpch;
    print "@_[0]\t@_[1]\t@_[2]\n";
}

というスクリプトで

% perl dataconv.pl < data.dat

-131.605408     0       0
-131.605408     0       0
10.468612       7.7249109471246 0.00997646144875749
11.21637        7.70530895022186        0.00997335502930092
11.964128       7.687995487845  0.00997492465476799
12.711886       7.67366539709371        0.00998251859558841
13.459644       7.66049934604511        0.00999251351373038
14.207402       7.64887490337783        0.0100056203076396
14.95516        7.63792172066364        0.0100200346235012

となります.

とりあえず, 元データよりも結果の有効数字の方を大きく要求して何の意味が
あるのかといったつっこみはおいておくとして, Ruby の方でもう少しスマー
トにこれを処理する方法はないものでしょうか. アドバイスをよろしくお願い
します.

In This Thread

Prev Next