#include <iostream>

using namespace std;

typedef unsigned int fint;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;

#define make_fint(i,f)  (fint)(f | i << 20)   // int를 부동소수점 마냥 쓰기
#define get_int(i)   (fint)(i >> 20)    // 정수부분 가져오기
#define get_float(f)  (fint)((f << 12) >> 12)  // 소수점 아래 부분 가져오기
#define get_upper(a)  (fint)(a >> 20)    // 소수점끼리 연산으로 정수로 올라온 숫자 가져오기

fint fint_plus(fint a, fint b)
{
 int ai, af;
 int bi, bf;
 int upper;
 int ri, rf;

 ai = get_int(a);
 af = get_float(a);

 bi = get_int(b);
 bf = get_float(b);

 rf = af + bf;
 upper = get_upper(rf);
 ri = ai + bi + upper;
 
 return make_fint(ri,rf);
}


fint fint_sub(fint a, fint b)
{
 int ai, af;
 int bi, bf;
 int upper;
 int ri, rf;

 ai = get_int(a) - 1;
 af = get_float(a);

 bi = get_int(b);
 bf = get_float(b);

 rf = (af + (1<<21)) - bf;
 upper = get_upper(rf);
 ri = (ai + upper) - bi;
 
 return make_fint(ri,rf);
}

int main()
{
 int a = 0xff0;
 int b = 0xf5ff0;
 fint c = make_fint(a,b);
 
 printf("%x\n", c);

 fint d = get_int(c);
 fint e = get_float(c);
 printf("int : %x,    float : %x\n", d, e);
 
 fint f,g;
 f = make_fint(5,5000);
 g = make_fint(4,9920);

 fint sum = fint_plus(f,g);
 fint sub = fint_sub(f,g);
 printf("a = %d.%d,   b = %d.%d\n",
  get_int(f), get_float(f), get_int(g),get_float(g));
 printf("plus %d.%d, sub %d.%d\n",
  get_int(sum), get_float(sum), get_int(sub),get_float(sub));
/*
 5.005
 -4.992
 --------
    008 + 005
 013

  5.992
 -6.001
 ---------
 -1.991
 */
}

// 하루히 와핑 소스
/*
// 바꾼 이미지 복구? 음.. 제거쪽이 해석이 맞을지도
//v3.0
function MM_swapImgRestore()
{
 var i,x,a=document.MM_sr;
 for(i=0; a && i<a.length&&(x=a[i]) && x.oSrc;i++)
  x.src=x.oSrc;
}

// 이미지들을 먼저 읽어오기
//v3.0
function MM_preloadImages()
{
 var d=document;
 
 if(d.images)
 {
  if(!d.MM_p)
   d.MM_p = new Array();

  var i, j = d.MM_p.length, a=MM_preloadImages.arguments;
  for(i=0; i < a.length; i++)
   if (a[i].indexOf("#") != 0)
   {
    d.MM_p[j]=new Image;
    d.MM_p[j++].src=a[i];
   }
 }
}

// 오브젝트 찾기 (즉 케릭터가 주목하는 방향 좌표)
//v4.01
function MM_findObj(n, d)
{
 var p,i,x; 

 if(!d)
  d=document;

 if((p=n.indexOf("?")) > 0 && parent.frames.length)
 {
  d=parent.frames[n.substring(p+1)].document;
  n=n.substring(0,p);
 }

 if(!(x=d[n]) && d.all)
  x=d.all[n];

 for (i=0; !x && i<d.forms.length; i++)
  x=d.forms[i][n];

 for(i=0; !x && d.layers && i<d.layers.length; i++)
  x=MM_findObj(n,d.layers[i].document);

 if(!x && d.getElementById)
  x=d.getElementById(n);
 return x;
}

// 이미지 바꾸기
//v3.0
function MM_swapImage()
{
 var i, j=0, x, a=MM_swapImage.arguments;

 document.MM_sr = new Array;

 for(i=0; i < (a.length-2); i+=3)
  if ((x = MM_findObj(a[i])) !=null)
  {
   document.MM_sr[j++]=x;

   if(!x.oSrc)
    x.oSrc=x.src;

   x.src=a[i+2];
  }
}
*/

'C/C++언어' 카테고리의 다른 글

코드 최적화  (0) 2008.05.09
[알고리즘]고정소수점(fixed point) 연산  (0) 2008.05.09
고정 소수점  (0) 2008.05.09
각 언어별 3중 포인터  (0) 2008.05.06
쉬프트 연산과 곱셈  (0) 2008.03.26

+ Recent posts