ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Programming Ruby (11) 숫자
    Ruby 2016. 10. 27. 11:55
    [출처] Programming Ruby 

    (본 게시물은 저작권의 문제 발생시 출판사의 요청에 의해 삭제될 수 있습니다.)


    숫자


    루비는 정수(integer), 부동소수점(floating-point), 유리수(rational), 복소수(complex number)를 지원한다. 특정 범위의 정수( -2^30~2^30-1, -2^62~2^62-1)는 Fixnum 클래스의 객체로 내부적으로는 이진 형태로 저장된다. 이 범위를 넘어서는 정수는 Bignum 객체로 저장된다(현재는 작은 정수의 가변 길이 집합으로 구현되어 있다.)

    이러한 과정은 투명하게 진행되는데, 루비가 양방향으로 변환을 자동으로 해 주기 때문이다.


    num = 10001

    4.times do

         puts "#{num.class}: #{num}"

    num *= num

    end


    실행결과

    Fixnum: 10001

    Fixnum: 100020001

    Fixnum: 10004000600040001

    Bignum: 100080028005600700056002800080001



    부호를 붙이거나 진법을 나타내는 특정 문자를 사용할 수도 있다.(8진수는 0, 10진시는 0d(기본값), 16진수는 0x, 2진수는 0b를 사용한다) 정수 중간에 쓰인 밑줄은 무시한다.


    123456     => 123456 # Fixnum

    0d123456 => 123456 # Fixnum

    123_456   => 123456 # Fixnum _ 밑줄 무시

    -543          => -543     # Fixnum - 음수

    0xaabb     => 43707   # Fixnum - 16진수

    0377         => 255      #  Fixnum - 8진수

    -0b10_1010    => -42   # Fixnum - 2진수(음수)

    123_456_789_123_456_789 -> 123456789123456789 # Bignum



    소수점과 지수가 이어지는 숫자 리터럴은 운영 체제 고유의 double 타입에 상응하는 Float 객체로 변환된다. 소수점 앞뒤는 반드시 숫자여야 한다. 예를 들어 1.0e3을 1.e3이라고 쓰면 루비는 객체 1의 e3 메서드를 호출하려고 한다.

    루비는 유리수와 복소수를 지원한다. 


    모든 숫자는 객체이므로 다양한 메시지를 처리할 수 있다. C++에서는 절댓값을 구하기 위해 abs(num)이라고 쓰지만 루비에서는 num.abs 라고 쓰면 된다. 루비에서는 숫자를 포함한 문자열이 자동으로 숫자 타입으로 변환되지 않는다.


    some_file.each do | line |

         v1, v2 = line.split

         print Integer(v1) + Integer(v2), " "

    end


    실행결과

    7 11 15




    숫자는 어떻게 상호 작용하는가


    같은 클래스의 서로 다른 숫자에 대해 특정한 연산을 수행한다면 그 결과는 원래 클래스의 객체가 된다 (단 Fixnum과 Bignum에 대해서는 필요에 따라 변환이 일어난다). 계산의 대상이 되는 두 숫자가 서로 다른 클래스라면 좀 더 일반적인 클래스로 숫자가 변환될 것이다. 예를들어 정수와 부동소수점을 같이 계산하면 결과는 부동소수점이 되고, 부동소수점과 복소수를 계산하면 그 결과는 복소수가 된다.


    1 + 2           # => 3

    1 + 2.0        # => 3.0

    1.0 + Complex(1,2)     # => (2.0+2i)

    1 + Rational(2,3)         # => (5/3)

    1.0 +Rational(2,3)     #=> 1.66666666666666665


    반환값 규칙은 나눗셈에도 적용된다. 하지만 이 규칙에 따라서 정수를 정수른 나눈 값도 정수가 되므로 햇갈릴 수 있다.

     

    1.0 / 2 # => 0.5

    1 / 2.0 # => 0.5

    1 / 2    # => 0 


    정수간 간의 나눗셈이 분수(Rational 값)를 반환해야 한다면 mathn 라이브러리가 필요하다. 이 라이브러리를 통해 숫자 계산이 자연스러운 클래스로 자동 선택된다. 


    22 / 7           # => 3

    Complex::I * Complesx::I      # => (-1+0i)


    require 'mathn

    22 / 7           # => (22/7)

    Complex::I * Complex::I      # => -1




    숫자를 사용한 반복


    정수는 몇 가지 유용한 반복자를 지원한다. times, upto, downto 등등.. Numeric 클래스는 이에 대한 더 추상적인 형태의 step 을 지원하는데, 이는 전통적인 반복문과 비슷하다.


    3.times     { print "x "}

    1.upto(5)     { | i | print i, " " }

    99.downto(95)     { | i | print i, " " }

    50.step(80,5)     { | i | print i, " " }


    실행결과


    x x x 1 2 3 4 5 99 98 97 96 95 50 55 60 65 70 75 80 



    다른 반복자들과 마찬가지로 앞의 반복자들도 호출할 때 블록을 넘기지 않으면 Enumerator 객체를 반환한다.


    10.downto(7).with_index { | num, index | puts " #{index}: #{num} " }


    실행결과

    0: 10

    1: 9

    2: 8

    3: 7

     



    끄읕


    'Ruby ' 카테고리의 다른 글

    What is Ruby Proc??  (0) 2016.10.29
    Programming Ruby (13) 메서드 파헤치기  (0) 2016.10.28
    Programming Ruby(12) 문자열  (0) 2016.10.26
    루비 HTTP POST Request 나를 미치게 하다.  (0) 2016.10.26
    Programming Ruby (10) 모듈  (0) 2016.10.25
Designed by Tistory.