7

ruby で 0.0001 から 1 までを 0.0001 刻みで数えたい。このコードを書いたのですが、無限ループに入ります。どういうわけか、インタープリターは間違った合計を行います。

x = 0.0001
while x != 1.0
  puts x
  x = x + 0.0001
end

これが与える最初の10個の値は次のとおりです。

0.0001
0.0002
0.00030000000000000003
0.0004
0.0005
0.0006000000000000001
0.0007000000000000001
0.0008000000000000001
0.0009000000000000002
0.0010000000000000002

0.0001、0.0002、0.0003 などである必要があります。どうすれば動作させることができますか? ありがとう!

4

6 に答える 6

16

これを試して:

0.0001.step(1, 0.0001).each { |i| puts i }

EDIT : Float#stepfloat 演算の奇妙さからあなたを守るため、このメソッドを使用する必要があります。Float#step値をインクリメントし、フロートプルーフの方法で制限と比較します。詳細については、 の公式ドキュメントをFloat#step参照してください。

于 2011-12-16T14:37:54.500 に答える
2

問題は、Ruby の実数がバイナリ ストレージと操作のために正確に表現されないことです。私はこれをするだろう

x = 1
while x < 10000
    puts (x/10000).round(4)
    x += 1
end
于 2011-12-16T14:38:11.337 に答える
1

ではなくx != 1.0、入れてx < 1.0ください。これにより、少なくともループが確実に終了します。

現代のすべてのコンピューターを実行するような 2 進数システムは、分数、特に 10 進数で正確に表現できない分数を (簡単に) 表すことができません。あるはずの奇妙な数字がそこにあるのです.0003。これは、数値が内部でどのように表現されているかの成果物です。

一部の言語は他の言語よりも数値と精度の処理に優れているため、数値の精度が重要な場合は、別の言語を使用するか、数値を処理するライブラリを使用する必要があります (有効数字など)。各ステップで適切な丸めなどを使用して自分で処理する必要があります。

于 2011-12-16T14:34:49.850 に答える
0

表示されているのは、浮動小数点数のバイナリ表現によるものです。これは、すべてのコンピューター プログラミング言語に影響します。詳細については、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。

あなたができることは、印刷時に適切な桁数に丸めるか、goieleが見つけたように、次を使用することstepです:

0.0001.step(1, 0.0001).each do |i|
  puts i
end
于 2011-12-16T14:48:24.177 に答える
0
1.step(10000, 1).each { |x| puts "%f" % (x / 10000.0).round(4) }
于 2011-12-16T15:06:19.993 に答える
0

浮動小数点数は厳密には正確ではありませんWikipedia 浮動小数点の記事.

きれいな x が必要な場合は、値を使用する前に整数を使用して 1000 で割ることをお勧めします。少しのノイズを気にしない場合は、 while x != 1.0 を while x < 1.0 に変更しても問題ありません。

于 2011-12-16T14:39:01.363 に答える