irb(main):064:0> 5e-324 => 4.94065645841247e-3245*10^n の形であればちゃんと表示できると思ったんですが、そうでもないんですね。 なんでなんでしょ。
Macintosh-7:~ ktanaka$ irb1.9 irb(main):001:0> a=5e-324 => 5.0e-324 irb(main):002:0> a*1000 => 4.94e-321という結果をみると,「有効数字が十分でない時に余計な桁を表示しないようにしている」だけの違いなのかもしれません.
double d = strtod(tok(), 0);のように,C言語標準のライブラリであるstrtodを使って変換していることが確認でき,その疑いが晴れました.
a[k][i]=a[k][i]*1.0/akkを
a[k][i]=a[k][i]/akkに変更してから,
a=[[Rational(1,1),Rational(1,1),Rational(-1,1),Rational(2,1)], [Rational(3,1),Rational(5,1),Rational(-7,1),Rational(0,1)], [Rational(2,1),Rational(-3,1),Rational(1,1),Rational(5,1)]] gj(a)と,有理数で入力を与えると,
=> [[(1/1), (0/1), (0/1), (3/1)], [(0/1), (1/1), (0/1), (1/1)], [(0/1), (0/1), (1/1), (2/1)]]のように,有理数(この場合はすべて整数)で解が得られます.
def maxrow(a,k) r = a.length() t = a[k][k] i = k for j in k..(r-1) if t**2 < a[j][k]**2 t = a[j][k] i = j end end i endifの条件は, abs.rbを使わずに絶対値の大小を比べようと思い, 比較する値の2乗の大小を考えました.
def maxrow(a,k) x = k for i in (k+1)..(a.length-1) #a[i][k]の絶対値が最大となるi>=kを探す if abs(a[x][k]) <= abs(a[i][k]) x = i end end x end
def maxrow(a,k) #a[i][k]の絶対値が最大となるi>=kを探す max = 0 maxi = 0 for i in (k..a.length-1) if max < abs(a[i][k]) max = abs(a[i][k]) maxi = i end end maxi end「i>=kのすべてのiについてa[i][k]==0」の場合はmaxiは0 のままになり,関数maxrowは0を返す.これは「a[i][k]の絶対値が最大となるi>=kを探す」という定義には合っていない(k <= i < a.length() の値を返すのが正しい).
maxi = 0の行を
maxi = kとすれば修正は可能.なお,「i>=kのすべてのiについてa[i][k]==0」の場合は 連立方程式の解がないケースであり,解があるような入力しか与えられないことを 仮定すれば,元のままでも実際に問題が生じることはない.
ruby vote.rb 選択肢番号のように使います.