[ruby-list:49848] Re: ruby でfloat(32bit浮動小数点)の数値をHEX表示する手法は?
From:
Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>
Date:
2014-06-23 10:00:45 UTC
List:
ruby-list #49848
横塚です。
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