• ベストアンサー

n桁目の数

探すのも下手だし、探しても解らないし… http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1425566614 見ても解らないので… 済みません教えてください、 n進数をm進数に変換した時 小数点からI番目の数を ループとか再帰なんちゃらとか、そんなの無しで 数学の関数で 兎に角スパ!! と、求めるのって、 どうすれば良いですか? お手数ですが、宜しくお願いします。

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

  • ベストアンサー
  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.3

お礼をいただきありがとうございます。 まず、m進数の数値XのI桁目の値ですが、 =mod(int(X/m^I),m) となります。(*mは削除です) I=0で1の位、I>0でmの位以上、I<0で小数点以下となります。 あ、これこそ「数学の関数で兎に角スパ!!」かもしれませんね。 こういう回答をすべきだったのですね。 次に、m進1桁を10進にする方法ですが、これは難しく考えることはありません。 m進数の一桁をd(dは0からm-1までの整数)とすると、I桁目であればd*m^Iを計算すればいいのです。 m進数で複数桁であれば各桁のd*m^Iの計算結果を合計(加算)するだけです。 (桁の表記、たとえば16進数ではA-Fも使うことなどについては問題ないですよね。) ただ、10進にするというのは表向きのことで、本質は単に値を計算するということだと思います。 手計算や電卓なら計算できる数値は10進表記のものですよね。 Excelは内部は2進演算でも人間が数式を入力したり結果を見たりするのは10進数なので、計算できる数値はやはり10進表記のものということになります。 それゆえ、値を計算するということは10進数にすることになるのだと思います。 それと、質問者様の考えておられる方法で問題になるかもしれない点が2つあります。 1つ目は数値の桁数です。 ご存じかもしれませんがExcelの数値は倍精度実数なので10進表記で15桁しかありません。(2進で53桁でしたっけ?) そのため400列(あるいは行)を扱うにはデータを持つための数値がかなりの個数必要になりそうです。 2つ目は小数の誤差です。 これもご存じかもしれませんが、Excelは内部は2進演算なので、小数を誤差なく表記できるのはmが2のべき乗の場合(2進、16進など)だけです。 そのため、小数部の桁の表記でデータを持つより、たとえば整数の上位の桁と下位の桁でデータを持つようにしたほうが誤差の心配がない分いいかもしれません。

Nouble
質問者

お礼

ご教示ありがとうございます。 >1つ目は数値の桁数… >2つ目は小数の誤… ご配慮、感謝します。 そうなのですよね、 色々考えて、今のところこれしかやり方が思いつかないのですが VBAでCurrency型を使えばまだマシかも… でもVBAでするなら、そもそも違う方法がありそうだし… ところで 確か10進の桁毎に4ビット割り当てて 何桁であろうとも、誤差無しに計算させる方法が あったと思うのですが、… 銀行など誤差の許されないシーンに置いて使われていたような… 既に頭の中からロストしかけています 滝汗

その他の回答 (2)

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.2

No.1です。 かなり的外れな回答をしてしまったようで失礼いたしました。 リンク先を見ましたが、整数で桁数が多い場合の話なのですね。 数学は素人なので正しい回答ができるかどうかわかりませんが、思いつく範囲で回答させていただきます。 計算の手段は何を使用するのでしょうか。 とりあえず手計算と必要に応じて数表、計算機を使うなら一般的な桁数の電卓程度とします。 桁数が少ない場合は難しくないですよね。 (おそらく質問者様もご存じだと思いますが念のため書きます) 1の位を1桁目、mの位を2桁目、m^2の位を3桁目・・・とし、 I桁目を求めるなら以下のようにします。 1.元の数をm^(I-1)で割る。商は整数部のみ求める。 2.求めた商(整数)をmで割った余りを求め、これをm進数(1桁)に変換する。 桁数が多い場合ですが、まずは上から数桁を求める方法です。 リンク先のベストアンサーが対数表を使用して10進法で計算する方法です。 10進以外、つまりmが10ではない場合もほぼ同じ方法が使えますが、mを底とした対数で計算することと、対数表から得た値をm進数に変換することが必要になります。 次に桁数が多い場合に下から(1の位から上の位に)数桁を求める方法です。 今のところ思いつくのはm進数で下の桁だけを計算するという方法です。 例えば8桁の電卓で2^100の10進表記での下4桁を求めてみます。 2^25=33554432です。(ひたすらキーをたたけば出ますよね) 下4桁を取ると4432ですがこれを2乗すると19642624、さらに下4桁を取って2乗すれば6885376となります。この下4桁の5376が2^100の下4桁です。 10進以外の場合、下4桁を取るかわりにm^4(3進数の下4桁なら3^4=81)で割った余りを求め、最後に求めた余りをm進数に変換します。 では中間の桁(たとえば2^100の10進16桁目など)はどうするかというと、おそらく上記の方法のいずれかで計算するしかないと思います。つまり、元の数の少なくとも半分以上の桁数の計算ができる手段が必要になると思います。

Nouble
質問者

お礼

出来ればExcelの式中で使用したく思っています。 30×400(1例)の条件にヒットした セルの数を行毎、又は列毎に知る こんな事がやりたくて質問しました。 で、ですね 何列目かを小数点以下の数値で 何行目かを整数の値で それぞれ持たせたいと思ったのですが、 要領としては 一難上の行が1桁目 2番目の行が2桁目 3番目の行が3… 4番目の… ……… …… … … と、いった感じで行いたいと思いました。 10進数では まあ言うまでも無く 1+1+1+10+100+100+100+1000+… と、しても 1の位に相当するものが幾つあったか? 千の位に相当するものが幾つあったか? なんて、至極簡単なので この考え方をプログラミングに反映させよう と、いう話しなのです。 そこで 読ませて頂いて未だ半信半疑なので、 お教えください。 m進数の数値X、これのI桁目の値は =mod(int(X/m^I)*m,m) これで合ってますでしょうか? (※注:MODは除数 ^は累乗後の値を求める) あれ? このm進1桁になったものを 10進にする方法もピンときません 汗 お手間を取らせて済みませが 宜しくお願い致します。

  • queuerev2
  • ベストアンサー率78% (96/122)
回答No.1

ある小数をm進数で表記した場合の小数点以下I桁目は何か、 という問題でしょうか。 (n進数は関係ないように思えましたので) そうであれば、以下の手順でいいと思います。 1.ある小数にmのI乗をかける 2.小数点以下を切り捨てる 3.mで割った余りを求める。 たとえば3/7を16進の小数にすると0.6DB6DB・・・となりますが 2桁目のDであれば、 3/7*16^2=109.714285・・・ 小数点以下を切り捨てて109 109を16で割った余りは13、つまり16進表記でDです。

Nouble
質問者

お礼

有り難うございます、 お礼が遅れた為、要らぬ気を遣わせてしまい 申し訳有りません。

関連するQ&A