• ベストアンサー

大きな桁数の計算について

初心者で申し訳ないのですが、 今、 2531101.784317 -551549.664130 1298109.439175 -2439839.366861 3029558.903444 2808716.033509 -2235302.273335 4209602.374689 -903409.098650 -12186064.825295 この10個のデータ(ベクトル)のノルムを1にしたいと思い 計算しようと思ったのですが、 今このデータはdoubleの配列D[10]に入っているのですが、 このまま、D[i]*D[i]を計算すると、やっぱりオーバーフローを起こしますでしょうか? 調べたらdoubleは16桁までとあったので、 恐らく上か下の値が切れると思ったのですが、大丈夫なのでしょうか? 失敗する場合は、どのように対処すればよいでしょうか? doubleよりも有効桁数のある型とかがあるのでしょうか? すみませんが、アドバイスお願いします。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

提示された値の2乗程度の値は、 double型が扱える範囲(およそ10の308乗)に じゅうぶん収まります。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

オーバーフローの問題を回避するだけなら hypot を使えばいいんだけど, それとは別に「とりあえず絶対値最大の数値ですべてを割ってから考える」のがセオリーじゃないかなぁ. どうせ最終的には「ここの値の比率」だけが問題なんだから. ちなみに「double より有効桁数のある型があるかどうか」は処理系依存. 厳密に言うと「double より有効桁数の少なくない型」として long double はありますが, 「有効桁数が多い」とは限らない (つまり同じかもしれない).

  • joqr
  • ベストアンサー率18% (742/4026)
回答No.2

double の有効桁数は15桁 folat の有効桁数は7桁 です それ以上の桁を扱いたければ BCD演算でも使えばいいです >D[i]*D[i]を計算すると、やっぱりオーバーフローを起こしますでしょうか やってみる方が早いし、論より証拠です 単純に桁上がりがいくつかの問題です それは算数で考えていいと思います

関連するQ&A

  • 有効桁数について

    ある数値を5回測定したとします A 5.039 B 5.075 C 5.092 D 5.064 E 5.058 有効桁数はすべて4桁ですよね? 次にA~Eの平均を取ると (A+B+C+D+E)/5=5.0656 と関数電卓で結果がでますが、4桁に丸めて5.066とすれば有効桁数の扱い方としては問題ないですか? そしてA~Eの平均の2乗をするときは、上記の平均を有効桁数4桁に丸めた5.066を2乗して (5.066)^2=25.664356 となり、そして5.066の有効桁数4桁に合わして25.66とすればいいのでしょうか? それとも平均の値を4桁に丸める前の電卓で出た値のまま2乗した後、最終的に4桁に丸めるのがいいのでしょうか?この数値だとどちらでやっても4桁にした値は変わりませんが・・・ 有効桁数の扱い方で問題があったら教えてください、また平均の2乗を求めるときはどちらが正しいのでしょうか? (平均の値の2乗は平均×平均なのだから平均の値を4桁にせず5桁として計算すると平均の2乗は有効桁数5桁と考えるので、やはり正しく平均の値を測定値の有効桁数4桁に丸めて出した平均の値を2乗する方が正しいですかね・・・)    また、上記の平均の計算をしたときのよな、「5」などの数字の有効桁数は何桁ですか?1桁なんでしょうか?もし1桁なら割り算をしているので有効桁数はいちばん桁数の少ないものに合わせるので有効桁数1となると平均の値が「5」となりおかしいとおもうんですが・・・ 上記の平均を取ったときの「5」や、測定回数の数値や、測定していない数で100で割れと書いてあったりしたときは、それらの数字の桁数も考えなければならないんでしょうか? 読みづらい文章かもしれませんが、ご回答待っています。

  • VB5での有効桁数以上の計算結果について。

    現在、VB5をやっているのですが、以前の質問のログを見てさらに思ったのですが、乗除算で Double型で15桁や通貨型などで、有効桁数より大きな数(20桁)等を計算して、正しい数値を 表すには(指数ではなくて)何かいい方法があるのですか? 999,999,999,999,999 * 10 などの計算です。

  • 有効桁数について

    ある測定値75.88と測定値ではない任意の数15などを掛け合わしたとき 電卓でこの計算をすると1138.2となります これは掛け算なので有効桁数は演算における実数の有効桁数が一番少ないもので決まるので、75.88の有効桁数4桁をつかって1138とするのが正しいのでしょうか? それとも(測定値)×(測定値ではない値)のときは有効桁数は考慮しないで1138.2(1138.20?)とした方が良いのでしょうか? 15×75.88とは75.88を15回足すことなので、15回足し算した場合は、1138.20が有効数字の扱い方としては正しいですよね? 大変困っています・・・ 有効数字の扱い方はどうすればよいか教えてください、あまりにも小さい誤差は気にしないとかではなく、有効数字の扱い方はどうすればいいかを教えて欲しいです。

  • 大きな桁の計算はどうやるの?

    double型で計算しきれない桁数のの計算はどうすればいいのでしょうか。 4桁の問題を80問やったときにまぐれで全問正解する確率を計算したいのですが int i; double x=4; for(i=1;i<80;i++){ x = x * 4; } printf(" %f 分の1 \n",x); これでは結果が e と出てしまって計算できません。 どなたか教えてください><

  • 桁数が増えると正しく計算されません。

    今、Perlで作成したモジュールをCに移しています。 Perlではうまく動いているのですが、Cで作った以下のプログラムでは、 nを13以上にすると、値が正しく計算されなくなります。 ユーザ関数をdoubleにしたりすると、全て0になったりコンパイルできません。 せめてdouble型の最大値くらいまでは計算したいと考えています。 また、下のプログラムでC言語ならではの修正すべき点があれば教えてください。 よろしくお願いします。 #-----------------------------------------------------------# #include <stdio.h> int factorial(int j); int main(void) { /* 試行回数n回 */ int i, j, n, r, x; int combination; //printf("試行回数は?"); //scanf("%d", &n); n=13; for (i=1; i<=n; i++){ for (r=0; r<=i; r++){ combination = factorial(i) / (factorial(r) * factorial(i - r)); printf("%5d",combination); } printf("\n"); } } int factorial(int j){ int i; int x; x = 1; for (i = 1; i <= j; i++){ x *= i; } return x; } #-----------------------------------------------------------#

  • 桁数を求めるプログラム。

    入力した数字の桁数を表示させるというプログラムを考えています。 例) 135 この数字の桁数は3桁です。 などと表示させたいと思っています。 それで、私は入力した数値を10で割っていって入力した数値aがa<=0になったらループを終了して 何回ループしたかのカウンタで桁数を表示させようかと考えました。 たとえば135→13.5→1.35→0.135で整数部分が0となるのでループを打ち切って 3回繰り返したので3桁と表示させたいと思いました。 それでプログラムを考えてみたのですが、どうにもうまくいきいません。 どのように修正したら桁数が表示できるようになるでしょうか? #include <stdio.h> main() { double a=0; int n=1; scanf("%d",&a); while(1) { a=a/10.0; if(a<=0){ break; } n++; } printf("その数は%d桁です。\n",n); }

  • 任意の桁数を表示するには?

    配列の中に格納されている桁に応じて表示のしかたを変えたいのです。 最大で3桁の数字が入っていたら、3桁表示に、 最大で5桁の数字が入っていたら、5桁表示に、 つまり int a[]={1,100,1,1}; の時は printf("%3.d "); と表示し、 int a[]={1,100,1,10000}; の時は printf("%5.d "); と表示するように、桁数に応じて%x.dのxの部分を変更したいんです。 どうしたらいいでしょうか。

  • 計算結果をコピーすると桁数増加・・・

    現在使用しているのはエクセル2003です。 エクセルファイルでコピーする際に「形式を指定して」「値」にしてコピーした場合、例えば0.024が0.0240000000000009や 0.011が0.0109999999999673と成ってしまう場合があります。 私が必要な桁数は小数点以下3桁まででなので、それ以下の値を排除して小数点以下3桁にまとめたいと考えています。 現在セルの最大桁数は以下の方法で計算しています。 Ro = Application.Round(Cells(Count_R, Count_C).Value, 0) Ab = Abs(Cells(Count_R, Count_C).Value) coun = Len(Ab) - Len(Ro) この式でcoun>3と成った場合IFで分岐させて小数点以下3桁にまとめる計算式を実行させたいのですが、どの様にすればいいのでしょうか? よろしくお願いいたします。

  • 有効数字の桁数と平均操作

    http://oshiete1.goo.ne.jp/qa4080175.html この質問に答えようと思っていましたが締め切られてしまいましたので私の質問として書かせていただきます。 元の質問は10個の測定データがあるとき平均値の有効桁数はいくらかというものです。参考のためにデータを載せておきます。 92.0mm  91.5mm  91.0mm  97.0mm  93.0mm 94.0mm  92.0mm  93.0mm  92.0mm  92.5mm 個々のデータを見れば有効桁数3桁のように見えますがデータごとのばらつきが大きいです。2桁目でばらついています。最大の値と最小の値で6.0も幅があります。データの信頼性で言えば有効数字は2桁だと思います。小数点下第一位の数値は全く信頼性のない値です。 この質問のA#1の参考URLにも書かれていますが 測定を10回繰り返すということをやれば平均値の有効桁は測定の有効桁よりも1つ増やすことが出来ます。 問題はこの測定値の有効桁がいくらかということです。 私は10個のデータの有効桁は2桁だと思います。個々のデータを3桁で測ったということがデータの有効桁を表しているのではないと考えます。 したがって平均値は92.80ではなく92.8が正しいと思います。 (でも質問者様は92.80が正しいということで納得してしまわれたようです。) 統計に詳しい方がおられて回答をもらえるといいのですが。

  • C言語でπを2万桁まで計算するには

    C言語でπの値を2万桁まで(2万という数字に特に意味はないですが大きい桁)をマーチンの公式を用いて計算したいのです。 マーチンの公式によるπの求め方は 16×アークタンジェント(1/5) - 4×アークタンジェント(1/239) ということは分かったのですが double型の変数を使っても扱える桁数はたかがしれているので どのようにすればアークタンジェント(1/5)などの値を C言語のプログラムで大きい桁まで求めることができるのでしょうか。 また何かうまい具合に計算できるアルゴリズムなどがありましたら 教えてください。 詳しい方いましたら、よろしくお願いします。 もしよければ参考プログラムなども 貼り付けていただけたら幸いです。

専門家に質問してみよう