Go 언어로 구현된 부동 소수점 변환, 기존 알고리즘보다 빠르다!

by DD
4개월 전
조회수 6

부동 소수점(Floating-Point)을 십진수로, 십진수를 부동 소수점으로 변환하는 알고리즘의 단순성과 속도 향상에 초점을 맞춤

'Unrounded Scaling' 기법을 핵심으로, 단일 64비트 곱셈을 통해 근사값을 계산하여 고속 변환을 구현

Go 언어로 구현되었으며, 기존 알고리즘인 Dragon4, Grisu3, Eisel-Lemire 등보다 빠른 성능을 보임

향후 Go 1.27 버전에 포함될 예정이며, 최적의 솔루션에 근접했다는 평가를 받음

Unrounded Scaling 기법의 핵심 원리

본 연구의 핵심인 'Unrounded Scaling' (비반올림 스케일링)은 부동 소수점 변환의 정확성과 속도를 동시에 잡기 위한 핵심 기술이다. 기술적으로 보면, 이 기법은 x에 2의 거듭제곱과 10의 거듭제곱을 곱한 후, 결과를 비반올림 형태로 반환한다. 특히, p가 음수일 때 10p를 정확하게 표현할 수 없다는 문제에 대한 해결책으로, 정밀한 근사 계산을 통해 정확도를 유지한다.

고정폭 인쇄(Fixed-Width Printing) 알고리즘 분석

연구에서는 'Unrounded Scaling'을 활용한 고정폭 인쇄 알고리즘을 제시한다. 이 알고리즘은 주어진 자릿수(n)에 맞춰 부동 소수점 숫자 f를 d·10-p 형태로 변환한다. 특히, m·2e·10p∈[10n-1,10n) 조건을 만족하도록 p 값을 계산하며, log10Pow2 함수를 사용하여 정확한 고정 소수점 연산을 수행한다. 결과적으로, uscale과 round 함수를 통해 간결하고 효율적인 변환을 구현한다.

최단폭 인쇄(Shortest-Width Printing) 알고리즘의 특징

최단폭 인쇄는 부동 소수점 숫자를 변환했을 때, 원래의 숫자로 다시 변환될 수 있는 가장 짧은 십진수 표현을 생성하는 것을 목표로 한다. 본 연구에서는 'Unrounded Scaling'을 활용하여 이 문제를 해결하며, 특히 footprint(f) 개념을 도입하여 부동 소수점 이웃 간의 거리를 계산한다. 또한, skewed 함수를 사용하여 정확한 p 값을 결정하고, dmin과 dmax를 계산하여 최적의 십진수 표현을 선택한다.

성능 비교 및 최적화 전략

연구 결과에 따르면, 'Unrounded Scaling' 기반의 알고리즘은 기존의 dblconv, dmg1997, dmg2017, ryu 등 다양한 알고리즘보다 고정폭 및 최단폭 인쇄에서 우수한 성능을 보였다. 특히, formatBase10 함수와 i2a lookup table을 활용하여 자릿수 형식화(Digit Formatting) 속도를 향상시켰다. 또한, Omit Needless Multiplications 기법을 통해 uscale 함수를 최적화하여 단일 곱셈 연산으로 대부분의 경우를 처리하도록 개선했다.

Floating-Point Printing and Parsing Can Be Simple And Fast (Floating Point Formatting, Part 3)