• 締切済み

[perl] 実数からdouble型のバイナリデータに変換したい

何度もすみません またわからないところがありましたので質問させて下さい 10進数の実数からdouble型に変換するやり方が分かりません 例えば 0.001 -> 3E 41 89 37 4B C6 A7 F0 のような感じです おそらくルーチンを組まなければならないと思うので、考え方・概略だけでも構いません お願いいたします

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

double 型に変換というのがよくわかりませんが、浮動小数点数値の 16進イメージが欲しいということであればこんなやり方でどうでしょうか #!/usr/bin/perl use strict; use warnings; while (<DATA>) { chomp; print "$_ -> ", reverse(unpack 'H2' x 8, (pack 'F', $_)), "\n"; } __END__ 0 4 2 1 0.5 0.1 0.01 0.001 実行例: 0 -> 0000000000000000 4 -> 4010000000000000 2 -> 4000000000000000 1 -> 3ff0000000000000 0.5 -> 3fe0000000000000 0.1 -> 3fb999999999999a 0.01 -> 3f847ae147ae147b 0.001 -> 3f50624dd2f1a9fc 3e 41 ... じゃないですけど。 使っているCPUがビッグエンディアンのものであれば、reverseは不要です。

Googlegle
質問者

お礼

大変遅くなり申し訳ございません いろいろ調べて回ったのですが私の言っているdouble型とは以下のことと勘違いしていたようです -------------------------------------------------------------------------------------------------------------------------------- (Wikipedia「浮動小数点数」より抜粋) [編集] IBM方式(エクセス64 形式) エクセス64の単精度実数では、符号部1ビット、指数部7ビット、仮数部24ビットで表現されている。各部は次のように定義されている。 符号部は0を正、1を負とする 指数部は16を基数とし、実際の指数に64を足した(ゲタ履き、バイアス)値で表す。 仮数部は1以下の2進小数とする。符号部は値の符号を表す。 指数部は-16^63~-16^64と16^64~16^63の範囲が表現できる。 これを下回ればアンダーフロー、上回ればオーバーフローとなる。 [編集] エクセス64で表現するまでの過程 1.5を単精度のエクセス64で表現するには、次のようになる。 1.5×16^0 仮数部は1以下でなければならないため、値をシフトする。 ただし、基数が16で、コンピュータの内部表現は2進数であるため、シフト量は4ビットである(2^4=16)。 加えて正規化し、その結果は次の通り。 0.09375×16^1 次に指数部をエクセス64で表現する。 ただし、負の指数を表すために64をバイアスしなければならない。 バイアスを行うと、0~127を表現できる指数が、-64~+63を表現できる指数になる(-64 + 64 = 0、63 + 64 = 127)。 よって、今回の例では以下のようになる。 0.09375×16^65 実際には2進数で表現されているので、2進数に直す。 符号部(1ビット):+→0 仮数部(24ビット):0.09375→000110000000000000000000 指数部(7ビット):65→1000001 浮動小数点数の並び順は 符号部 指数部 仮数部 であるため、 2進値:0 1000001 000110000000000000000000、16進値:41180000 -------------------------------------------------------------------------------------------------------------------------------- あまりこの手の知識がありませんでしたので、正確な質問をすることができずご迷惑をおかけしました 原理は理解することができましたのでこれをもとに自分で書いてみようと思います ありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • バイナリから実数を取得したいのですが・・・

    C++にてバイナリデータから倍精度の浮動小数を取得したいと考えています。 バイナリの中にリトルエンディアン形式で倍精度の浮動小数が64ビット幅に収められています。 これをdouble型の変数に代入したいのですが、どうすれば(できれば簡単な方法で)値を代入できるでしょうか? ご教授お願いします。 データのサンプルを念のために記載させて頂きます。 B2 9C 05 DA 7D 40 6C 3F -> 3.448720745086919e-3

  • VB2005で単精度実数を変換するには?

    VB2005で単精度実数を変換するには? 三菱のシーケンサとパソコンをEther通信させてパソコンでPLCデバイスを読み取り表示するアプリを VB2005で作成中です。 今、行き詰っているのが2WORD(単精度実数)デバイスを取り込んで数値に変換する所です。 PLCからは例えばD0000デバイスに数値の1.1が入っている場合は下記のようになります。 D0000 : (CCCD)h D0001 : (3F8C)h ↑単精度実数の1.1です。 "CCCD" "3F8C" を1.1に変換するにはどのような処理を行えば良いでしょうか? おわかりの方、すみませんがよろしくお願いします。

  • 等比数列 3つの実数を求める問題

    簡単なことかもしれませんが、質問させていただきます。 「等比数列をなす3つの実数があり、それらの和が19、積が216である。これら3つの実数を求めよ。」という問題なのですが、私はまず初項をa、公比をrとおいて、a+ar+ar^2=19、a*ar*ar^2=216を連立させて解きました。 ところが、友人の回答を見てみると、3つの実数をa、b、cとおいて、b^2=a*c、a+b+c=19、abc=216を連立して解いていました。 答え自体は同じだったのですが、おそらく私の方が間違っていると思います。3つの実数は必ずしも初項から第3項までの数ではないから、ダメだと私は思ったのですが・・・どうなんでしょうか、教えてください。

  • 実数

    (ア) すべての実数xに対して (x^2 +x+a)^2 -(bx+c)^2=x^4 +2x^3 -11x^2 -28x-12が成り立つとき、a,b,cを求める。 ただしa,b,cは有理数とする 答a=2,b=±4,c=±4 (イ) x^4 +2x^3 -11x^2 -28x-12=0を解く 答x=-2、-3、(3±√17)/2 よろしくおねがいします この問題は恒等式を利用するそうですが、いろいろと試したのですが計算をすればするほど複雑な式になってどんどんわからなくなってしまいました。 おねがいします

  • 実数型の変数に値を入力した計算結果がおかしくなる理由

    こんばんは。 以下のプログラムで値がおかしくなる理由、改善方法を教えて頂けませんでしょうか。 double a,b,c; scanf("%f",&a); scanf("%f",&b); c = a + b; printf("%f",c); これを実行すると、正しい値が出力されません。 int型で宣言し、整数表示の%dに変更すると問題なく値が出力されます。 また、予めdouble型で宣言した変数a,bに実数の初期値(8.5等)を格納しておくと正しい値が出力されます。 どなたかご回答よろしくお願い致します。

  • 実数解

    3つの2次方程式は少なくとも1つは実数解を持つことを示す問題です。 だたし、a,b,cは実数とします。 (x^2)+3ax+2b-1=0 …(1) (x^2)+2bx+2c-1=0 …(2) (x^2)+2cx+2a-1=0 …(3) (1)の判別式は D/4=(a^2)-2b+1 (2)の判別式は D/4=(b^2)-2c+1 (3)の判別式は D/4=(c^2)-2a+1 となりましたがどのようにして少なくとも1つは実数解ということを探すのでしょうか?

  • 文字の変換 (アルファベット)

    文字の変換について教えてください 10進数の1は16進数で1、10はAになります。 ではアルファベットはどうなるんでしょうか? 以下の変換であっているでしょうか? a = c1 b = c2 c = c3 d = c4 e = c5 f = c6 g = c7 h = c8 i = c9 j = d1 k = d2 l = d3 m = d4 n = d5 o = d6 p = d7 q = d8 r = d9 s = e1 t = e2 u = e3 v = e4 w = e5 x = e6 y = e7 z = e8 上記の変換が16進数かどうかもわかりませんが、教えてください。 よろしくお願いします。

  • Perlのデータ変換

    Perlでデータの変換で方法がわからず、悩んでおります。 $moji_1 = "A5A2A5B9A5D9A5B9A5C8"; ↑ ↓ @moji_2 = (0xA5, 0xA2, 0xA5, 0xB9, 0xA5, 0xD9, 0xA5, 0xB9, 0xA5, 0xC8); それぞれを変換するスマートな(関数や1行程度)でできる方法が知りたいのですが わかりません。 packやunpack?を使えば、できるということでしょうか? perlの取得がなかなかできずに悩んでおります。 Cがポインタが理解できれば初級をクリアしたといわれますが、 Perlの場合は、何をクリアすれば、初心者をクリアしたとなりますか? 皆さんの意見が知りたいです。 初級 中級 上級 達人 仙人 創始者 Perlを作った人 . . .

    • ベストアンサー
    • Perl
  • データ移動処理

    0 0 1 0 0 1・・・ a b c d e f ・・・ a b c d e f ・・・ a b c d e f ・・・ 上図で一番上の行にある数字が1の場合だけの列を選択し、1の列全てをコピーをして 別シートへ移動して今度は、行で挿入をして貼り付けを行いたいと考えております。 しかし、データ量がものすごく多いので1だけがいくつあるのかさえわからないため 挿入先にも一体いくつ挿入すればいいかわかりません。 データ量(行が1の数)にあわせて挿入数をいれ、また列のデータから行のデータへの変換はどうすればいいかお力を貸していただけないでしょうか? 今回の質問はEXCELについてです。 そしてできればVBAのほうで処理を行いたいと思っております。 (原本のデータ編集が何度もされるのでVBAで登録しておこうかと^^;) よろしくお願いいたします。

  • Excel 割合(%)に一括変換

    クロス集計表で、現在、各セルに実数が入っています。 この実数を一括して全体合計の割合に変換する方法はないでしょうか? クロス集計のセルの数が多くて変換に困っています。 宜しくお願い致します。   A B C 1 1 2 3  2 4 5 6   3 7 8 9  X それぞれA1,B1,C1,A2…をXで割り%で各セルに表示を一括でしたいです。