From: "K.Kodama" <kdm / kobe-kosen.ac.jp>
Subject: [ruby-math:00264] Infinity(was Polynomial.rb and floating point exception)
Date: Wed, 19 Apr 2000 16:50:34 +0900
Message-ID: <20000419165034V.kdm / kobe-kosen.ac.jp>

> 児玉 です.
> 
> [助言を求む]
> (1) 適当なクラス名. とりあえず, InfinityClass になってます.
> (2) 不定も InfinityClass(仮) に含める.
> (3) なるべく数学的な無限の扱いに似せたいが,
>   計算上の 1.0/0.0 や 0.0/0.0 の扱いとどう整合性をもたせるか?

う-ん. InfiniteClass を作りかけているけど,
Float の Inf と NaN でうまくつじつまが合えば,
特にクラスを作らなくても問題が無いような気もするが...
そう云えば "NaN again" のスレッドで問題になっていたけど,
決着はついていなかったような...

ftp://ftp.math.kobe-u.ac.jp/pub/knot/polynomial-ruby.tar.gz
の infinity.rb ですが, この mail の最後にも載せておきます.
本が手元に無いので, ∞+a 等の扱いは適当に書いてしまいましたが...

[問い] 不定値との比較 <=> や
       ∞<=>∞ の扱いはどうしましょうか?
      -1,0,1 を返すっていうのは, 結構つらいものがあります.

これで, (1) と (2) はまあ良いとして,
勝手に InfinityClass なんて作りましたが,
(3) の Float で出る Inf や NaN との整合性をどうとりましょうか?
うまくこれを拾って, InfinityClass の方に持ってゆけるか?

それと, 以下の例はどうにかならないでしょうか?
------------ここから
$ ruby -e 'print 1.0/0.0<=>10**1000,"\n"'
1
$ ruby -e 'print 1.0/0.0<=>10**10000,"\n"'
0
------------ここまで

-----------ここから InfiniteClass
# file: infinity.rb
# CONSTANT
#   Infinity
#   Indefinite

class InfinityClass
include Comparable

def initialize(s); @sign=s;end
attr :sign
Infn=InfinityClass.new(-2) # -Infinty
Fin=InfinityClass.new(-1) # negative Finite number
Zr =InfinityClass.new(0) # Zero
Fi=InfinityClass.new(1) # positive Finite number
Inf=InfinityClass.new(2) # +Infinity
Indef=InfinityClass.new(3) # Indefinite
undef initialize

def to_s
case @sign
when -2;return "-Infinity"
when -1;return "negativeFinite"
when 0;return "Zero"
when 1;return "positiveFinite"
when 2;return "Infinity"
when 3;return "Indefinite"
end
end


def readTbl(o,tbl)
i=@sign+2;
if o.kind_of?(InfinityClass); j=o.sign+2; else j=(o<=>0)+2; end
return tbl[i][j]
end

##### table  format ######
# self :  other
#      :  Infn -  0  + Inf Indef 
# Infn :
# Fin  :
# Zr   :
# Fi   :
# Inf  :
# Indef:

def -@
case @sign
when -2; return Inf
when -1; return Fi
when 0; return Zr
when 1; return Fin
when 2; return Infn
when 3; return Indef
end
end


CmpTbl=[ 
[false,-1,-1,-1,-1,false],
[1, false,-1,-1,-1,false],
[1, 1, 0,-1,-1,false],
[1, 1, 1, false,-1,false],
[1, 1, 1, 1, false,false],
[false, false, false, false, false,false]]

def <=>(o); 
	return self.readTbl(o,CmpTbl);
end

def ==(o) # May be Infinite or Indefinite.
return false
end


AddTbl=[ 
[Infn,  Infn, Infn, Infn,Indef,Indef], 
[Infn,   Fin,  Fin,Indef,  Inf,Indef],
[Infn,   Fin,   Zr,   Fi,  Inf,Indef],
[Infn, Indef,   Fi,   Fi,  Inf,Indef],
[Indef,  Inf,  Inf,  Inf,  Inf,Indef],
[Indef,Indef,Indef,Indef,Indef,Indef]]

def +(o); return self.readTbl(o,AddTbl); end

SubTbl=[ 
[Indef, Infn, Infn, Infn, Infn,Indef],
[  Inf,Indef,  Fin,  Fin, Infn,Indef],
[  Inf,   Fi,   Zr,  Fin, Infn,Indef],
[  Inf,   Fi,   Fi,Indef, Infn,Indef],
[  Inf,  Inf,  Inf,  Inf,Indef,Indef],
[Indef,Indef,Indef,Indef,Indef,Indef]]

def -(o); return self.readTbl(o,SubTbl); end

MulTbl=[ 
[  Inf,  Inf,Indef, Infn, Infn,Indef],
[  Inf,   Fi,   Zr,  Fin, Infn,Indef],
[Indef,   Zr,   Zr,   Zr,Indef,Indef],
[ Infn,  Fin,   Zr,   Fi,  Inf,Indef],
[ Infn, Infn,Indef,  Inf,  Inf,Indef],
[Indef,Indef,Indef,Indef,Indef,Indef]]

def *(o); return self.readTbl(o,MulTbl); end


DivTbl=[ 
[Indef,  Inf,Indef, Infn,Indef,Indef],
[   Zr,   Fi,Indef,  Fin,   Zr,Indef],
[   Zr,   Zr,Indef,   Zr,   Zr,Indef],
[   Zr,  Fin,Indef,   Fi,   Zr,Indef],
[Indef, Infn,Indef,  Inf,Indef,Indef],
[Indef,Indef,Indef,Indef,Indef,Indef]]

def /(o); return self.readTbl(o,DivTbl); end

def coerce(x)
case  x<=>0
when 1; return Fi,self
when 0; return Zr,self
when -1; return Fin,self
end
end

def inspect
	sprintf("InfinityClass(%s)", self.to_s)
end

end

Infinity=InfinityClass::Inf
Indefinite=InfinityClass::Indef
-------------ここまで
-- 
K.Kodama(kodama / kobe-kosen.ac.jp)