• ベストアンサー

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

TAGOSAKU7の回答

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

どもども田吾作7です。 ('_`)ウゥ 計算は標準で有効桁数が限られているので、標準では出来ないと思います。(もし出来るのであれば、ぼくも知りたいです。だれか教えて!) ぼくの場合は自分で計算モジュールを作っちゃいます。 一応たし算とかけ算のサンプルを載せておきます。 そういえば、この前別の質問に答えて、サンプルを参考URLに載せたら、gooの人から「直接リンクを張ってはいけない」とメールが送られてきて、しかもその発言を削除されてしまいました。。。(-ロ-;グハッ どうやら、いけない行動だったらしいのです。ですので、ここにアドレスを書いときます。(ここならOKなのかな?) http://f-ga.com/Lib/CalcProject.lzh 以下のソースは上記のファイルのソースを、コピペしたものです。 必要なコントロール Command1 Text1 Text2 Label1 Command2 Text3 Text4 Label2 Private Sub Command1_Click() 'たし算 Dim wkStr As String Dim wkLng As Long With Me 'テキスト1には数値が長くても大丈夫 wkStr = .Text1.Text 'テキスト2にはLONG型に収まる値にしてください wkLng = Val(.Text2.Text) .Label1 = funcTASU(wkStr, wkLng) End With End Sub Private Sub Command2_Click() 'かけ算 Dim wkStr As String Dim wkLng As Long With Me 'テキスト3には数値が長くても大丈夫 wkStr = .Text3.Text 'テキスト4にはLONG型に収まる値にしてください wkLng = Val(.Text4.Text) .Label2 = funcKAKERU(wkStr, wkLng) End With End Sub Function funcTASU(inStrNumber As String, inLngPlusNumber) As String Const CutNum As Long = 3 'とりあえず3桁で区切ることにする Dim wkMaxLen As Long '文字型ナンバーの桁数 Dim wkMaxCnt As Long 'ループ回数 Dim wkMod As Long '3桁にならない余りの上位桁 Dim i As Long 'ループカウンタ Dim wkSpotPos As Long '区切り位置 Dim wkSpotNum As Long '区切られた部分の数値 Dim wkCalc As Long '計算用ワーク Dim memCalc As String '計算用ワーク Dim ketaCalc As Long '桁上がり計算用ワーク If Not IsNumeric(inStrNumber) Then GoTo PGMEND wkMaxLen = Len(inStrNumber) 'この回数繰り返す wkMaxCnt = (wkMaxLen \ CutNum) '3で割り切れない桁数を得る wkMod = (wkMaxLen Mod CutNum) '余りがあるとき、ループ数を増やす If Not (wkMod = 0) Then wkMaxCnt = wkMaxCnt + 1 End If For i = 1 To wkMaxCnt '基本的に3桁づつ取り出す If (i = wkMaxCnt) And (Not (wkMod = 0)) Then '最上位桁が3桁じゃない時、上位余り桁を得る wkSpotNum = Left(inStrNumber, wkMod) Else 'それ以外 wkSpotPos = (wkMaxLen - (i * CutNum) + 1) wkSpotNum = Mid(inStrNumber, wkSpotPos, CutNum) End If If i = 1 Then '最下位桁には指定の値をたす wkCalc = inLngPlusNumber + wkSpotNum Else '最下位桁以外は、繰り上がりの値をたす wkCalc = wkSpotNum + ketaCalc End If '上位桁として下3桁だけ連結させる memCalc = Right(wkCalc, CutNum) & memCalc '10の3乗で除算し、その答えが桁上がり ketaCalc = wkCalc \ (10 ^ CutNum) Next i '桁上がりが存在していたら、上位桁として連結 If Not (ketaCalc = 0) Then memCalc = ketaCalc & memCalc End If PGMEND: '返り値をセット funcTASU = memCalc End Function Function funcKAKERU(inStrNumber As String, inLngKakeruNumber) As String Const CutNum As Long = 3 'とりあえず3桁で区切ることにする Dim wkMaxLen As Long '文字型ナンバーの桁数 Dim wkMaxCnt As Long 'ループ回数 Dim wkMod As Long '3桁にならない余りの上位桁 Dim i As Long 'ループカウンタ Dim wkSpotPos As Long '区切り位置 Dim wkSpotNum As Long '区切られた部分の数値 Dim wkCalc As Long '計算用ワーク Dim memCalc As String '計算用ワーク Dim ketaCalc As Long '桁上がり計算用ワーク If Not IsNumeric(inStrNumber) Then GoTo PGMEND wkMaxLen = Len(inStrNumber) 'この回数繰り返す wkMaxCnt = (wkMaxLen \ CutNum) '3で割り切れない桁数を得る wkMod = (wkMaxLen Mod CutNum) '余りがあるとき、ループ数を増やす If Not (wkMod = 0) Then wkMaxCnt = wkMaxCnt + 1 End If For i = 1 To wkMaxCnt '基本的に3桁づつ取り出す If (i = wkMaxCnt) And (Not (wkMod = 0)) Then '最上位桁が3桁じゃない時、上位余り桁を得る wkSpotNum = Left(inStrNumber, wkMod) Else 'それ以外 wkSpotPos = (wkMaxLen - (i * CutNum) + 1) wkSpotNum = Mid(inStrNumber, wkSpotPos, CutNum) End If 'とりあえずかける wkCalc = inLngKakeruNumber * wkSpotNum '繰り上がりの値をたす wkCalc = wkCalc + ketaCalc '上位桁として下3桁だけ連結させる memCalc = Right(wkCalc, CutNum) & memCalc '10の3乗で除算し、その答えが桁上がり ketaCalc = wkCalc \ (10 ^ CutNum) Next i '桁上がりが存在していたら、上位桁として連結 If Not (ketaCalc = 0) Then memCalc = ketaCalc & memCalc End If PGMEND: '返り値をセット funcKAKERU = memCalc End Function ってな感じです。 でわでわ

関連するQ&A

  • Perlの数値計算で有効桁数を上げたい

    通常、Perlで数値計算をする場合、有効桁数は15~16桁になってしまいます。 これを、32桁、64桁と精度を上げて計算する方法はないでしょうか。 現在の環境は、Perl 5.8です。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 円周率の大桁数の計算

    円周率 3.1415~延々と続きますが、この莫大な桁の数字はどうやって計算するのでしょうか? ・計算機ならではの特別なアルゴリズムがあるのか? ・手計算で無理やり算出する方法はあるのか? 正多角形を内接、外接させる方法は桁数が小さい場合に有効ですが、何十桁も求めるには不向きと思います。世に出ている数値はどうやって計算したのでしょうか?素人考えですが、今日は40~50桁数、明日は51~60桁などという方法があるのでしょうか?

  • 有効桁数について

    ある数値を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で割れと書いてあったりしたときは、それらの数字の桁数も考えなければならないんでしょうか? 読みづらい文章かもしれませんが、ご回答待っています。

  • VB2008での表示可能桁数について

    VB2008EEで16進数と10進数の相互変換を行おうと思い、とりあえず下記のようなコードを書いたのですが、 ---------- Dim HOGE As Decimal HOGE = 16 ^ 16 MsgBox(HOGE) ---------- 出力の結果が「18446744073709600000」となります。 しかし、電卓で「16^16」を計算すると、 「18446744073709551616」となります。  VBでの16^16の結果=18446744073709600000  電卓での16^16の結果=18446744073709551616 ちなみに「16^15」までの結果はVBでも電卓でも同じでした。 「16^16」以上の結果は全て同じようにある程度の桁数で繰り上げされてしまっているようです。 ちなみに、データ型「Decimal」は「+/-79,228,162,514,264,337,593,543,950,335」まで 表示可能らしいので、特に桁不足という問題は無いはずだと思っています。 これの理由と、対応策のわかる方はいらっしゃいますでしょうか? ちなみに、最終的に「16^20」くらいまで計算したいと考えています。 よろしくお願いいたします。

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

    初心者で申し訳ないのですが、 今、 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よりも有効桁数のある型とかがあるのでしょうか? すみませんが、アドバイスお願いします。

  • 14桁の16進数を10進数で表した時の桁数

    いつもお世話になってます。 情報処理技術者試験の問題で分からない部分があったので質問させて頂きます。 ***問題 14桁の16進数を10進数で表した時の桁数 但し、log10(2) = 0.301とする。 ***解答 log10(16^14) = 14 * log10(16) = 14 * log10(2^4) = 14 * 4 * log10(2) = 14 * 4 * 0.301 = 16.856 繰り上げて答えは17桁になります。 質問ですが何故、14桁の16進数の最大値の桁数が16^14と同じになるのかが分かりません。 14桁の16進数の最大値は16^14 - 1になるので、 桁数も16^14 - 1と同じになるのではないのでしょうか。 基本的な事を見逃している気がします。 解答宜しくお願い致します。

  • 有効桁数について

    たとえば整数の3桁割る4桁の場合の数値についてです。 レポートの表に数値を記入するとき,たとえば0.921,0.866,0.995,1.331と計算結果が続くとき 小数点以下の桁数を同じにしてはダメですか? やはり1.331は1.33と記入しないとダメなのでしょうか?私は小数点以下の桁数をそろえて記入したところその理由を問われたのですが,答えられませんでした.小数点以下の桁数をそをえてもいい時のわけを教えてください.   大変困ってます!!!

  • 桁数の計算

    はじめまして。 掛け算・割り算の桁数だけ計算する時、自分は以下のように計算しています。 しかし、自分だけ独自の計算方法をしているように思えて気になっていました。 皆さんはどのようにしておられるのか教えてください。 よろしくお願い致します。 掛け算の場合 100(3ケタ)× 100(3ケタ) = 10000(5ケタ) → 3ケタ + 3ケタ - 1ケタ = 5ケタ 割り算の場合 10000(5ケタ) ÷ 100(3ケタ) = 100(3ケタ) → 5ケタ - 3ケタ + 1ケタ = 3ケタ 10000(5ケタ) ÷ 10000(5ケタ) = 1(1ケタ) → 5ケタ - 5ケタ + 1ケタ = 1ケタ 10000(5ケタ) ÷ 1000000(7ケタ) = 0.01(3ケタ) → 7ケタ - 5ケタ + 1ケタ = 3ケタ *ケタの大きいほうから小さいほうを引くように変換(計算結果がプラスになるように変換)

  • 階乗の桁数

    200!の桁数を求めよ。という問題で、 10進法で何桁か?は375桁とわかったのですが、 2進法、4進法、8進法、16進法で何桁なのかわかりません。 2進数の桁数の計算方法は Nlog10=xlog2 (底は10) で、求められると思うのですが、 約1245.723と出てきてしまい、 1245桁なのか1246桁なのかわかりません。 こういう場合は四捨五入するのですか?切捨てにするのですか? 教えてください。 お願いします。

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

    入力した数字の桁数を表示させるというプログラムを考えています。 例) 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); }