개발자 99% 커뮤니티에서 수다 떨어요!
💡 연습문제 16. 간단한 현실 점검. 다음 ‘불가능한’ 것들 중 무엇이 실제로 일어날 수 있는가?
1. 한 달이 28일보다 적은 것.
2. 시스템 콜의 오류메시지 : 현재 디렉터리에 접근할 수 없음.
3. C++에서, a = 2; b = 3; 하지만 (a + b)는 5가 아님.
4. 내각의 합이 180도가 아닌 삼각형.
5. 1분이 60초가 아님.
6. (a + 1) <= a
한 달이 28일보다 적은 것이 처음에는 불가능하다 생각했었다. 하지만 위키피디아에서 여러 형태의 역법을 찾아보니, 개정 이전의 율리우스력, 화성의 달리우스력 등 한 달이 28일보다 적은 역법이 존재했다. 한 달이 28일보다는 적지 않더라도, 자국의 표준을 지키는 고집하는 나라들이 꽤 존재한다는 것을 알 수 있었고, 여러 나라에 서비스를 제공해야 할 때 이 점을 고려해야 함을 알 수 있었다.
디렉터리에 대한 접근 권한이 없는 경우, 작업하는 동안 디렉토리가 외부 요인에 의해 삭제된 경우가 있을 수 있다.
a, b가 모두 unsigned라면, 두 숫자를 더한 값은 5가 될 것이다. 하지만 a, b가 3bit의 signed number라고 가정해보면, 결과값은 달라진다. a, b를 3bit의 binary로 표현해보면, 각각 010, 011이 되고, 이 둘을 더하면 101이 되는데, 이 값이 3bit의 signed number라면, 5가 아닌, -2^2 + 1 = -3이 된다.
평면에서 세 점을 서로 이어 삼각형을 만들면, 내각의 합이 180도가 되나, 곡면 위에 삼각형을 그리면, 내각의 합이 180도가 되지 않는다. 삼각형의 내각의 합이 180도라는 것은 유클리드 기하학에서만 들어맞는 말이다.
1분이 60초라는 것도 다들 당연하게 받아들이지만, 1분이 61초가 될 때도 있다. 현재 국제표준에 따르면, 세슘의 진동주기를 1초라고 정의했는데, 이를 기준으로 지구의 평균 자전주기를 계산하면, 24시간보다 0.002초 정도 느리다. 이 표준 시간과 실제 시간 사이의 차이가 계속 벌어지는 것을 막기 위해, 윤초라는 개념을 도입했고, 이로 인해 1분이 61초가 되는 때가 생겨났다.
우선, 처음 생각이 난 경우는 a가 숫자가 아닌 경우를 생각해봤다. 그리고 위에서도 이미 언급했는데, a가 signed number고, 거기에 1을 더했을 때, most significant bit가 1이 되는 경우, a+1은 음수가 되므로, a보다 작아진다. 또한, a가 unsigned number이더라도 overflow가 발생하면, a+1이 a보다 작아질 수 있는데, 표현 가능한 범위가 최대 w인데, a+1이 w+1의 값을 건드리면, 다시 0이 되므로, a보다 작아진다.
다양한 형태의 역법
https://ko.wikipedia.org/wiki/%EC%97%AD%EB%B2%95
http://www.allofsoftware.net/2015/06/15.html
signed number / unsigned number
https://bluerighter.tistory.com/7
내각의 합이 180도가 아닌 삼각형
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hjkamy&logNo=20129089178
1분이 61초가 될 수 있는 이유, 윤초에 관해 다룬 기사
http://www.korea-press.com/news/articleView.html?idxno=76641
overflow
https://infinitt.tistory.com/295
1752년 9월은 30일이 아니라 19일밖에 없다. 그레고리 교황의 달력 개혁의 일환으로 달력의 날짜를 맞추기 위해 이렇게 만들었다.
다른 프로세스가 디렉터리를 지웠을 수도 있고, 디렉터리를 읽을 권한이 없을 수도 있다. 드라이브가 마운트되지 않았을 수도 있고, 그 밖에 여러 가지 문제가 있을 수 있다. 어떤 상황인지 감이 왔으리라.
이 문제의 함정은 a와 b의 타입을 명시하지 않았다는 점이다. 연산자 오버로딩 때문에 +, =, !=가 예상과는 다르게 동작할 수 있다. 또 a와 b가 동일한 변수를 가리키고 있을 수도 있다. 그럴 경우 두 번째 할당문이 첫 번째 할당문에서 저장한 값을 덮어쓸 것이다. 또한 프로그램에 동시성이 있는 데 이에 대한 고려가 되지 않아서 a의 값이 덧셈이 수행되기 직전에 바뀌었을 수도 있다.
비유클리드 기하학에서 삼각형 내각의 합은 180°가 아닐 수 있다. 구 표면
에 그려진 삼각형을 생각해 보라.
윤초 때문에 61초일 수 있다.
언어에 따라서 숫자가 최대 숫자 한계를 넘어가는 바람에 a+1의 부
호가 음수로 바뀔 수도 있다.
이 문제에서 가정한 상황들이 틀릴 수도 있다는 전제 하에 이것저것 검색해보면서 문제의 답을 찾으려 시도했다. 당연하다 여기던 사실들이 당연하지 않을 수 있다는 걸 보여주는 멋진 문제라 생각하며, 이 문제를 보여주는 것만큼 단정(assertion)의 중요성을 잘 보여줄 수 있는 방법이 있을까하는 생각이 든다.
세상에는 내가 생각한 것보다 더 많은 변수가 존재하며, 이로 인해 생각한 것보다 훨씬 많은 이유로 프로그램이 오류를 일으킬 수 있음을 알 수 있게 해주는 문제였다. 많은 교훈을 주는 문제인 것 같아 예시에서 이 파트를 추가했다.