2013-03-12 57 views
0

我想比較兩個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 

或者也許只是比較跡象的其他方式。

+0

如果這很重要,我可能只是修補它;只有AFAIK BigNum有一個'sign'方法。 – 2013-03-12 17:28:19

+2

'c'是什麼?什麼是'a','b'?最重要的是,**你的問題是什麼?** – sawa 2013-03-12 17:31:18

+0

@sawa - 我試圖找到最短,最優雅的方式來執行條件操作(如翻轉數字的符號:'c = -c') (簽名的Fixnum)與b(另一個簽名的Fixnum)的符號相反。所以如果a = -34和b = 7那麼c會= -c。 – 2013-03-12 17:43:23

回答

2

你可以使用a >= 0類似用途爲「a.sign」,與true正(非負)和false負:

c = -c if (a>=0) != (b>=0) 

如果你經常使用它,你想更多的Ruby風格的感覺,這可能是值得的,你可以隨着上面的評論去修補它,就像Numeric#pos?也許。

+0

比較布爾值不是一個壞主意。 – tadman 2013-03-12 17:29:59

+0

謝謝。我相信:'c = -c if(a <0)!=(b <0)'也可以。 – 2013-03-12 17:36:15

+0

是的,這取決於你想成爲「真實」的人。 – iamnotmaynard 2013-03-12 18:07:19

3

也許只是乘法:

c = -c if a*b < 0 
+0

謝謝。這是一個不錯的簡短解決方案。如果(a <0)!=(b <0)'上面的建議,我將以'c = -c'爲基準。 – 2013-03-12 17:39:20

+0

我想知道哪一個會更快,但除非你稱它爲數百萬次,否則無關緊要。最主要的是使用哪一個更容易或更清晰。 – iamnotmaynard 2013-03-12 18:06:25

+0

我正在使用它來切換音頻濾波器的振幅。所以,事實上,我會稱之爲數百萬次。 – 2013-03-13 02:43:46

0

這個問題讓我開始在我的彙編工具箱,裏面我還沒有開放多年亂翻。我認爲這會做你要找的內容:

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!

+0

哇。那好美麗!非常感謝!我沒有足夠的「名聲」甚至還沒有投票。哇...... ruby​​ 2.0速度很快!我不認爲有什麼阻止我使用它。謝謝你,田滿。 10,000,000循環是3:28秒的音頻。所以你看,這些循環建立得很快! – 2013-03-13 07:19:09