Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8485 / 13644 ツリー ←次へ | 前へ→

【32873】マクロで平方根を・・・・・ Enzeru 05/12/26(月) 2:59 質問[未読]
【32874】Re:マクロで平方根を・・・・・ やっちん 05/12/26(月) 3:53 回答[未読]
【32875】Re:マクロで平方根を・・・・・ アトラン 05/12/26(月) 5:06 お礼[未読]
【32876】Re:マクロで平方根を・・・・・ アトラン 05/12/26(月) 5:20 発言[未読]
【32877】Re:マクロで平方根を・・・・・ やっちん 05/12/26(月) 5:43 発言[未読]
【32878】Re:マクロで平方根を・・・・・ やっちん 05/12/26(月) 8:37 発言[未読]
【32950】Re:マクロで平方根を・・・・・ アトラン 05/12/27(火) 23:56 回答[未読]
【32973】Re:マクロで平方根を・・・・・ やっちん 05/12/28(水) 12:31 発言[未読]
【32953】Re:マクロで平方根を・・・・・ アトラン 05/12/28(水) 0:01 回答[未読]
【32954】Re:マクロで平方根を・・・・・ アトラン 05/12/28(水) 0:03 回答[未読]
【32956】Re:マクロで平方根を・・・・・ 何様? 05/12/28(水) 1:11 質問[未読]
【32902】Re:マクロで平方根を・・・・・ ichinose 05/12/26(月) 18:20 発言[未読]
【32951】Re:マクロで平方根を・・・・・ アトラン 05/12/27(火) 23:58 回答[未読]
【33002】Re:マクロで平方根を・・・・・ ichinose 05/12/28(水) 17:36 発言[未読]
【33007】Re:マクロで平方根を・・・・・ ni 05/12/29(木) 0:01 発言[未読]
【32880】Re:マクロで平方根を・・・・・ Kein 05/12/26(月) 12:52 発言[未読]
【32881】Re:マクロで平方根を・・・・・ やっちん 05/12/26(月) 13:03 発言[未読]
【32952】Re:マクロで平方根を・・・・・ アトラン 05/12/28(水) 0:00 回答[未読]
【32980】Re:マクロで平方根を・・・・・ Kein 05/12/28(水) 13:35 発言[未読]
【32984】Re:マクロで平方根を・・・・・ A 05/12/28(水) 14:40 発言[未読]

【32873】マクロで平方根を・・・・・
質問  Enzeru  - 05/12/26(月) 2:59 -

引用なし
パスワード
   マクロで平方根って出来ますでしょうか?

【32874】Re:マクロで平方根を・・・・・
回答  やっちん  - 05/12/26(月) 3:53 -

引用なし
パスワード
   ▼Enzeru さん:
ワークシート関数の「sqr」を使います。
使用するには「WorksheetFunction.sqr()」とする必要があります。
詳しくは「WorksheetFunction」のHELPで。

【32875】Re:マクロで平方根を・・・・・
お礼  アトラン  - 05/12/26(月) 5:06 -

引用なし
パスワード
   ▼やっちん さん:
>▼Enzeru さん:
>ワークシート関数の「sqr」を使います。
>使用するには「WorksheetFunction.sqr()」とする必要があります。
>詳しくは「WorksheetFunction」のHELPで。
ありがとうございました。
早速,使ってみたいと思います。<(_ _)>

【32876】Re:マクロで平方根を・・・・・
発言  アトラン  - 05/12/26(月) 5:20 -

引用なし
パスワード
   ▼アトラン さん:
>▼やっちん さん:
>>▼Enzeru さん:
>>ワークシート関数の「sqr」を使います。
>>使用するには「WorksheetFunction.sqr()」とする必要があります。
>>詳しくは「WorksheetFunction」のHELPで。
>ありがとうございました。
>早速,使ってみたいと思います。<(_ _)>
早速やってみましたが、これとはちょっと違うような・・・・・
無限にでも計算出来る様な計算式(マクロ)が・・・・・・・・・
わがまま言って申し訳ありません。<m(__)m>

【32877】Re:マクロで平方根を・・・・・
発言  やっちん  - 05/12/26(月) 5:43 -

引用なし
パスワード
   最初の方と名前が違いますが同一人物なのでしょうか・・・。
無限に計算するというのはどういうことでしょう?
プログラムが永遠に実行されて終わりませんが。
実際は変数の表現できる範囲内でしか求められず、それ以上は計算できる仕組みを作るしかないと思います。私には思いつきません。
計算式は下のリンクにあります。
http://math.josai.ac.jp/kouza/sakata/

【32878】Re:マクロで平方根を・・・・・
発言  やっちん  - 05/12/26(月) 8:37 -

引用なし
パスワード
   DOUBLEの範囲までしか求められませんが・。

2の平方根を20回のループで求める場合
Sub TEST()
  MsgBox Sqrt(2, 20)
End Sub
Function Sqrt(ByVal a As Double, ByVal n As Long) As Double
  Dim x As Double
  Dim nI As Long
  x = a
  For nI = 1 To n
    x = (x + a / x) / 2#
  Next nI
  Sqrt = x
End Function

【32880】Re:マクロで平方根を・・・・・
発言  Kein  - 05/12/26(月) 12:52 -

引用なし
パスワード
   VBAの関数にも Sqr があります。ヘルプをコピーしておきます。

Sqr 関数

数式の平方根を倍精度浮動小数点数型 (Double) の値で返す数値演算関数です。

構文

Sqr(number)

引数 number は必ず指定します。
引数 number には、0 以上の倍精度浮動小数点数型 (Double) の数値または
任意の有効な数式を指定します。

【32881】Re:マクロで平方根を・・・・・
発言  やっちん  - 05/12/26(月) 13:03 -

引用なし
パスワード
   大嘘を書いていました。
「WorksheetFunction.sqr」は使用できません。
大変失礼しました。

【32902】Re:マクロで平方根を・・・・・
発言  ichinose  - 05/12/26(月) 18:20 -

引用なし
パスワード
   こんばんは、皆さん。
>早速やってみましたが、これとはちょっと違うような・・・・・
>無限にでも計算出来る様な計算式(マクロ)が・・・・・・・・・
中学だったかな?高校1年生だったかな?
平方根の筆算(私のころは、縦書きの計算と呼んでいました)
を習ったことがありました。

意味もわからず、機械的に方法だけはマスターした記憶があります。
ありますが、これ使わないんですよね!!(試験にもでなかったし・・)
で調べると、

http://homepage1.nifty.com/moritake/sansu/6/heihoukon/PAGE001.HTM

バビロニアにおける平方根の求め方というらしいです。

'==================================
Sub main()
  For idx = 1 To 10
    Cells(idx, 1).Value = "'" & sqr_calc(idx, 100)
    Next
End Sub
'=======================================================================
Function sqr_calc(myvalue As Variant, Optional lpmax As Long = 10) As string
'Input---myvalue---平方根
'    lpmax-----計算回数
'out-----sqr_calc---myvalueの平方根
  Dim wk As Double
  Dim wk2 As Double
  Dim ans As String
  Dim vidx As Long
  Dim jdx As Long
  Dim nextketa As Long
  Dim lpcnt As Long
  Dim period As Boolean
  period = False
  wk = Int(CStr(myvalue))
  Do Until wk < 100
   wk = wk \ 100
   Loop
  vidx = Len(CStr(wk)) + 1
  ans = ""
  wk2 = 0
  retcode = 0
  lpcnt = 0
  Do While retcode = 0 And lpcnt < lpmax
    For jdx = 9 To 0 Step -1
     If (wk2 * 10 + jdx) * jdx <= wk Then
       wk = wk - (wk2 * 10 + jdx) * jdx
        
       wk2 = CDbl(wk2) * 10 + jdx * 2
       ans = ans & jdx
       Exit For
     End If
    Next jdx
    GoSub get_next_data
    lpcnt = lpcnt + 1
  Loop
  sqr_calc = IIf(InStr(ans, ".") = Len(ans), Left(ans, Len(ans) - 1), ans)
  Exit Function
get_next_data: '次の二桁を読み込む Input---wk, out---wk,ans(小数点をつけるときのみ)
  nextketa = 0
  Do While vidx <= Len(CStr(myvalue)) And nextketa < 2
   If Mid(CStr(myvalue), vidx, 1) = "." Then
     ans = ans & "."
     period = True
   Else
     wk = wk * 10 + CDbl(Mid(CStr(myvalue), vidx, 1))
     nextketa = nextketa + 1
   End If
   vidx = vidx + 1
  Loop
  If nextketa < 2 Then
    If period = False Then
     ans = ans & "."
     period = True
     End If
    wk = wk * 10 ^ (2 - nextketa)
  End If
  If nextketa = 0 And CDbl(wk) = 0# Then
    retcode = 1
  Else
    retcode = 0
  End If
  Return
End Function

もっとも計算回数が大きいと誤差も大きいと思いますけど・・・。
確認してみてください。

【32950】Re:マクロで平方根を・・・・・
回答  アトラン E-MAIL  - 05/12/27(火) 23:56 -

引用なし
パスワード
   ▼やっちん さん:
>DOUBLEの範囲までしか求められませんが・。
うーん 約1千万桁〜1億桁以上か又は必要な数字の羅列が出現するまで欲しい
所なのですが・・・・
じつは、任意の乱数の出現率を調べたくて・・・
>
>2の平方根を20回のループで求める場合
>Sub TEST()
>  MsgBox Sqrt(2, 20)
>End Sub
>Function Sqrt(ByVal a As Double, ByVal n As Long) As Double
>  Dim x As Double
>  Dim nI As Long
>  x = a
>  For nI = 1 To n
>    x = (x + a / x) / 2#
>  Next nI
>  Sqrt = x
>End Function

【32951】Re:マクロで平方根を・・・・・
回答  アトラン E-MAIL  - 05/12/27(火) 23:58 -

引用なし
パスワード
   ▼ichinose さん:
>こんばんは、皆さん。
>>早速やってみましたが、これとはちょっと違うような・・・・・
>>無限にでも計算出来る様な計算式(マクロ)が・・・・・・・・・
>中学だったかな?高校1年生だったかな?
>平方根の筆算(私のころは、縦書きの計算と呼んでいました)
>を習ったことがありました。
>
>意味もわからず、機械的に方法だけはマスターした記憶があります。
>ありますが、これ使わないんですよね!!(試験にもでなかったし・・)
>で調べると、
>
>http://homepage1.nifty.com/moritake/sansu/6/heihoukon/PAGE001.HTM
>
>バビロニアにおける平方根の求め方というらしいです。
>
>'==================================
>Sub main()
>  For idx = 1 To 10
>    Cells(idx, 1).Value = "'" & sqr_calc(idx, 100)
>    Next
>End Sub
>'=======================================================================
>Function sqr_calc(myvalue As Variant, Optional lpmax As Long = 10) As string
>'Input---myvalue---平方根
>'    lpmax-----計算回数
>'out-----sqr_calc---myvalueの平方根
>  Dim wk As Double
>  Dim wk2 As Double
>  Dim ans As String
>  Dim vidx As Long
>  Dim jdx As Long
>  Dim nextketa As Long
>  Dim lpcnt As Long
>  Dim period As Boolean
>  period = False
>  wk = Int(CStr(myvalue))
>  Do Until wk < 100
>   wk = wk \ 100
>   Loop
>  vidx = Len(CStr(wk)) + 1
>  ans = ""
>  wk2 = 0
>  retcode = 0
>  lpcnt = 0
>  Do While retcode = 0 And lpcnt < lpmax
>    For jdx = 9 To 0 Step -1
>     If (wk2 * 10 + jdx) * jdx <= wk Then
>       wk = wk - (wk2 * 10 + jdx) * jdx
>        
>       wk2 = CDbl(wk2) * 10 + jdx * 2
>       ans = ans & jdx
>       Exit For
>     End If
>    Next jdx
>    GoSub get_next_data
>    lpcnt = lpcnt + 1
>  Loop
>  sqr_calc = IIf(InStr(ans, ".") = Len(ans), Left(ans, Len(ans) - 1), ans)
>  Exit Function
>get_next_data: '次の二桁を読み込む Input---wk, out---wk,ans(小数点をつけるときのみ)
>  nextketa = 0
>  Do While vidx <= Len(CStr(myvalue)) And nextketa < 2
>   If Mid(CStr(myvalue), vidx, 1) = "." Then
>     ans = ans & "."
>     period = True
>   Else
>     wk = wk * 10 + CDbl(Mid(CStr(myvalue), vidx, 1))
>     nextketa = nextketa + 1
>   End If
>   vidx = vidx + 1
>  Loop
>  If nextketa < 2 Then
>    If period = False Then
>     ans = ans & "."
>     period = True
>     End If
>    wk = wk * 10 ^ (2 - nextketa)
>  End If
>  If nextketa = 0 And CDbl(wk) = 0# Then
>    retcode = 1
>  Else
>    retcode = 0
>  End If
>  Return
>End Function
>
>もっとも計算回数が大きいと誤差も大きいと思いますけど・・・。
>確認してみてください。
これって、もしかしてC言語かな
DOSのコンパイラダウンロードから初めてみます。

【32952】Re:マクロで平方根を・・・・・
回答  アトラン E-MAIL  - 05/12/28(水) 0:00 -

引用なし
パスワード
   ▼やっちん さん:
>大嘘を書いていました。
>「WorksheetFunction.sqr」は使用できません。
>大変失礼しました。
いえいえ、参考になりました。
ヘルプをかなり調べまくりまして
出来ないかもとか思いましたけど、やっぱり

【32953】Re:マクロで平方根を・・・・・
回答  アトラン E-MAIL  - 05/12/28(水) 0:01 -

引用なし
パスワード
   ▼やっちん さん:
>最初の方と名前が違いますが同一人物なのでしょうか・・・。
>無限に計算するというのはどういうことでしょう?
>プログラムが永遠に実行されて終わりませんが。
>実際は変数の表現できる範囲内でしか求められず、それ以上は計算できる仕組みを作るしかないと思います。私には思いつきません。
>計算式は下のリンクにあります。
>http://math.josai.ac.jp/kouza/sakata/
これだと、あまり桁数が少な過ぎ・・・・

【32954】Re:マクロで平方根を・・・・・
回答  アトラン E-MAIL  - 05/12/28(水) 0:03 -

引用なし
パスワード
   ▼アトラン さん:
>▼やっちん さん:
>>最初の方と名前が違いますが同一人物なのでしょうか・・・。
>>無限に計算するというのはどういうことでしょう?
>>プログラムが永遠に実行されて終わりませんが。
>>実際は変数の表現できる範囲内でしか求められず、それ以上は計算できる仕組みを作るしかないと思います。私には思いつきません。
>>計算式は下のリンクにあります。
>>http://math.josai.ac.jp/kouza/sakata/
>これだと、あまり桁数が少な過ぎ・・・・
すいません。かってな事ばかり言って<(_ _)>
これをマクロで書いたけどエクセルではdoubuleの範囲まででした。

【32956】Re:マクロで平方根を・・・・・
質問  何様?  - 05/12/28(水) 1:11 -

引用なし
パスワード
   考えもしないで、何様のつもり??

【32973】Re:マクロで平方根を・・・・・
発言  やっちん  - 05/12/28(水) 12:31 -

引用なし
パスワード
   >うーん 約1千万桁〜1億桁以上か又は必要な数字の羅列が出現するまで欲しい
>所なのですが・・・・
>じつは、任意の乱数の出現率を調べたくて・・・
最初にそう質問されないといらぬ方向に話が進んでいきますよ。

その処理はVBAには重荷だと思います。
どの言語でも変数そのものでその桁を表現できるものはないでしょうね。
ご質問の内容はichinoseさんが提示されたような
アルゴリズムを知りたいということで
VBAとは関係なく言語にも縛られない内容ですね。
VBAのようなインタプリタにやらせると
どれほど時間がかかることやら・・・。

【32980】Re:マクロで平方根を・・・・・
発言  Kein  - 05/12/28(水) 13:35 -

引用なし
パスワード
   >ヘルプをかなり調べまくりまして
>出来ないかもとか思いましたけど、やっぱり
私のレスを読んでますか ?

【32984】Re:マクロで平方根を・・・・・
発言  A  - 05/12/28(水) 14:40 -

引用なし
パスワード
   ▼アトラン さん
大丈夫ですか?

【33002】Re:マクロで平方根を・・・・・
発言  ichinose  - 05/12/28(水) 17:36 -

引用なし
パスワード
   こんばんは。

>これって、もしかしてC言語かな
>DOSのコンパイラダウンロードから初めてみます。
あっはは、皮肉ですね、これ!!・・・。

アルゴリズムとしての1提案です。
私は、今年はこれで投稿打ち止めです。

1億桁?、は無理でもVBAの限界に挑戦するのもよいと思いますよ。

バビロニアにおける平方根の求め方でいけると思います。
私のコードが分からなければ、Netで検索してアルゴリズムを理解してください。

後は、有効桁の問題なのですから、
加減乗のエミュレートから考えて見ては?
10^(1億)+1が計算できれば道が開けるかも・・。
因みに先のコードは、信頼桁数30桁程度です

【33007】Re:マクロで平方根を・・・・・
発言  ni  - 05/12/29(木) 0:01 -

引用なし
パスワード
   こんにちは

平方根でググって見たら、こんなのがありました。
http://www.mit.msn.to/algorithm/intsqrt.html
素数判定のため、整数解しか求まりませんが、
n桁まで求めるなら、10^2n倍して整数解を求めて
10^nで割ってやればいいでしょう。

限界に挑戦して下さい!

8485 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free