• ベストアンサー

C#の演算でオーバーフローしてるみたいなのですが....

C#の演算でオーバーフローしてるみたいなのですが.... 8行8列の逆行列を計算するために C#で逆行列を掃き出し法を使って計算するプログラムを作ったんですが,どうやら,途中でオーバーフローしているみたいで困っています. 行列の各成分はdouble型で保持しています. 今まで,オーバーフローするような桁数の計算を プログラムで扱ったことがないので,対策方法がわかりません. みなさんは,オーバーフローにはどのような対策をしているのでしょうか? どなたか,知恵を貸していただけないでしょうか? よろしくお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

演算でオーバーフローになるのは、0に限りなく近い値で除算している場合がほとんどです。 例えば、 1-0.1×10 の計算をしたとき、0になるとは限りません。 処理系によっては、0ではなく、10^(-50)のようなの0に限りなく近い値になる場合があります。 それで除算をするとオーバーフローすることがあります。 対策としては、 0に限りなく近い値は0にする という処理をします。 (0除算のチェックは当然していますよね)

Cross999
質問者

お礼

nag0720さん,回答ありがとうございます. >(0除算のチェックは当然していますよね) 0除算はチェックしてました. >対策としては、 >0に限りなく近い値は0にする >という処理をします。 ということなのですが,具体的には,基準となる「限りなく近い値」はどうやって決めるべきなんでしょうか?

その他の回答 (1)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

>具体的には,基準となる「限りなく近い値」はどうやって決めるべきなんでしょうか? どの程度の精度の数値を扱っているかによりますが、 そんなに厳密な計算をしているのでなければ、 double型なら -10^(-50)~10^(-50) single型なら -10^(-20)~10^(-20) は0とするというように適当に決めてもいいのではないでしょうか。

Cross999
質問者

お礼

ありがとうございました. 非常に参考になりました!!

関連するQ&A

  • C言語で質問です。

    C言語で質問です。 行列の計算で12行12列の行列の計算をしなければいけないのですが、 あらかじめ行列に文字や値を代入するときに同じ値の成分を簡単に代入する方法 はないのでしょうか? 例えば 「A[0][5]~A[0][12] はすべて0」「A[1][2]~A[1][8]はすべて1」のように まとめて代入する方法を教えてください。

  • 演算子の行列表現

    角運動量演算子の行列表現で成分を求めるとき、<○, ○|L|○, ○>のような形で成分が計算できるのはどういった仕組みでできるのでしょうか。

  • 必要十分性についてなのですが…

    少し前置きが長くなります(^_^;) (1)A=(1 0 / 0 2)(2×2行列、0 2は下段)と乗法について交換可能な行列、すなわちAX=XAを満たす2×2行列Xを全て求めよ。 (2)(1)の結果を利用して、どのような2×2行列とも乗法について交換可能な2×2行列を全て求めよ。 という問題で、 (1)は、X=(a b / c d)とおき、計算すると、a,dは任意の実数、b=c=0という答えが出ました。 (2)は、どのような2×2行列とも乗法について交換可能な行列Yは(1)より少なくとも(1,2)成分と(2,1)成分は0なので、Y=( x 0 / 0 y )とおける。任意の行列をB=(e f / g h)とおいてYB=BYを計算するとx=yという結果になったのですが、 ここで、必要十分性を示すために逆にYB=BY(ここでYは上で求めたもの、すなわちY=(x 0 / 0 x))を計算しなければならないとあったのですが、よく意味がわかりません。わかり易く教えて欲しいです。 また、漠然として難しい質問なのですが、どのような問題の場合、逆に~と計算しなくてはいけないのでしょうか。(これは答えていただかなくてもいいです) よろしくお願いします。

  • C言語による演算時の誤差について

    C言語初心者でどなたかご教授お願いします。 小数点の演算を行うわけではないのですが、 演算を行う数値が大きすぎるために、double型を使用して以下の計算を行うつもりです。 計算結果はlong型(小数点以下切り捨て)です。 double a,b,c; long x; x = (long)((a*b/c/100) 例)  x=(long)((189000*105000/100000)/100) 上記のような計算を行った際でも誤差が発生する可能性があるのでしょうか?

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • C言語の四則演算

    C言語で次のようなプログラムを作りたいのですが ソースを教えていただけないでしょうか? 四則演算のみの計算式を標準入力から受け取り計算式の通りに計算を行い計算式と答えを標準出力に出力する どなたか教えてください

  • 行列をベクトルに(C言語)

    行列をベクトルに(C言語) m行n列の行列Aがあったとき、それをm×n行1列の行列(ベクトル)Bに するというプログラムを作りたいです。 これは、行列Aの1列目m行分の要素をそのまま行列Bの1行1列目に持っていき、 それを行列Aのn列の数だけ繰り返す、といった要領です(画像参照) つまり MATRIX B; B.m=A.m*A.n; B.n=1; return B; ということだと思うのですが、なかなかうまいくいきません。 また、構造体も使いたいので、 typedef struct { int m; int n; double *mat; } MATRIX; と宣言しました。 画像は説明のため、一応載せておきました。(例として4列の行列になっています) みなさんよろしくお願いします。

  • C++行列計算プログラム

    C++を利用して逆行列(10×10などの大きな行列)を求める計算のプログラムを作りたいのですが、うまくできません。 どのように作ればいいのでしょうか?

  • c言語の課題について

    (1)3行3列の行列の和を求めて表示するプログラムを作成しなさい。 (行列の要素はあとで適当な値を打ち込むこととする) (2)2行3列の行列と3行2列の行列の積を求めて表示するプログラムを作成しなさい。 (行列の要素はあとで適当な値を打ち込むこととする) プログラム言語を最近習いはじめたんで、あんまり難しいことは しないと思うんですが、全くわからなくて苦労しています。 わかる人がいたら至急教えてください。お願いします。

  • 逆行列の有無

    2行2列の行列で逆行列を持たないものの一般形として (ka ma)ですべての場合を表せているでしょうか?(k,mは実数) (kb mb) 「ある行列は逆行列を持たない」という設定で成分計算するときに、逆行列の場合分けのパターンが結構あるので大変です。

専門家に質問してみよう