From: rubikitch Date: 2000-09-27T07:25:09+09:00 Subject: [ruby-list:25193] Re: round method From: nobu.nakada@nifty.ne.jp Subject: [ruby-list:25181] Re: round method Date: Tue, 26 Sep 2000 19:35:47 +0900 るびきちです。 > > $ ruby -e 'printf "%10.20f\n", (500.5)' > > 500.50000000000000000000 > > $ ruby -e 'printf "%10.20f\n", (500*1.001)' の方は、 > > 500.49999999999994315658 となりましたが、これは、プログラム言語全般に > > 言える事なんでしょーか? > > デジタル式コンピュータでの浮動小数点全般でしょう。十進表現で > ない限り。 IEEE754の浮動小数点数の性質。 1.001が2進浮動小数点数では((*正確に表せない*))ことが起因。 すなわち 1.001 自身に誤差が含まれている。 1.001 ---*----+--------*-------- ^ | ^ +----+ この図において * が浮動小数点数で正確に表せる数だとすると 1.001 はこんな状況のはず。 だからそれに近い方(この場合では小さい方)に丸められる。 よって実際には 500*(1.001よりわずかに小さい数) の計算が行われているため、結果は 500.5 よりわずかに小さくなる。 るびきち☆ http://i.am/rubikitch