2 つの Fixnum の符号だけを比較したい。現在、私は使用しています:
c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)
次のようなものが欲しいです:
c = -c if a.sign != b.sign
あるいは、符号のみを比較する別の方法かもしれません。
2 つの Fixnum の符号だけを比較したい。現在、私は使用しています:
c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)
次のようなものが欲しいです:
c = -c if a.sign != b.sign
あるいは、符号のみを比較する別の方法かもしれません。
たぶんただの掛け算:
c = -c if a*b < 0
" "a >= 0
と同様の目的で、正 (非負) および負の場合に使用できます。a.sign
true
false
c = -c if (a>=0) != (b>=0)
頻繁に使用していて、より Ruby 風の感じが必要な場合は、上記のコメントを参考にして、これにパッチを適用する価値があるNumeric#pos?
かもしれません。
この質問により、私は何年も開いていなかったアセンブラツールボックスを探し始めました。私はこれがあなたが探していることをするだろうと思います:
c = -c if (a < 0) ^ (b < 0)
これが何をしているのかです:
irb(main):006:0> true ^ true => false irb(main):007:0> true ^ false =>真 irb(main):008:0> false ^ true =>真 irb(main):009:0> false ^ false => false
コードによっては、別の方法として、3項ステートメントで使用することもできます。
((a < 0) ^ (b < 0)) ? -c : c
ベンチマークコードと結果は次のとおりです。
require 'benchmark'
puts `ruby -v`
N = 10_000_000
A = 1
B = 1
Benchmark.bm(5) do |bench|
bench.report('^') { N.times { (A < 0) ^ (B < 0) } }
bench.report('!=') { N.times { (A>=0) != (B>=0) } }
bench.report('<') { N.times { A*B < 0 } }
end
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-darwin12.2.0]
user system total real
^ 5.740000 0.000000 5.740000 ( 5.743873)
!= 4.300000 0.000000 4.300000 ( 4.304685)
< 3.310000 0.000000 3.310000 ( 3.312378)
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin12.2.0]
user system total real
^ 1.480000 0.000000 1.480000 ( 1.484879)
!= 1.400000 0.000000 1.400000 ( 1.401381)
< 1.260000 0.000000 1.260000 ( 1.256628)
これは、ヒープo'ループである10Mループの場合です。それはsteenslagFTWのように見えます!