From: "H.Holon" Date: 2008-05-09T19:19:03+09:00 Subject: [ruby-dev:34623] Marshal.load( Marshal.dump( Float ) )の不一致@1.8 H.Holonです。 ruby1.8において、以下の「Marshalで dumpして loadして戻す」 codeで不一致を意味するいくつかの数値が表示されます。 $ cat ~/tmp/test.rb srand(1) 1000000.times do f = rand(0) fm = Marshal.dump(f) if Marshal.load(fm) != f then p fm, f end end $ ./ruby ~/tmp/test.rb "\004\bf\e2.2971038112107323e-05" 2.29710381121073e-05 "\004\bf\e0.00012889203743071675" 0.000128892037430717 "\004\bf\e1.2080800923408574e-05" 1.20808009234086e-05 "\004\bf\e0.00016731992938723295" 0.000167319929387233 "\004\bf\e0.00015761288904592163" 0.000157612889045922 "\004\bf\0320.0017032264342446979" 0.0017032264342447 "\004\bf\e0.91493880848429388\000\377\377" 0.914938808484294 "\004\bf\0270.1635388066770247" 0.163538806677025 "\004\bf\0320.0018947760614906883" 0.00189477606149069 "\004\bf\0310.015573558744790716" 0.0155735587447907 ruby1.9においては手近で試した範囲では問題ありません (何も表示されません)。  試しに Marshal文字列を stdlibの strtod() で小数に戻して みたところ、誤差のない元の数値に戻りましたので、1.8 の現行の ruby_strtod()の精度不足だと思います。  1.9の ruby_strtod()は別物になっているようですので 1.8のみの症状なのはそこが理由なのだと思います。 # backportは一瞬考えたのですが、1.9の ruby_strtod()は # 一見さんの私には厳しいので、defineまわりの意味を # 理解している方にお願いします… ---- H.Holon [ ラーダっぽい黒75の家 | http://radastery.jp/ ]