Python math 라이브러리, 제곱근
코딩 테스트 문제를 풀다가
python math 라이브러리의 trunc()를 쓸 일이 생겼다.
math 라이브러리의 trunc()와 floor() 모두 인자로 받은 값의 소숫점을 버리는 역할을 한다.
floor()는 더 낮은 수로 소숫점을 버리지만,
trunc()는 그냥 소숫점 첫째자리부터 끝까지 지워버린다.
오래전에 C로 이런 로직을 과제로서 구현했던 기억이 나지만
Python 상에서는 어떻게 구현이 되어을지 궁금해서 인터넷 검색을 해 보았다.
"Python의 math라이브러리의 소스 코드를 열람할 수 있는지."
Python은 C의 math함수를 사용한다고 한다.
Cpython 구현체의 경우 C의 표준 라이브러리 ( C99 )
Jpython 구현체의 경우 Java의 math 라이브러리를 사용한다.
Python의 math는 C 함수의 wrapper이다.
위에서 말한 Python math 라이브러리의 함수들은
표준과도 관련이 있는데, IEEE 754와 관련있다.
IEEE 754는 IEEE에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이다.
제곱근을 구하는 함수를 호출했다고 가정하면
바로 C library로 참조하는 것이 아니라,
제곱근을 구하는 데에 특화된 연산을 하는
이진형태의 파일을 이용한다.
이는 OS안에 배포되어 있으며
많은 마이크로프로세서가 연산에 특화된 명령어를 사용한다고 한다.
컴파일러 또한 기계어로 변환할 때 이를 이용한다고 한다.
사용자의 머신에서 어떤 C 표준 라이브러리의 알고리즘이 쓰일지는 알 수 없지만
쓰일 가능성이 높은 알고리즘들은 다음과 같다고 한다.
https://mathworld.wolfram.com/SquareRootAlgorithms.html
https://en.wikipedia.org/wiki/Methods_of_computing_square_roots
컴퓨터로 제곱근을 구하는 알고리즘도 방식이 다양하다는 것을 알 수 있다.
파이썬은 스레드 성능을 유지하기 위하여
동시에 하나의 스레드만 이용 가능하며 멀티 코어를 활용할 수 없다는데
C로 작동하는 산술 알고리즘에서는 성능 이슈가 있을까?
이와 관련하여 다음 글에서는
특정 프로그래밍 언어가 느리다, 빠르다 하는 논쟁에 대하여 다루어 보고싶다.
출처
https://stackoverflow.com/questions/5476189/where-can-i-inspect-pythons-math-functions

댓글
댓글 쓰기