[ruby-list:49851] Re: ruby でfloat(32bit浮動小数点)の数値をHEX表示する手法は?
From:
junichirou tahara <taharajunichirou@...>
Date:
2014-06-23 13:45:55 UTC
List:
ruby-list #49851
横塚様
jxtaharaです.
ありがとうございます.有効桁数ですよね.
説明書き方が足りませんでした.
やはり実際には,最後の出力のところで,有効桁数以下は切り捨てる処理が必要ですね,
有効桁数が7桁なので,整数部1,小数点以下6のフォーマットにしました.
これならばゴミも出ず.
ありがとうございました.
コード
x=0.00001234567
s=[x].pack("f")
sss=sprintf("%02X%02X%02x%02X\n", s[0].ord,s[1].ord,s[2].ord,s[3].ord)
p sss
dmy=[sss].pack("H*").unpack("f")
fval= dmy[0]
p fval
printf('%1.6e',fval)
2014年6月23日 22:09 Daisuke Yokotsuka <yokots_d@c3-net.ne.jp>:
> 横塚です。
>
> えーっと、老婆心ながら・・・
> 7桁目までではなく、有効数字の7桁ですので、お間違えないように。
>
> 例えば
> 0.00123456789
> の場合、7桁目の4ではなく、有効数字7桁目の7まで信用できます。
>
> また
> p [sss].pack("H*").unpack("f")
> というコードの場合、あまり小さい数字や大きい数字は表示が通常の10進表記でなく
> 浮動小数点表記になるので、ご注意下さい。
>
> x=0.00001234567
> s=[x].pack("f")
> sss=sprintf("%02X%02X%02x%02X\n", s[0].ord,s[1].ord,s[2].ord,s[3].ord)
> p sss
> p [sss].pack("H*").unpack("f")
>
> の実行結果は
> "40204f37\n"
> [1.2345670256763697e-05]
> となります。
> (処理系は1.9.3p545です)
>
>
>
> <CADN2eS7u+TH4diq65Ww6f9zxUaTgmrMUj0O5_EqvQABoVdH-xA@mail.gmail.com> の、
> "[ruby-list:49849] Re:ruby でfloat(32bit浮動小数点)の数値をHEX表示する手法は?" において、
> "junichirou tahara <taharajunichirou@gmail.com>"さんは書きました:
>
> >
> > 横塚様
> > jxtaharaです.
> >
> > ご説明ありがとうございます.
> >
> > 7桁目まで有効とすることで処理します.
> > ありがとうございました.
> >
> >
> >
> > 2014年6月23日 19:00 Daisuke Yokotsuka <yokots_d@c3-net.ne.jp>:
> >
> > > 横塚です。
> > >
> > > 32ビットのfloatなので、精度はそんなものでしょう。
> > > 仮数部は23ビットなので、10進数で7桁分です。
> > >
> > > [3.140000104904175]
> > >
> > > ちゃんと7桁分は正しい数値になってます。
> > >
> > > <CADN2eS5rFj7eTY95Z0mFumqoGPvE=1Fv3furtBvCD58WGjFmOQ@mail.gmail.com>
> の、
> > > "[ruby-list:49845] Re:rubyでfloat(32bit浮動小数点)の数値をHEX表示する手法は?" において、
> > > "junichirou tahara <taharajunichirou@gmail.com>"さんは書きました:
> > >
> > > >
> > > > jxtaharaです.
> > > > ミスタイプしていました.
> > > > -3.14になっているので,負の数になることはありません.
> > > > すみませんでした.
> > > >
> > > > 正しいコード
> > > > x=3.14
> > > > s=[x].pack("f")
> > > > sss=sprintf("%02X%02X%02x%02X\n",
> s[0].ord,s[1].ord,s[2].ord,s[3].ord)
> > > > p sss
> > > >
> > > > p [sss].pack("H*").unpack("f")
> > > >
> > > > です.
> > > >
> > > > 結果です.
> > > > やはり誤差は出ますね.
> > > >
> > > > [3.140000104904175]
> > > >
> > > >
> > > > 2014年6月23日 16:51 junichirou tahara <taharajunichirou@gmail.com>:
> > > >
> > > > > jxtaharaです.
> > > > > float => HEXができましたが
> > > > > HEX => floatですと,問題が発生します.
> > > > >
> > > > > 1)バージョンによって結果が違います
> > > > > 2)丸め誤差が発生します
> > > > >
> > > > > 結果が,ruby 1.9.3だと結果が負になるのはどうなのでしょう?
> > > > >
> > > > > 対処方法はあるのでしょうか??
> > > > >
> > > > > コード
> > > > > x=-3.14
> > > > > s=[x].pack("f")
> > > > > sss=sprintf("%02X%02X%02x%02X\n",
> s[0].ord,s[1].ord,s[2].ord,s[3].ord)
> > > > > p sss
> > > > >
> > > > > p [sss].pack("H*").unpack("f")
> > > > >
> > > > > 結果
> > > > >
> > > > > *Jruby 1.6.6
> > > > > [3.14000010490417]
> > > > >
> > > > > *ruby 1.9.3p125 (2012-02-16) [i386-mswin32_100]
> > > > > [-3.140000104904175]
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > 2014年6月23日 9:57 junichirou tahara <taharajunichirou@gmail.com>:
> > > > >
> > > > > まつもと様,えぐち様
> > > > >> ありがとうございました.
> > > > >>
> > > > >> 無事できました.
> > > > >>
> > > > >> これで,32Gのデータの解析ができます.
> > > > >>
> > > > >>
> > > > >>
> > > > >> 2014-06-23 9:34 GMT+09:00 Nobuyoshi Nakada <nobu@ruby-lang.org>:
> > > > >>
> > > > >> (2014/06/23 9:29), EGUCHI Osamu wrote:
> > > > >>> > % ruby -ve 'p [3.14].pack("f").unpack("h*")'
> > > > >>> > ruby 2.0.0p353 (2013-11-22 revision 43784) [amd64-freebsd9]
> > > > >>> > ["3c5f8404"]
> > > > >>>
> > > > >>> hはlow nibble firstなのでHで。
> > > > >>>
> > > > >>> $ ruby -e 'p [3.14].pack("f").unpack("H*")'
> > > > >>> ["c3f54840"]
> > > > >>>
> > > > >>> --
> > > > >>> --- 僕の前にBugはない。
> > > > >>> --- 僕の後ろにBugはできる。
> > > > >>> 中田 伸悦
> > > > >>>
> > > > >>
> > > > >>
> > > > >
> > > >
> > >
> > > --
> > > Daisuke Yokotsuka
> > > yokots_d@c3-net.ne.jp
> > >
> >
>
> --
> Daisuke Yokotsuka
> yokots_d@c3-net.ne.jp
>