我想比較兩個Fixnums的符號。現在我使用:比較Ruby中的Fixnums的符號
c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)
我想是這樣的:
c = -c if a.sign != b.sign
或者也許只是比較跡象的其他方式。
我想比較兩個Fixnums的符號。現在我使用:比較Ruby中的Fixnums的符號
c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)
我想是這樣的:
c = -c if a.sign != b.sign
或者也許只是比較跡象的其他方式。
你可以使用a >= 0
類似用途爲「a.sign
」,與true
正(非負)和false
負:
c = -c if (a>=0) != (b>=0)
如果你經常使用它,你想更多的Ruby風格的感覺,這可能是值得的,你可以隨着上面的評論去修補它,就像Numeric#pos?
也許。
比較布爾值不是一個壞主意。 – tadman 2013-03-12 17:29:59
謝謝。我相信:'c = -c if(a <0)!=(b <0)'也可以。 – 2013-03-12 17:36:15
是的,這取決於你想成爲「真實」的人。 – iamnotmaynard 2013-03-12 18:07:19
也許只是乘法:
c = -c if a*b < 0
謝謝。這是一個不錯的簡短解決方案。如果(a <0)!=(b <0)'上面的建議,我將以'c = -c'爲基準。 – 2013-03-12 17:39:20
我想知道哪一個會更快,但除非你稱它爲數百萬次,否則無關緊要。最主要的是使用哪一個更容易或更清晰。 – iamnotmaynard 2013-03-12 18:06:25
我正在使用它來切換音頻濾波器的振幅。所以,事實上,我會稱之爲數百萬次。 – 2013-03-13 02:43:46
這個問題讓我開始在我的彙編工具箱,裏面我還沒有開放多年亂翻。我認爲這會做你要找的內容:
c = -c if (a < 0)^(b < 0)
下面是它在做什麼:
3210根據您的代碼,另一種方法是使用它可以在一個三元聲明:
((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)
這與10M循環,這是一個堆o'循環。看起來像是steenslag FTW!
哇。那好美麗!非常感謝!我沒有足夠的「名聲」甚至還沒有投票。哇...... ruby 2.0速度很快!我不認爲有什麼阻止我使用它。謝謝你,田滿。 10,000,000循環是3:28秒的音頻。所以你看,這些循環建立得很快! – 2013-03-13 07:19:09
如果這很重要,我可能只是修補它;只有AFAIK BigNum有一個'sign'方法。 – 2013-03-12 17:28:19
'c'是什麼?什麼是'a','b'?最重要的是,**你的問題是什麼?** – sawa 2013-03-12 17:31:18
@sawa - 我試圖找到最短,最優雅的方式來執行條件操作(如翻轉數字的符號:'c = -c') (簽名的Fixnum)與b(另一個簽名的Fixnum)的符號相反。所以如果a = -34和b = 7那麼c會= -c。 – 2013-03-12 17:43:23