최근에 만난 이슈 중 하나가 부동소수점에 관련된 일이었는데, 그동안 부동소수점에 대해 깊이 생각해본 적도 없고 다룰일도 없었기에 시간 비용이 꽤 들었다.


64비트 모듈내에서 float각 4바이트, double과 long double은 8바이트인데,

빌드시에 long double을 128비트로 지정하게 되면 long double이 16바이트 크기로 설정된다.

사이즈가 커졌으니 당연히 정밀도는 많이 좋아진다..


그런데, long double을 128비트로 지정해주는 부분이 아직까진 플랫폼별로 제각각이다. 소스코드상에서는 long double이란 키워드를 사용하지만,

HP-UX의 경우에는 80비트 포맷을 사용하고,  AIX는 128비트 포맷을 사용하긴하지만, IEEE.754 규격과는 다른 형식을 가진다.

Quadruple Floating-point에 대한 IEEE 규격과 대형 벤더들의 형식이 제각각이니

함부로 "이럴꺼야" 라든가 아무런 의구심없이 사용했다가는 한바탕 고생하기 딱 좋겠다.


또 하나가 HP-UX에서는  automatic wide evaluation이라는 기능이 컴파일러상에서 제공되는데,

float, double, long double 데이터 타입이 모두 하나의 long double형으로 운용된다. 즉, 10바이트 크기의

extended형 데이터로 다뤄지는데, C 키워드가 long double일뿐이다. 그러다보니, float와  double 변수들의 연산결과라

할지라도 내부적으로 10바이트 크기로 연산이 되기때문에 연산후에 long double에 대입하게 되면 "큰사이즈 변수를

작은사이즈변수에 대입"함에 따른 데이터 유실이 발생하진 않는다... 

아직까지 이 기능에 대한 다른 컴파일러들의 옵션을 못찾았다. 아직 없는듯........


----------------------------------------------------------------------------------

한 두군데 플랫폼에서 잘되던 기능이라고해서 마치 "어디든 다 되어야 되는거다"라는 식으로 생각한다거나

표준이라고 해서 모두 통할거라는 '시간에 의해 고정화되어가는 내 관념'들이 혹시 자리잡고 있는건 아닌지

늘 반성해야한다.




p.s> 참고 키워드.

Quadruple Floating-point

On HP-UX, cc with -fpeval=extended

On AIX, xlc with -qldbl128, -lc128

On Linux, gcc with --with-long-double-128

Automatic wide evaluation



Posted by Jason Ryu
,