상세 컨텐츠

본문 제목

C# Word 데이터를 IEEE754 방식으로 치환하기

프로그래밍/C#

by TickTack 2022. 8. 26. 15:02

본문

이번에는 C#에서 IEEE754 방식으로 데이터를 계산하는 방법에 대하여 알아보겠습니다.

IEEE754는 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이고 있는 표준입니다.

대표적으로 대부분의 프로그래밍 언어에서 많이 사용하는 float과 double에 대한 내용이 여기에 해당됩니다.

 

- float (Single) : 단정밀도 부동소수점 (32bit)

- double (Double) : 배정밀도 부동소수점 (64bit)

 

예시로 정말 간단하게 보면 float은 0.9999999999999999999999999999999,

double은 0.999999999999999999999999999999999999999999999999999999999999999 로

생각하면 이해가 쉬울 것 같습니다.

 

그래서 double이 float 속도는 느리지만 정확도를 요구하는 곳 (돈 계산 등)에서 빛을 발하고,

정확도보다는 속도를 중시한다면 float을 쓰면 됩니다.

이번에 소개할 내용에는 단정밀도 방식이 사용된 코드가 들어가 있습니다.

Byte도 시도해보지는 않았으나 아마 같은 맥락으로 구할 수 있지 않을까 합니다.

 

먼저 소스와 주석입니다. value1, value2는 인자 변수명입니다.

value1, value2의 예시 값은 PLC의 Word 영역에서 각각 받은 데이터라고 가정하겠습니다.

 

// 예를 들어 14859, 16361의 2Word를 받으면 받은 십진수를 Hex 값으로 바꾸고 (3A0B, 3FE9) 둘의 위치를 교환한다. (3FE9, 3A0B)
// 이렇게 하면 IEEE754 방식으로 소수점 계산이 된다.
string hexVal = value2.ToString("X4") + value1.ToString("X4");
int i = 0;
int j = 0;
byte[] bArray = new byte[4];

for (i = 0; i < hexVal.Length; i += 2)
{
    bArray[j] = Byte.Parse(hexVal[i].ToString() + hexVal[i + 1].ToString(), System.Globalization.NumberStyles.HexNumber);
    j += 1;
}
Array.Reverse(bArray);
Single s = BitConverter.ToSingle(bArray, 0);
s = (float)Math.Round(s, 1);

 

예시 코드에 집어넣어서 나온 16진수 값을 합친 수를 0x를 붙여서

아래 사이트에 표시된 부분에 집어넣으면 결과 값이 나옵니다. 맞지 않는다면 다시 역순으로 넣어보시기 바랍니다.

코드로 구해진 결과값과 비교하면 어느 정도 정합성은 맞출 수 있지 않을까 생각합니다.

 

https://www.h-schmidt.net/FloatConverter/IEEE754.html

 

 

원래는 IEEE754 변환 공식이 따로 있지만 추후 글 작성 시 링크를 걸도록 하겠습니다.

이상으로 C#에서 Word 데이터를 IEEE754 방식으로 치환하는 방법에 대하여 알아보았습니다.

관련글 더보기

댓글 영역