2

2つの式の同等性をテストするクラスのインスタンスを初期化しています。

数式の計算値は実際には次のようになります。

RubyChem::Chemical.new("SOOS").fw
=> 96.0

RubyChem::Chemical.new("OSSO").fw
= 96.0

これら2つのインスタンスの同等性を確認するために新しいクラスを作成したとき、結果に少し驚いています。

x = RubyChem::BalanceChem.new("SOOS","OSSO")
x.balanced
=>false

y = RubyChem::BalanceChem.new("SOOS","SOOS")
y.balanced
=> true

RubyChem::BalanceChem初期化メソッドは次のとおりです。

def initialize(formula1, formula2)
  @balanced = RubyChem::Chemical.new(formula1).fw == RubyChem::Chemical.new(formula2).fw
end

なぜrubyはformula1とformula2のfw値をフェッチして、それらの値が等しいかどうかをチェックしないのですか?Rubyでの操作の順序は何ですか?Rubyは何をしていますか?この問題についての理解が不足していることがわかります。どうすればこれを機能させることができますか?前もって感謝します。

4

3 に答える 3

4

Ruby 1.8 にはfloat を string に変換する際のバグがあります。指定された文字列が float を適切に表現していないことがあります。を使用した例を次に示し0.56ます。

0.5600000000000005.to_s == 0.56.to_s  #=> true
# should have returned false, since:
0.5600000000000005      == 0.56       #=> false

これは、2 つの一見同一の結果が実際には同一ではない理由を説明しています。

おそらく、特定の誤差範囲内で比較を行うか、比較を行う前に丸めを行うか、またはのような正確な型を使用するBigDecimal必要がありRationalます。

于 2010-07-28T20:34:31.620 に答える
3

おそらく、浮動小数点数が等しいかどうかをチェックしたくないでしょう。代わりに、デルタを比較する必要があります。

irbでこれを試してください:

x = 1.000001
y = 1.0
x == y
(x-y).abs < 0.00001

したがって、浮動小数点演算の変動を処理できると思われる 0.00001 のようなデルタを見つけ、そのように使用します。==絶対に浮いてはいけません。

于 2010-07-28T17:35:00.820 に答える
2

これは、浮動小数点の精度によって引き起こされる別の問題である可能性があります。

これらの値は、等値が評価される前に計算されることを保証できます。

Ruby の演算子の優先順位を確認する

于 2010-07-28T17:20:23.600 に答える