서버 프로그래밍

float, double network ordering, float, double 타입의 네트워크 순서(오더)에 관하여...

하늘흐늘 2009. 4. 4. 18:46
반응형

 

float 타입이나 double 타입의 전송은 네트워크 프로그래밍 관련하여 공부한 몇 권의 책에서 나오지 않는 내용이라 열시미 찾아 보았답니다. 우선 float 나 double 타입에 대해서 기본적인 지식을 알아보면 아래와 같이 인터넷에서 찾은 글이 참이나 설명을 잘해주고 있습니다.  

Floats and doubles tend (in modern chip architectures) to be represented using an IEEE-standard format; so the commonly defined types *are* "float" (single-precision) and "double" (double-precision). These have precise meanings in the standards, and more-or-less common implementation limits in practice.
해석:
float와 double은 IEEE 표준을 사용해서 근래의 칩에서 구현되는 추세이다. 그래서 일반적으로 float (싱글 정확도) 그리고 double (더블 정확도)로 정의된다. 그것들은 표준에서의 정확한 의미를 가지며 실제적으로 더 확장되거나 축소되어 일반적으로 구현된다.
--> 결과적으로 말하여 대부분의 칩(하드웨어라는 쪽이 이해하기 편하겠군요...)에서 IEEE 표준에 기초하여 구현되는데 약간의 편차가 있다는 의미인 듯 보입니다.

그런 본격적으로 네트워크 처리는 어떻게 해야 하는지를 알아보도록 하겠습니다. 표준관련 부분을 wikipedia가 짧게 퍽이나 잘 설명하여 놓았습니다. (흐흐... wikipedia님은 참이나 짧게 명료하게 잘 설명하십니다. 특히나 영문판...) 

Floating-point and endianness
On some machines, while integers were represented in little-endian form, floating point numbers were represented in big-endian form. [3] Because there are many floating point formats, and a lack of a standard "network" representation, no standard for transferring floating point values has been made. This means that floating point data written on one machine may not be readable on another, and this is the case even if both use IEEE 754 floating point arithmetic since the endianness of the memory representation is not part of the IEEE specification. [4]
(링크: http://en.wikipedia.org/wiki/Endianness#Floating-point_and_endianness)
해석: 일부기계에서 integers가 리틀엔디언으로 표현되는데 반하여 floating point는 빅엔디언으로 표현된다. 왜냐하며 다양한 floating point 형식이 존재하며 표준 네트워크 표현의 부족 그리고 floating point 전달에 대한 어떤 표준도 만들어지지 않았기 떄문이다. 이는 통신하는 한쪽 기계에서의 데이터가 통신하는 반대쪽 기계에서 읽혀지지 않을지도 모른다. 그리고 심지어 통신하는 양쪽 기계가 모두 IEEE 754 floating point 계산 표준으로 따르다해도 일어날지 모른다. 왜냐하면 부동소수점에 대한 메모리 엔디어 표현은 IEEE 표준문서에 정의되어 있지 않기 때문이다.

슬슬 결론으로 가면, 부동소수점(float, double)을 메모리에 어떻게 표현하는 가는 근래에는 IEEE 754표준을 따라 구현되고 있다는 점이다. 하지만 IEEE 754표준은 빅 혹은 리틀 엔디언에 대한 스펙을 제공하지 않는 관계로 해당 부동소수점에 대한 메모리를 직접 전송할 경우, 전송을 받는 기계에서의 값과 전송하는 기계에서의 값이 틀려질 수 있다는 말이다. 뭐... 현실적으로 이야기 하면 x86 클라이언트와 썬이나 IBM계열의 독자적 CPU, Memory 아키텍처를 가진 서버와 통신할 때 값이 변할 수 있다는 의미입니다. 더욱더 정확히 이야기 하면 x86 클라이언트에서 보낸 부동소수점 값을 x86 CPU가 아닌 다른 CPU를 가진 서버에서 해당 값을 가지고 연산을 할 경우 잘못된 연산이 될 가능성이 높다는 의미입니다.

결론적으로 부동소수점에 대한 처리는 같은 CPU 아키텍처를 가질 경우 특별한 Network Ordering처리없이 보내면 된다는 의미입니다. 그리고 다른 아키텍처를 가진 경우 표준이 없는 관계로 독자적인 처리 로직을 만들어 주고 받아야 한다는 의미입니다.

뭐, 실제로 그렇게 만든다면 꽤나 골치아프겠네요.... 방식은 일정한 오류를 인정하거나 문자열로 보내는 방식외에는 없어보이네요.... 일정한 오류라... float도 부정확한데 거기서 더 부정확해지면.... 흠... 

반응형

'서버 프로그래밍' 카테고리의 다른 글

IP(Internet Protocol) Note #1  (0) 2009.05.27
Overlapped I/O Note #2 서버개발전략  (0) 2009.05.18
Overlapped I/O Note #1  (0) 2009.05.17
IOCP 실행순서 보장 번역 오류!...  (1) 2009.05.14
TCP Note #2 Gracefully Close(..)  (0) 2009.05.13
TCP & UDP Note #1  (0) 2009.05.12
TCP관련 문서들  (0) 2009.05.06
TCP/IP에 대한 유용한 글 모음  (0) 2009.04.30