what is the process when data is loaded on moemoy?

dltkddyd의 이미지

컴파일러가 실수형 데이터를 저장할 때 발생하는 근본적인 문제에 대해 논할 필요가 있지만, gcc가 어떻게 실수형 데이터를 이진화해서 메모리에 올리는지 알 수 없기 때문에 이진화해 메모리 저장시 발생하는 오차가 어디서 발생하는지 알 수는 없다. 데이터 뒤에 f접미사가 있는 실수든 아니든 간에 수학적 원리에 따라 십진수를 이진화하는 일관적인 원리에 따라 데이터를 메모리에 저장한다면 이런 오차 문제는 발생하지 않을 것으로 보인다. 다만 실행시에 연산을 더 해야하는 이유 때문에 속도저하의 문제가 발생할 수 있을 것이다.

float f1=4.4f;
또는
float f1=4.4;

는 소수부를 이진화할 때 순환수수이다. 컴퓨터의 메모리는 유한하기 때문에 무한한 소수 길이를 모두 저장할 수 없다. 만약 모두 저장하려 한다면 슈퍼컴으로도 부족할 것이다. 그래서 결국 자료형의 크기에 맞추어 데이터를 자를 수 밖에 없다. 바로 여기서 약간의 오차가 발생한다. 이 오차는 float과 double 사이에도 존재한다. 설사 겉으로 보기에는 오차가 없어도 가수부의 자릿수 차이 때문에 같은 숫자도 다르다고 컴파일은 판단한다.

double d1=4.4;
if(f1==d1) {
cout<<"서로 같다."<<endl;
}
else {
cout<<"서로 다르다."<<endl;
}

위의 구문을 컴파일해서 실행하면,

서로 다르다

라는 결과가 출력된다.

f1의 가수부는 23비트이고 d1의 가수부는 52비트이며, d1의 앞 비트는 f1의 비트와 각각의 자리수가 같을지라도(반올림이 없다면) 나머지 비트는 f1과 비교될 수 없다. 그래서 두 수는 다르다고 컴파일은 판단한다.
이런 문제를 과연 해결할 수 없을까? 해결할 방법은 있다고 생각한다. 이진화시 f라는 접미사가 있든 없든, 실수부만 얻어올 수 있으면 된다. 그리고 저 소수부만 문자화해서 소수부가 몇 개의 개수인지 알면 된다. 그 개수가 n이라고 해보자. 그러면

(문자화된 소수부를 모두 정수로 가정하고 정수화한 수)*10^n*2
Y

여기서 자리올림이 발생한 수를 알아내면 된다. 위의 결과를 X라고 하면,

X/(10^n)
Y=X%(10^n)

이러한 계산을 Y가 0이 될 때까지 반복하면서,

X/(10^n)

의 값을 순차적으로 나열하며, 그 값이 바로 소수가 된다.

이 소수를 23비트인 가수부의 제한된 메모리에 넣으면 float이 되는 것이고, 52 비트인 가수부의 제한된 메모리에 넣으면 double이 된다. 이런 식으로 데이터를 저장하는 방식이 공개된다면, 사용자가 새로운 자료형을 정의해서 float과 double 간의 비교연산도 가능해진다. 그런데 이러한 방식으로 데이터를 가져오는 방식이 공개되지 않은 것 같다.

컴파일이 실수를 어떤 과정을 거쳐 메모리에 올리는지 그 방법좀 알려주세요. 이건 컴파일 차원에서 해결해야할 문제인 것으로 보입니다. 혹시 더 배워야할 언어(제 추측으로는 어셈블리라던가 기계어를 더 배워야 할 것 같으데)가 있다면 알려주시고요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.