Tuesday, October 14, 2008

(4)Ruby中的数字计算

Ruby定义了+,-,*,/符号,用于加减乘除操作。如果一个整数计算结果大于Fixnum类型,那么会自动转换为Bignum类型,因为对于Bignum的大小是没有限制的,这意味着你的整数计算永远不会出现溢出的情况。对于浮点类型的计算会根据你硬件平台的允许范围。
除法操作的执行依赖于你使用的是那种类型的数字,如果使用的是整数那么就执行整数除法,如果是浮点数,就执行浮点型除法,他们的计算结果类型也是不一样的:
x = 5/2     # 结果为2
y = 5.0/2 # 结果为2.5
z = 5/2.0 # 结果为2.5


如果整数除以0,会得到一个ZeroDivisionError 异常,如果浮点数除以0不会抛出异常;Ruby会返回一个Infinity(无限大的值)。
0.0/0.0的操作是非常特殊的,他返回另一个特殊的浮点值NaN或者Not-a-Number。
%操作符用于求余数:
x = 5%2     # 结果为1

%操作符同样可以用于浮点数,尽管这部常用,但是它返回的也是一个除法的余数:
x = 1.5%0.4   # 结果为0.3

值得注意的一点是如果出发的两边有任意一个为负数,那么他的计算结果与其他语言比如C++,Java是不同的,Ruby会对除法的结果取小数点后最接近x轴左边的一个值,但是如果你把两个正数放在括号中,在括号外加一个符号那就没关系了,比如:
puts -7/3  #返回-3
puts 7/-3 #返回-3
puts -(7/3)#返回-2.3333

同样的求余数的方法也有所不同,-7%3的结果是2,而不像其他语言那样结果为-1。
Ruby还引入了Fortan语言中的求幂运算符**:


x**4 # 等同于 x*x*x*x
x**-1 # 等同于 1/x
x**(1/3.0) # 求 x 的立方根
x**(1/4) # 啊!括号中的整数除法返回值为0,所以这个结果总是1
x**(1.0/4.0) # 求x的四次方根

当一个表达式中存在多个幂运算的话,计算顺序是从右到左的,比如:
4**3**2 等同于 4**9, 而不是 64**2.
记住,幂运算的返回结果是很大的值,如果是整数的幂运算这不会有什么问题,因为整数的结果是没有限制的,但是如果是浮点数那么9.9**1000 的返回值超出了浮点数允许的最大范围,你会得到一个infinity。
最后提到的一点是Ruby中也支持对整数的位运算符,~, &, |, ^, >>, 和<<,用法与Java和C++中的一样。

No comments: