• 締切済み

[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