0

我只想比较两个 Fixnums 的符号。现在我正在使用:

c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0)

我想要类似的东西:

c = -c if a.sign != b.sign

或者也许只是比较符号的其他方式。

4

3 回答 3

3

也许只是乘法:

c = -c if a*b < 0
于 2013-03-12T17:33:03.443 回答
2

您可以使用与“ ”a >= 0类似的目的,用于正(非负)和负:a.signtruefalse

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

如果您经常使用它,并且想要一种更 Ruby 风格的感觉,那么可能值得您花点时间阅读上面的评论并对其进行修补,就像Numeric#pos?可能一样。

于 2013-03-12T17:29:32.607 回答
0

这个问题让我开始在我的汇编工具箱中四处寻找,我已经多年没有打开它了。我认为这会做你正在寻找的东西:

c = -c if (a < 0) ^ (b < 0)

这是它正在做的事情:

irb(main):006:0> 真 ^ 真
=> 假的
irb(main):007:0> 真 ^ 假
=> 真
irb(main):008:0> 假 ^ 真
=> 真
irb(main):009:0> 假 ^ 假
=> 假的

根据您的代码,另一种使用方法是在三元语句中使用它:

((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!

于 2013-03-13T06:19:30.477 回答