Double
의 나머지 연산에는 %
연산자를 사용할 수 없다. Calculator 클래스에 사칙연산을 추가한 후 나머지 연산을 추가하려고 했더니, 다음과 같은 오류가 떴다.
'%' is unavailable: For floating point numbers use truncatingRemainder instead
해당 문구를 검색해보니, Double
타입의 데이터를 나머지 연산할 때는 truncatingRemainder
메소드를 사용해야 한다고 한다. 문득 Int
, Double
, String
등 또한 사전에 정의된 Class
라는 것을 강의에서 들은 게 떠올랐다. 그럼 truncatingRemainder
메소드도 결국엔 Double
이라는 Class
안에서 정의된 함수라는 것이다.
아래와 같이 바꿔주었다.
// 원본 코드
case "%" :
var result = number1 % number2
print("\(number1) % \(number2) = \(result)")
return result
// 수정한 코드
case "%" :
var result = number1.truncatingRemainder(dividingBy: number2)
print("\(number1) % \(number2) = \(result)")
return result
이 문제를 접하고 바로 떠오른 생각은, 컴퓨터가 다루는 소수점은 본질적으로 부정확할 수 있다는 한계점이 있다는 것이다. 이렇게 별도의 메소드로 처리해야 된다는 것은 그에 대한 반증인 것 같다. 이는 이전에 데이터 타입 공부를 할 때도 맞이한 개념이다.
부동 소수점 숫자의 특성
컴퓨터가 10진수 숫자를 이진수로 변환할 때 정확한 변환이 불가능한 경우가 많다.
이를 극복하는 계산기가 있지 않을까? 겉으로만 소수점을 보여주면서 실제로 계산기 안에서는 Int로만 계산한다던가.. 물론 Int 자체에도 표현할 수 있는 숫자에 한계가 있으니 그만큼 계산할 수 있는 범위가 줄어들겠지만.. 어떻게 쪼물딱하면 만들어질 것 같은데 그렇게 할 정도로 메리트가 있는지 잘 모르겠다. 어쨌거나 결국엔 이진수 컴퓨터이고, 그 컴퓨터의 본질을 어색한 틀에 끼워맞추는 느낌이라서.. 이러한 문제점에 대해서 분명 수많은 사람들이 고민했을테니 리서치하면 이것저것 나올 것 같긴 하다. 하지만 오늘은 여기까지..
어쩌면 멀지 않은 미래에 영어권 팀원들과 작업할 수도 있으니, 영어로 쓰는 걸 연습해보고 있다. ..쉽지 않다. 쉽지 않으니 계속 노력해보자!