Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Ruby中Fixnums的符号_Ruby - Fatal编程技术网

比较Ruby中Fixnums的符号

比较Ruby中Fixnums的符号,ruby,Ruby,我只想比较两个固定点的符号。现在我正在使用: c = -c if (a >= 0.0 && b < 0.0) || (a < 0.0 && b >= 0.0) 或者,也可以通过其他方式仅比较符号。您可以使用a>=0来实现与“a.sign”类似的目的,使用true表示阳性(非阴性),使用false表示阴性: c = -c if (a>=0) != (b>=0) 如果您经常使用它,并且想要一种更像红宝石的感觉,那么您可能值得使用

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

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

或者,也可以通过其他方式仅比较符号。

您可以使用
a>=0
来实现与“
a.sign
”类似的目的,使用
true
表示阳性(非阴性),使用
false
表示阴性:

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

如果您经常使用它,并且想要一种更像红宝石的感觉,那么您可能值得使用上面的注释并将其修补,例如
Numeric#pos?

您可以将
a>=0
用于与“
a.sign
”类似的用途,而
true
表示正(非负)和
false
表示否定:

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

如果您经常使用它,并且想要更具Ruby风格的感觉,那么您可能值得使用上面的注释并将其修补,例如
Numeric#pos?
可能。

可能只是乘法:

c = -c if a*b < 0
c=-c如果a*b<0

也许只是乘法:

c = -c if a*b < 0
c=-c如果a*b<0

这个问题让我开始在我多年没有打开的汇编工具箱中寻找答案。我想这会满足你的要求:

c = -c if (a < 0) ^ (b < 0)
c=-c如果(a<0)^(b<0)
下面是它正在做的事情:

irb(main):006:0> true ^ true => false irb(main):007:0> true ^ false => true irb(main):008:0> false ^ true => true irb(main):009:0> false ^ false => false irb(主):006:0>true^true =>错误 irb(主):007:0>正确^false =>正确 irb(主):008:0>错误^true =>正确 irb(主):009:0>错误^false =>错误 根据您的代码,另一种方法是在三元语句中使用它:

((a < 0) ^ (b < 0)) ? -c : c
((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)
需要“基准测试”
把` ruby-v`
N=10_000_000
A=1
B=1
基准。bm(5)do |台架|
报告('^'){N.times{(A<0)^(B<0)}
bench.report(“!=”){N.times{(A>=0)!=(B>=0)}

bench.report(“这个问题让我开始在我多年没有打开的汇编工具箱中寻找答案。我想这会满足您的需求:

c = -c if (a < 0) ^ (b < 0)
c=-c如果(a<0)^(b<0)
下面是它正在做的事情:

irb(main):006:0> true ^ true => false irb(main):007:0> true ^ false => true irb(main):008:0> false ^ true => true irb(main):009:0> false ^ false => false irb(主):006:0>true^true =>错误 irb(主):007:0>正确^false =>正确 irb(主):008:0>错误^true =>正确 irb(主):009:0>错误^false =>错误 根据您的代码,另一种方法是在三元语句中使用它:

((a < 0) ^ (b < 0)) ? -c : c
((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)
需要“基准测试”
把` ruby-v`
N=10_000_000
A=1
B=1
基准。bm(5)do |台架|
报告('^'){N.times{(A<0)^(B<0)}
bench.report(“!=”){N.times{(A>=0)!=(B>=0)}


bench.report('如果它很重要,我可能会把它补上;只有AFAIK的BigNum有一个
符号
方法。什么是
c
?什么是
a
b
?最重要的是,你的问题是什么?@sawa-我试图找到最短、最优雅的方法来执行条件运算(就像翻转数字上的符号:
c=-c
)当a(一个有符号的Fixnum)与b(另一个有符号的Fixnum)具有相反的符号时因此,如果a=-34和b=7,那么c将=-c。如果这很重要,我可能会把它补上;只有AFAIK BigNum才有一个
符号
方法。什么是
c
?什么是
a
b
?最重要的是,你的问题是什么?@sawa-我正在试图找到执行条件运算的最短、最优雅的方法(就像翻转数字上的符号:
c=-c
)当a(一个有符号的Fixnum)与b(另一个有符号的Fixnum)有相反的符号时。因此,如果a=-34和b=7,那么c将=-c。比较布尔值不是个坏主意。谢谢。我相信:
c=-c如果(是的,这取决于你想成为哪一个
true
。比较布尔值不是一个坏主意。谢谢。我相信:
c=-c如果(是的,这取决于你想成为哪一个
true
。谢谢。这是一个很好的、简短的解决方案。我将以
c=-c如果为基准测试它。)(aI想知道哪一个会更快,除非你称之为多(百万)次,没关系。主要的是使用对你来说更容易或更清晰的方法。我用它来切换音频滤波器的振幅。所以,事实上,我会多次调用它。谢谢。这是一个很好的、简短的解决方案。如果(aI想知道哪一个会更快,除非你称之为多(百万)几次都没关系。主要的是用哪一个对你来说更容易或更清晰。我用它来切换音频滤波器的振幅。所以,事实上,我会无数次地叫它。哇。太好了!非常感谢你!我还没有足够的“声誉”来支持投票。哇…ruby 2.0很快!我不认为有什么优势任何阻止我使用它的东西。谢谢你,铁皮人。10000000个循环是3:28秒的音频。你看,循环建立得很快!哇。太好了!非常感谢!我还没有足够的“声誉”去投票。哇…ruby 2.0很快!我认为没有任何东西阻止我使用它。谢谢你,铁皮人。10,000000循环是3:28秒的音频。所以你看,循环建立得很快!