From: Nobuyoshi Nakada Date: 2010-11-20T12:00:30+09:00 Subject: [ruby-list:47641] Re: RandomFloat をリリースしました なかだです。 At Fri, 19 Nov 2010 14:41:12 +0900, KISHIMOTO, Makoto wrote in [ruby-list:47640]: > プラットフォームの浮動小数点形式が IEEE754 かどうかのチェックについては > うまい方法がないようで、autoconf のマニュアル様によれば、 > http://www.gnu.org/software/hello/manual/autoconf/Floating-Point-Portability.html > いまどき IEEE754 は十分にポータブルだ、とのご託宣があったので、 > 簡単に、適当な数の表現が IEEE754 と一致するかどうかを見る、ということだけ > やっています。 Math.frexpとMath.ldexpを使えばポータブルに可能なはずです。 class RandomFloat DIG = Float::MANT_DIG-1 MAX_BIT = 1 << DIG DIG_MASK = MAX_BIT - 1 def self.dbl2repr dbl f, e = Math.frexp(dbl) f = (f.abs * 2) - 1 e += Float::MAX_EXP - 2 e = (e << DIG) + Math.ldexp(f, DIG).to_i if 1.0/dbl < 0 return -e - 1 else return e end end def self.repr2dbl repr if repr < 0 then neg = true repr = -(repr + 1) end e = (repr >> DIG) - Float::MAX_EXP - DIG + 1 f = (repr & DIG_MASK) + MAX_BIT f = Math.ldexp(f, e) f = -f if neg f end end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦