�� ���� ������ ���ǵ� Game Programming Gems 2 �ѱ�����(���� ��, ������ȭ��)�� �Ϻ��Դϴ�. �� �ۿ� ���� ��� �Ǹ��� ������ȭ�簡 ������ ������, ���� ��� ���̴� �� ����Ʈ �Խø� ����� ��� ������ ������� �����Ǿ� �ֽ��ϴ�.

�� ���� ���� ���� ���� �����̹Ƿ� ��Ÿ�� ������ ���� �� �ֽ��ϴ�. ���� �� �������� �Ѱ� ��, ������ ���̿� �μ�� ���¿ʹ� �ٸ� �� �ֽ��ϴ�.

Game Programming Gem 2 �ѱ����ǿ� ���� ������ GPG ���͵�(http://www.gpgstudy.com/)���� ���� �� �ֽ��ϴ�.

2.1 �ε��Ҽ��� �����: IEEE �ε��Ҽ����� ���� ���� ���

Yossarian King, Electronic Arts Canada
yking(at)ea.com

����

����(integer, ���)�� ������ ���е�(precision, ��ȿ�ڸ���)�� ũ��(magnitude)�� ������. �ε��Ҽ���(floating-point, ݩ������) ���� �� �״�� �Ҽ���(decimal point)�� ��ġ�� ���ٴϴ�(floating, �ε�) ���� ���ϸ�, ũ�⵵ �������̴�. ����������, ������ ������ �ε��Ҽ������� �������Ƿ�, ��κ��� ���� ���α׷��ӵ��� �ε��Ҽ������� ���ϰ� ��� ������ ����ߴµ�, ��� �Ϲ����� ����� �����θ� �����ϴ� ���� ���ŷο� ���� �ƴ� �� ������. �׷��� ���� �� �ִ� �̵��� ���Ҵ�. �׷��� �ϵ���� ����� ����� ��������, PC�� ���� �ֵܼ��� �ε��Ҽ��� ����, ����, ����, �������� �� �� ����Ŭ ���� ó���ϰ� �ʿ� ����, ������ ���� ���α׷��ӵ��� �ս��� �ε��Ҽ��� ������ ������ ���� �� �ִ� ������ �����ϰ� �Ǿ���.

�⺻���� �ε��Ҽ��� ������ �������� ������, ������ �Լ����� ������ ������. �ε��Ҽ��� ���̺귯������ �� ����ȭ�� ���� ������, �׷� ���̺귯������ �Ϲ������� ������ �ƴ� ��Ȯ���� ���� ������ �͵��̴�. ���ӿ����� ��Ȯ������ ������ �� �߿��� ��찡 ����.

�� ���� ��Ȯ���� ��������ν� �ε��Ҽ��� ���� �ӵ��� ������ �ϴ� ���� ���� ������� �����Ѵ�. ���� ���꿡�� �������� ���̺� ���� ����� ��� ������. �� �ۿ����� ������ �ε��Ҽ��� �Լ��� ����ȭ�� ���� �Ϲ�ȭ�� ���� �� �����(logarithmic, �����) ���� ���̺� ������� �Ұ��Ѵ�.

�� �ۿ��� �̾߱��ϴ� �������� ������ ����.

IEEE �ε��Ҽ��� ����

�ε��Ҽ��� ���� ���� IEEE ǥ�ؿ��� �ε��Ҽ����� ����(binary) ǥ���� �ݿø�, ��Ȯ��, ������ ���(0���� ������ ��)�� ���� �Ծ���� ���õǾ� �ִ�. �� �ۿ��� �ٷ�� ����� ���� ǥ���� �ٰ��� ���̸�, �ݿø��̳� ���� ó���ʹ� ū ������ ����. IEEE�� ǥ�� ���� ǥ���� ����ϴ� ��ǻ�ͳ� �ܼ��̶�� �ε��Ҽ��� ó���� ���� IEEE ǥ���� ������ �������� �ʴ´� �ص� �� ���� ������� ������ �� �ִ�. ��Ƽ�� III Streaming SIMD Extensions(SSE)�� PS2 ���� ������ �Ѵ� IEEE ǥ���� �κ������� �����Ѵ�. �� �κ������� ���� ó���� ������ ���������� ������, ���� ǥ����ŭ�� ǥ���� �����Ƿ� �� ���� ������� �������� ������ �� �ִ�.

IEEE ǥ���� �ε��Ҽ��� ���� �ϳ��� ��ȣ ��Ʈ, �ϳ��� ���̾�� ����(biased exponent, -��), �ϳ��� ����ȭ�� ����(mantissa, ʣ�) �Ǵ� ��ȿ��(significand, �����)�� ǥ���Ѵ�. ������(single precision, Ӥ����) 32 ��Ʈ �ε��Ҽ��� ��(C�� float)�� �׸� 2.1.1�� ���� ������� ����ȴ�.

s = ��ȣ
e = ���̾�� ����
m = ����ȭ�� ����
�ε� �Ҽ��� ���� s x 1.m x 2(e-127)

�׸� 2.1.1 IEEE 32 ��Ʈ �ε��Ҽ��� ����. ��ȣ 1 ��Ʈ, ���� 8 ��Ʈ, ���� 23 ��Ʈ�� �Ǿ� �ִ�.

������ ���̾�� ������ ���(positive number, ���)�μ� ����ȴ�(�̿ʹ� �޸� ������ ��� ������ 2�� ����(complement, ���)�� ǥ���ȴ�). ���⼭ ���̾�Ǿ��ٴ� ���� ���� ������ 127�� �������ٴ� ���̴�. ������ 23 ��Ʈ �Ҽ��� 1�� ���̴� ������� ����ȭ�� ���·� ����ȴ�. �̷� ����� ����ȭ�� ����� �� �ִ� ��Ʈ��κ��� �ִ��� ���е��� ��� ���� ���̴�.

����, �ϳ��� �ε��Ҽ��� ���� 1���� 2 ������ ������ ����ȭ�� ��ȿ�� �ϳ�, ���� �Ҽ����� ��ġ�� ����Ű�� ���̾�� ���� �ϳ�, �׸��� ��ȣ ��Ʈ �ϳ��� �����ȴ�. �ϳ��� �ε� �Ҽ��� ���� ������ ���� �������� ǥ���� �� �ִ�.

n = s x 1.m x 2(e -127)

���� �� ������ -6.25�� �������� -110.01�̸�, �̸� ���� �������� ǥ���ϸ� -1 x 1.1001 x 22�� �ȴ�. �̴� s = 1, e = 2 + 127 = 10000001, m = [1.]1001�� �ش��Ѵ�(�׸� 2.1.2).

�������� �ణ�� �������� ��Ģ���� �����Ѵ�. e = 255�� ��, m���� ���� �ƴ�(not-a-number, NaN), ������ �� ���� ���, ���� ���Ѵ� �Ǵ� ���� ���Ѵ� ���� Ư���� ���ǵ��� ����. e = 0�� ������ ������ȭ(denormalize)�� ����, �� ���ڰ� �ʹ� �۾Ƽ� ������ 8 ��Ʈ�� �Ѿ�� ���� ��츦 ���� ���δ�.

�׸� 2.1.2 -6.25�� 32 ��Ʈ IEEE �ε��Ҽ��� �������� �޸𸮿� ����Ǵ� ���

������(double precision, ������) 64��Ʈ �ε��Ҽ��� ���� �տ��� ������ ��İ� ����� ������ ���ϰ� �ִ�. ���̴� ������ 11 ��Ʈ�̰� ��ȿ���� 52 ��Ʈ��� ���̴�. ������ ���̾ ���� 127�� �ƴ϶� 1023�̴�. ������ ���� ���� ������ �������� �� ���̹Ƿ� �޸𸮷κ��� �ε��ϰų� ó���ϴ� ���� �� ���� �� �ִ�. �׷� ������ ���ӿ����� �������� �� ���� �ʴ´�. �� �ۿ����� ������ �ε��Ҽ������� ���ؼ��� �̾߱��Ѵ�.

�ε��Ҽ��� Ʈ��

���� ���̺� ������� ���� ����, �ε��Ҽ��� ���� ��Ʈ ������ ���������ν� �ε��Ҽ��� ������ �ӵ��� ���� �� �ִ� �� ���� ������� �̾߱��ϰڴ�.

float/int ��ȯ

���Ŀ� ���� ���� ���̺� ����� �ε��Ҽ��� ���� ������ ��ȯ�����ν� ���� ���̺� ���ε��� �����Ѵ�. �̷��� �۾��� �ӵ��� ���� �� �ִ�. ���� ��, ��Ƽ�� II���� (int)f��� �ڵ带 ���� �ϳ��� float�� �ϳ��� int�� ��ȯ�� ������ �� 60 ����Ŭ ������ �ɸ���. ��ó�� ���� ����Ŭ�� �Һ�Ǵ� ������, ANSI C ǥ�ؿ����� float���� int���� ����ȯ ���� �Ҽ��δ� �߷������� �Ǵ� ������ �����ϰ� ������, ���� FPU�� ���� ����� ������ �ݿø��ϱ� �����̴�. int���� ��ȯ�� ���ؼ��� FPU �ݿø�(rounding) ��带 �����ϴ� ��ƾ�� ȣ���ϰ�, ��ȯ�� �����ϰ�, �ٽ� �ݿø� ��带 ���� ��� �ٲٴ� ������ ���ľ� �ϴµ�, �̴� ����� ���ŷο� �۾��̴�.

int�� float ������ ����ȯ�� �ɸ��� �ð��� �����Ϸ��� ���μ����� ���� �ٸ� �� �ִ�. ��� ����ȭ �ɼǵ��� �ѳ��� ���¿��� �̷��� ��ȯ�� �Ϲ����� ����ȯ�� ���غ���, ������ ������� �ڵ带 ���캸�� ������ � ���� �Ͼ���� �� �� ���� ���̴�.

�ε��Ҽ������� �������� ����ȯ�� �����ϴ� �� �� ���� �����, �ε��Ҽ��� ���� 1 x 223�� ���ϰ� �� ������� ���� ���� ��Ʈ���� ������ ���̴�. �׷� �ڵ带 ���� ���캸�� ��� �۵��ϴ��� �����ϰڴ�.

���Ǹ� ����, �ϳ��� 32 ��Ʈ ���� int �����ε�, �׸��� float �����ε� ������ �� �ֵ��� �ϴ� ����ü(union)�� �����Ѵ�.


typedef union
{
      int      i;
      float    f;
   } _INTORFLOAT;

INTORFLOAT ���� �� ���� ��� ���� �ڵ忡�� ���δ�. �� ����ü�� ���ؼ� ���� ��Ʈ ���Ͽ� �����ϴ� ���� �ſ� ������ ��������, �����δ� �����Ϸ��� ���� �ܷ� ���� �ڵ带 �����ؾ� �� ���� �ִ�. ���� �� ��Ƽ�� II�� ��� �ε��Ҽ����� ���� �������͵��� �������� �ϵ���� ���ֿ� �����ϸ�, �����͸� �� �ʿ��� �ٸ� ������ �ű���� �ݵ�� �޸𸮸� ���ľ� �Ѵ�. ���� INTORFLOAT ����ü�� ���� �����Ϸ��� �߰����� �޸� �ε�-���� ������ �Ͼ �� �ִ�. ������ �ϳ��� float�� int�� ��ȯ�ϴ� �ڵ��̴�.


   INTORFLOAT	n;		// ��ȯ�� �ε��Ҽ��� ��
   INTORFLOAT	bias;	// "������" ��

   bias.i = (23 + 127) << 23;	// ���̾ ��� = 1 x 2^23
   n.f = 123.456f;			// �ε��Ҽ��� ��

   n.f += bias.f;			// �ε��Ҽ������μ� ���ϰ�
   n.i -= bias.i;			// �����μ� ����.
   // n.i�� 123�� �ȴ�. �̴� n.f�� ���� �κа� ��ġ�Ѵ�.

�������� ���� ���� �Ͼ�µ�, �� �׷��� ���캸��. �ε��Ҽ��� ���� 1 x 223�� ���ϸ� ������ ���� 23��Ʈ ������ �з�����, ������ �˷��� ���� (23 + 127)�� �����ȴ�. �ű⼭ �˷��� �� (23 +127)�� �����μ� ���� ���ʿ��� ���� ��Ʈ���� ������� ������Ʈ��, �� �����θ� ���� �ȴ�. �׸� 2.1.3�� 43.25�� ���� �̷��� ������ �Ͼ�� ���� �����ְ� �ִ�.

�׸� 2.1.3 �� 43.25�� �ε��Ҽ��� ������ �����ؼ� ������ ��ȯ�Ѵ�. �������� ����ģ ��Ʈ���� �޸𸮿� �¾Ƶ��� ������, ���ȴ�(�ݿø��� �����).

��Ƽ�� II����(��� �͵��� ij�� �ȿ� �ִٰ� �� ��) �� ����� ����ϸ� ��ȯ �ð��� 60 ����Ŭ���� 5 ����Ŭ�� �پ���. ���� �ζ��� ������� �ڵ带 �̿��ϸ� float�� int�� ��ȯ�� �� FPU�� �ݿø� ��带 �ٲ��� �ʵ��� ����� �͵� �����ϱ� �ϴ�. �̴� �Ϲ����� ����ȯ���ٴ� ������, �� �ۿ��� �����ϴ� ���̾ ������ٴ� �Ϲ������� ������.

�� ����� ��ȯ�� �ε��Ҽ��� ���� ������ ���̾ ����� ��ġ�� �ʴ´ٴ� ���� �Ͽ����� �۵��Ѵ�. ��ü������ ���ؼ�, ���� 223���� �۴ٸ� ���� ���� �۵��ϰ� �ȴ�.

���� ���� ����� ó���Ϸ��� bias = ((23 + 127) << 23) + (1 << 22)�� ����ؾ� �Ѵ�. �߰��� (1 << 22)�� 1.5 x 223�� �ش��ϴµ�, �� �κп� ���� ������ ���� ��Ȯ�� �ݿø��� �Ͼ�� �ȴ�(�׸� 2.1.4). ������ ��Ʈ���� ������ �������� ������ ������ �ֻ��� ��Ʈ(��Ʈ 23)�� ������ ��ġ�� �ʵ��� �ϱ� ���� ���̴�. �� ��� 9���� �ƴ϶� 10���� ���� ��Ʈ���� ���ŵǹǷ�, �� ����� ������� 1��Ʈ ���� �������� ����ȴ�. �� ��ȯ�� ���� 222���� �۾ƾ� �ϴ� ���̴�.

float�� ������ �Ҽ��� ��Ʈ���� ���� �����Ҽ���(fixed-point) �������� ��ȯ�� ������ bias = (23 - �Ҽ���_��Ʈ�� + 127) << 23�� ����Ѵ�. ������ ó���ϱ� ���ؼ��� ���̾�� (1 << 22)�� ���ؾ� �Ѵ�. �׸� 2.1.5�� �ε��Ҽ��� �� 192.8125�� �Ҽ��ΰ� 2��Ʈ�� �����Ҽ��� ���� ��ȯ�ϴ� ���̴�.

������ �ε��Ҽ��� ���� ��ȯ�� ������ ������ �̾߱��� ������ ������ �����ϸ� �ȴ�.

�׸� 2.1.4 ���� float�� int�� �ٲٴ� ����� ���� float�� ���� ���� �ٸ���. �� �׸��� -43.25�� ��ȯ�ϴ� ���̴�. ���� ģ ��Ʈ���� ���� �� �ݿø��� ��������ν� ��Ȯ�� ���� ������ ��������� ����� �ָ��ϱ� �ٶ���.
�׸� 2.1.5 float���� int�� ��ȯ�� �� �Ҽ��� ��Ʈ���� �����ȴ�. �� �׸��� 192.8125�� �Ҽ��ΰ� 2 ��Ʈ�� �����Ҽ��� ���� ��ȯ�ϴ� ���̴�.

	n.i = 123;         // ��ȯ�� ����

	n.i += bias.i;     // �����μ� ���ϰ�
	n.f -= bias.f;     // �ε��Ҽ��� ���μ� ����.
	// n.f�� ������ n.i�� �ε��Ҽ������� ��ȯ�� ����� 123.0�� �ȴ�.

�Ϲ������� int�� float�� �ٲٴ� �۾��� �Ϲ����� ����ȯ���ε� ����� ������ ������ �� �����Ƿ�, �� ����� ����� �ʿ�� ���� ���� ���̴�.

��ȣ ����

�ε��Ҽ��� ���� ��ȣ ��Ʈ�� 31��° ��Ʈ�̴�. �̴� ���������� ���������̴�. ���� ���� ������ ���ؼ��� �ε��Ҽ��� ���� ���� ���� ������ �� �ִ�. f�� �ε��Ҽ��� ����� �� ��, ������ �� �ڵ� �������� (����)������ �ǹ̸� ���Ѵ�.


if ( f < 0.0f )	// �ε��Ҽ��� ��
...

INTORFLOAT	ftmp;
ftmp.f = f;
if (ftmp.i < 0)	// ���� ��
...

�ǹ̴� ������ �ӵ��� �ٸ� �� �ִ�. ���� �񱳰� �� ���� �� �ִµ�, �̴� ������ ���� ��Ʈ�� ���������̴��� �� ����ϱ� �����̴�. ��ü���� ���� �򰡸� �غ��� �� �� ���� ���̴�("����"��� ǥ���� ������, ���� 0�� ���� ó�� ����� ���� �ٸ��� �����̴�).

��

�ε��Ҽ��� ������ ��ȣ, ����, ���� ������ ��Ʈ���� �����ϹǷ�, ���� ������ ���ؼ� �ε��Ҽ��� ������ ���ϴ� ���� �����ϴ�. a�� ������ b�� �������� ũ�� ������ ������� a�� b���� ũ��. ���� ���� �� �ڵ� �������� �ǹ̴� �����ϴ�.


if ( a < b )			// �ε��Ҽ��� ��
...

INTORFLOAT atmp, btmp;
atmp.f = f; btmp.f = b;
if (atmp.i < btmp.i)	// ���� ��
...

��ȣ ���������� ����������, ������ ���������̴��� �� ����ϹǷ� ���� �񱳰� �� ������. �� �� ����� a�� b�� ��� ������ ��쿡�� ������� �ʴ´�. �̴� �ε��Ҽ������� ������ ���� ��Ʈ���� ����ó�� 2�� ���� �������� ����Ǵ� ���� �ƴϱ� �����̴�. �� �� �� ��� �ϳ��� ���� ���� Ʋ������ ����� �� ����� �� ���� ���ϴ� ���� ���� ����̴�.

����

���� ���α׷��ֿ��� �ϳ��� ���� Ư���� ������ ����(clamping)�ؾ� �ϴ� ���� ���� �����. Ư�� 3D ���α׷����̶�� ���� [0, 1] ������ �����ؾ� �ϴ� ���� ����. �ε��Ҽ��� �� f�� 0���� �����ϴ� ��(�� f<0�̸� f=0)�� ��ȣ ��Ʈ�� �ϳ��� ����ũ�� ����� ������ ó���� �� �ִ�. ���� �ڵ带 ����.


INTORFLOAT ftmp;
ftmp.f = f;
int s = ftmp.i >> 31;   // ��ȣ ��Ʈ ����ũ�� �����.
s = ~s;                 // ����ũ�� ��Ʈ���� �����´�.
ftmp.i &= s;            // ftmp = ftmp & mask
f = ftmp.f;

s���� f�� ��Ʈ���� ���������� 31�� �̵�(shift)��Ų ���� ����. �̿� ���� 32���� ��Ʈ�� ��� ��ȣ ��Ʈ�� ä���� ����ũ�� ���������. �̰��� NOT ��Ű�� f�� �����̸� 0, ����̸� 1�� ä���� ���� �ȴ�. �ٽ� �̰��� f�� AND ��Ű�� f�� ������ �ʰų� 0�� �ȴ�. �������ڸ�, f�� �����̸� 0�� �ǰ�, ����̸� �׳� �״�� ������ �ʴ� ���̴�.

�� �ڵ�� ������ ���� �������� ����Ǹ�, �񱳳� �б�(branching, ����)�� ����. �ڵ带 ��ġ��ũ�غ��� ��, �ε��Ҽ��� ��ȭ ���ѿ����� 18 ����Ŭ ������ �ҿ�Ǿ�����, ���� ���� ��Ŀ��� 5 ����Ŭ ���ϸ� �ҿ�Ǿ���(�� ����Ŭ���� ������ �߰��δ㵵 ������ ������ ������ ��).

����� 0���� �����ϴ� ���(f>0�̸� f = 0)�� ������ 0���� �����ϴ� ��캸�� ��� Ƚ���� ������, ����ũ ��Ʈ���� ������ �ʿ䰡 �����Ƿ� ��� ��ü�� �� ����.


INTORFLOAT ftmp;
ftmp.f = f;
int s = ftmp.i >> 31;	// ��ȣ ��Ʈ ����ũ�� �����.

ftmp.i &= s; 			// ftmp = ftmp & mask
f = ftmp.f;

1���� ����(f > 1�̸� f = 1)�� 1�� ����, 0���� �����ϰ�, �ٽ� 1�� ���ؼ� �����Ѵ�.


INTORFLOAT ftmp;
ftmp.f = f  1.0f;
int s = ftmp.i >> 31;	// ��ȣ ��Ʈ ����ũ�� �����.
ftmp.i &= s; 			// ftmp = ftmp & mask
f = ftmp.f + 1.0f;

�Ϲ�������, ����������� ���Ǻ� load ������ ����ϸ� �б��� �ʿ䰡 �������Ƿ�(�б��� �ʿ伺�� �����ϸ� ���� ���������� �ȿ����� �б� ���� ������ ������) ���� ������ �ӵ��� �ö󰡰� �ȴ�.

���밪

�̰� ����. �ε��Ҽ��� ���� 2�� ������ ������� �����Ƿ�, �׳� ��ȣ ��Ʈ�� 0���� �����ϱ⸸ �ϸ� ���밪�� ���� �� �ִ�.


INTORFLOAT ftmp;
ftmp.f = f;
ftmp.i &= 0x7fffffff;
f = ftmp.f;

f�� 0���� ���� �ʿ䰡 �����Ƿ� �ӵ��� �ſ� ������.

���� �� �ڻ����� ���� ���� ���� ���̺�

���ӿ��� �ﰢ�Լ��� �����ϰ� ���δ�. ���� �� �Ÿ��� ������ ����Ѵٴ���, ��ȣ�� ����ٴ���, ���� �޽ø� �����̴� ��� ��� �ﰢ�Լ��� �߿��� ������ ����Ѵ�. ǥ�� math ���̺귯������ ��� �Ϲ����� �ﰢ�Լ����� ���ԵǾ� ������, �ſ� ������, float�� �ƴ϶� double�� �ٷ�� ������ �޸𸮵� ���� ��ƸԴ´�. ������ ��� ���е��� ���� float�� ����ص� ����� ��찡 ����.

���ΰ� �ڻ��� ���� ȿ�������� ����� �� �� �ַ� ���� ���� ���� ���̺�(lookup table)�̴�. �Ϲ����� ���ٹ���� ������ ���� �������� �����ϰ�(���� ��� 360�� �ѹ����� 0���� 1023���� ǥ���ϴ� ��) �� ������ ���� �Ǵ� �ڻ��� ���� �����Ҽ������� ����ϴ� ���̴�. �׷��� �̸� ���ؼ��� ���� ���α׷��Ӱ� ���ΰ� �ڻ��ο� ���� ���̺귯�� ������ �����ؾ� �ϸ�, �� ǥ������ ����(radian) ���� ��� �������� ���� ������ ����ؾ� �Ѵٴ� ������ �����Ѵ�. ȿ������ ������ ���� �ε��Ҽ��� Ʈ���� �̿��ϸ�, �ﰢ�Լ��� ������ ���� ���θ� ���� ���ص� ǥ�� ���� ������ �޾Ƶ鿩�� �ε��Ҽ��� ���� �����ִ� �ﰢ�Լ� ����� ���� �� �ִ�.

����

��ǥ�� �̷� �Լ��̴�.


	float fsin( float theta );

�̴� ���� ���̺��� �̿��ؼ� ���� ������ �� �ִ�. 0���� 2pi�� 256 �ܰ�� ������ �����ϴ� ���� ���̺��� ����� ���� �����ϴ�. ������ i ���� ������Ű�鼭 ������ �ڵ带 �����ϸ� �ȴ�.


sintable[i] = (float)sin((double)i * 2.0*3.14159265/256.0)

i�� 0���� 255���� ��ȭ���� ���鼭 sintable �迭�� ä��� �ػ󵵰� 256�̸� float�� ���е��� ������ ���ΰ��� ��� ���� ���� ���̺��� �����.

fsin���� �� ���� �Ű������� �־��� float ���� 0���� 255 ������ ���� �������� �ٲٰ� �� ���ο� �ش��ϴ� float ���� �����ִ� �ͻ��̴�.


	float fsin( float theta )
	{
	    i = (unsigned int)(theta * 256.0f/
 	        (2.0f*3.14159265f));return table[i];
	    }

�׷��� �� ������ �� ���� ������ ������ �ִ�. �켱 �� �Լ��� ���� float->int ��ȯ�� �����ϸ�, �� ��°�� theta�� ���� [0, 2pi) �ٱ��̸� ���� ������ �迭�� ������ �Ѿ�� �ȴ�.

�� ������ �ذ��� ������ ������ ����.


	#define FTOIBIAS	12582912.0f	// 1.5 * 2^23
	#define PI			3.14159265f

	float fsin( float theta )
	{
		int		i;
		INTORFLOAT	ftmp;
		ftmp.f = theta * (256.0f/(2.0f*PI)) + FTOIBIAS;
		i = ftmp.i & 255;
		return table[i];
	}

�� ������ �տ��� �̾߱��� �ε��Ҽ��� ���̾ Ʈ���� �̿��ؼ� ���� �ε��Ҽ���-���� ��ȯ�� �����Ѵ�. ���� ��ȯ�� ������ 255�� ����ŷ�ϹǷ� ������ �迭�� ���� �ȿ����� ��ȯ�ȴ�. �� f�� 2^22�� ������ float->int ��ȯ Ʈ���� �����ϹǷ�, �ֱ������� f�� ���ҽ��Ѽ� [0, 2p) ���� �ȿ� ������ �ؾ� �� �ʿ�� ������ �����Ѵ�.

�� ������ fsin�� ��Ƽ�� II����(��� �ڵ�� �����Ͱ� �⺻ ij�ÿ� ����ִٰ� �� ��) �� 10 ����Ŭ�� �Һ��ϴµ�, �̴� ǥ�� math ���̺귯���� sin�� ���� 140 ����Ŭ�� �Ϳ� ���ϸ� ��û�� ����̴�(sin�� �ϵ���� FPU�� ���� ������ ����Ѵٴ� ���� �����ϸ� ���� �׷���).

256 �׸��� �ε��Ҽ��� ���� ���̺��� 1K�� �޸𸮸� �����ϴµ�, �� ������ ���� ���� �ȿ��� ij�ÿ� �����ϰ� �ӹ��� �� �ִ� ũ���̴�. �׸��� 256���̹Ƿ� �� ���̺��� ���� ���� ���� ��Ȯ���� 8 ��Ʈ�̴�. �־��� ��쿡���� ������ ���� ���̺��� �м������ν� �˾Ƴ� �� �ִ�(�η� CD�� �ڵ带 ������ ��). ���� ���̺��� ũ�Ⱑ Ŭ ���� ��Ȯ���� �ö󰡳�, ij�� ���߷��� �������Ƿ� �ӵ��� ��������.

�ڻ���

�ڻ��� �Լ��� ���� ���� ���̺��� ���� ���� �Լ��� ������ ������� �����ϸ� �ȴ�. �׷��� cos(q) = sin(q + pi/2)��� ������ �̿��ϸ� ���ΰ� �ڻ����� ���� ���� ���̺��� �����ϰ� ���� �� �ִ�. ���� ���̺� ������ ���� �� 256/4(pi/2 �� 25���� �ش��ϹǷ�)�� ���ϸ� �Ǵ� ���̴�. ���� �ڵ尡 �̸� �����ϴ� ���̴�.


	float fcos( float theta )
	{
		int		i;
		INTORFLOAT	ftmp;
		ftmp.f = theta * (256.0f/(2.0f*PI)) + FTOIBIAS + 64f;
		i = ftmp.i & 255;
		return table[i];
	}

��Ȳ�� ���󼭴� ���ÿ� ���ΰ� �ڻ��� ���� ��� ���ϴ� ���� ������ ���� �ִ�. �׷� ��� �ϳ��� �Լ� �ȿ��� ���� ���� ���ϰ�, �� �� ���� ���ο� 64�� ���ϴ� ������ �ڻ��� ���� ���ϰ� �Ǹ� ������ ���� ���� ���̴�. ����������, ���� ���ε�� �ڻ��ε��� �� ���� ���ؾ� �ϴ� ����� ���ʿ��� �ݺ� ����� ���̴� �������� �ڵ带 �����ϸ� �ȴ�.

�����ٿ� ���� ����� ����ȭ

������(square root)�� �Ÿ� ����̳� ���� ����ȭ, ������������ �� ���ϱ� ��� ���� ���δ�. FPU���� �������� ���ϴ� ������ �ֱ� ������, ��Ƽ�� II CPU���� ǥ�� C ���̺귯���� sqrt �Լ��� ������ 80 ����Ŭ ������ �Һ��Ѵ�. ���� ����ȭ�� �õ��� ���̰����� ����� ������ �� �ϴ�.

������ ����ȭ ���� �ε��Ҽ��� ��Ʈ���� �̸� ���� �����ϴ� ������� �̷������. �������� ������ ���õ� ���̸� �����ʹ� ����� ���� ������, ���� ��Ʈ�鸸 ������ �����ϸ� �������� ���� �� �ִ�. �ε��Ҽ����� �����ٿ� ���õ� ���ĵ��� ������ ����.

f = 1.m x 2e

sqrt(f) = sqrt(1.m x 2e) = sqrt(1.m) x 2e/2

�̵��� �ڼ��� ����, ������ �״�� ���ΰ� ������ 2�� ������ �ȴٴ� ���� �� �� �ִ�. �׷��� ������ �����̹Ƿ�, ������ Ȧ���̸� 2�� ������ �� ���� ��Ʈ�� �Ұ� �ȴ�. �� ������ ������ ���� ��Ʈ�� ������ �Ѱ������ν� �ذ��� �� �ִ�. ��������� �ش��� �ٷ� ������ ���� ������ �ȴ�.

sqrt(f) = sqrt(1.m x 2e0) x 2[e/2]

���⼭ e0�� ������ ���� ��Ʈ�̴�.

���ο����� ���������� �����ٵ� 256 �׸��� ���̺��� ���� �����ϴ� ������� ������ �� �ִ�. �� �� ���̺����� ������ ��Ƶΰ�, ������ ��Ʈ ������ ���ؼ� ������ �ȴ�.


float  fsqrt( float f )
   {
   INTORFLOAT		ftmp;
   unsigned int	n, e;

   ftmp.f = f;
   n = ftmp.i;
   e = (n >> 1) & 0x3f800000;	// ������ 2�� ������.
   n = (n >> 16) & 0xff;	// ���̺� ������ e0+m22-m16

   ftmp.i = sqrttable[n] + e;	// ������� ���Ѵ�.

   return ftmp.f;
}

���̺� ������ ������ ���� ��Ʈ��� ����(e0)�� ���� ��Ʈ�� ������ ���̴�. ���� ���̺��� �̸� ���� �������� ������ ��� �ִ�.

�������� ������ f�� ������ ���������� 1��Ʈ �̵���Ű�� ���� �� �ִ�(��������δ� 2�� ������ ����). ������ ���̾�� ���̹Ƿ� 1��Ʈ �̵���Ű�� ��������δ� �����Ӹ� �ƴ϶� ���̾ ���� 2�� �������� �ȴ�. �̴� ��ġ �ʴ� ����̹Ƿ�, sqrttable�� �׸� �߰����� �μ��� �������ν� ������ �ٽ� ���̾���Ѿ� �Ѵ�.

�� fsqrt �Լ��� ��Ƽ�� II CPU���� �� 16 ����Ŭ�� �Ҹ��ϴµ�, �̴� ǥ�� C ���̺귯���� �������� 5 �� ���� ���� ���̴�. ���� �̰��� ��� �͵��� ij�� �ȿ� ����ִٴ� ���� ���� �̾߱��̴�.

�˰����� ���� �� �� ���� ������ �η� CD�� ���� �ڵ带 �����ϱ� �ٶ���.

������ �Լ��� ����ȭ

�ϳ��� �Ű������� ������ ������ �ε��Ҽ��� �Լ��� �����Ϻ���.

y = f(x)

�տ��� ���� �� ������� ���ؼ�, �Ϲ����� �Լ��� ���� ���̺� ��� ����ȭ�� �� ���� �⺻���� ����� ��� �� �ִ�. ���ΰ� �ڻ����� ���, x�� ���� �˷��� ������ ���� ���������� ����ȭ(quantize)�Ǹ�, y�� �����ϱ� ���� ���̺� �������� ���δ�. �������� ���, x�� ���� ��������� ����ȭ�Ǹ� ��� �ϳ��� ��(�� ��� y ���� �Ǵ� ���� �ƴϴ�)�� �����ϱ� ���� ���̺� �������� ���δ�. �� �ϳ��� ���� x�� ������ �Լ��� ���� ��ʵǸ�, �� ����� �������� y�� ���� ���´�.

������ ���ٿ���, �ϳ��� �ε��Ҽ��� ���� ���� �� �� �ϳ��� ������ ��ȯ�Ǹ�, �� ������ ���� ����ȭ�� ���ؼ� �ϳ��� ���� ���̺� ������ �ȴ�. �̴� ���� ���� ���̺��� �ſ� ����� ������ �������, �ٸ� ���̶�� �ε� �Ҽ��� ���� ������ ȿ�������� ��ȯ�ϱ� ���� �ణ�� Ʈ���� ����ϴ� �� ���̴�. ����� ������ ��쿡�� �ε��Ҽ��� ��Ʈ ������ ���� ���̺� �������� ��������ν� ������� ����ȭ�� �����Ѵ�.

�� �� ����� �Ϲ�ȭ�ϸ� ������ �Լ��� ���� ����ȭ�� ������ �� �ִ�. ������ ����ȭ�� ����� ���̳� ����� ����ȭ�� ����� ���̳Ĵ� �Լ��� ���ݿ� ���� �޶�����.

������ ����ȭ

�տ��� �̾߱��� fsin �Լ��� ������ ����ȭ�� ���� ����ȭ�� Ʋ�� ���� �� �ִ�. � �Լ��� ���ǿ�(x�� ����)�� �����Ǿ� �ִٰ� ����(�� x E [A, B) ). �׷��� �� ������ �����ϰ� �����ϴ� �ϳ��� ���� ���̺��� ���� �� ������, �� ���� ���� x�� ���̺��� ���� ������ �������� ���� �� �ִ�. �׷��ٰ� �� �� ����ȭ�� �Լ� f�� ������ ���� ����� ���̴�.


#define FTOIBIAS		12582912.0f	// 1.5 * 2^23
#define TABLESIZE		256
#define INDEXSCALE		((float)TABLESIZE / (B  A))

float flut( float x )
{
	int		i;
	INTORFLOAT	ftmp;
	ftmp.f = x * INDEXSCALE + (FTOIBIAS  A * INDEXSCALE);
	i = ftmp.i & (TABLESIZE  1);
	return ftable[i];
}

���� ���̺��� ������ ���� ������ �ʱ�ȭ�ȴ�.


ftable[i] = f( (float)i / INDEXSCALE + A );

���⼭ f�� ������ ���е��� ���� �ε��Ҽ��� ���� �����ִ� "��¥" �Լ��̴�. flut�� �� ���� �ε��Ҽ��� ����(����, ����)�� �� ���� ���� ��Ʈ���� ����ŷ, �׸��� �� ���� ���̺� ���������� ������. ��Ƽ�� II CPU�� ��� �� 10 ����Ŭ ������ �Һ�ȴ�.

������ �� ���̺� �׸���� �������� ���������ν�(CPU ����Ŭ�� �ణ �� �Һ�ǰ�����) ��Ȯ���� ���̴� �͵� �����ϴ�. �Ϲ����� �Լ��� ���� �̷��� ����ȭ�� ����(��Ȯ�� ����� �߰����� ���� ������ ���ԵǾ� �ִ�)�ϴ� API�� �η� CD�� ��� �ִ�.

����� ����ȭ

������ ����ȭ�� ���� [A,B)�� �����ϰ� �ٷ��. �Լ��� ���󼭴� ����� ����� �� ������ ��찡 �ִ�(������ ��). �⺻���� ������, �ε��Ҽ��� x�� ���� ������ ��ȯ�ϴ� ��� �ε��Ҽ��� ǥ���� ��Ʈ���� ���� ���̺� �������� ����Ѵٴ� ���̴�. �⺻���� ���� �����, ��ȣ�� ����, ������ �Ϻ� ��Ʈ���� �����ϰ� ���������ν� IEEE 1:8:23 ������ �ε��Ҽ����� �� ���� �� ������ �� �ٸ� ������ �ε��Ҽ��� �������� ��ȯ�ϴ� ���̴�.

������ �������� 8���� ��Ʈ���� ���������ν� 0:1:7�� ��������� ����ȭ�� ���� �����. �� �� 1 ��Ʈ�� ������, 7 ��Ʈ�� ������ ���Ǿ���. ��ȣ�� ����ߴµ�, �Ǽ� �������� ���� �������� ���ǵ��� �ʱ� �����̴�. 0:1:7 ������ 8 ��Ʈ�� ����(IEEE ǥ�������� �׻� ���� �տ� 1�� �ٴ´ٴ� ���� ����� ��)�� 1 ��Ʈ�� ������ �̷�����Ƿ�, [1].0000000 x 20���� [1].1111111 x 21 ������ ������ ǥ���� �� �ִ�. �̴� [1,4)�� �ش��Ѵ�.

������ �Լ��� �۵� ������ 0:1:7 �������� ����ȭ�� ���� ���� ����(�� ���� ���̺� ����)�� ������ ���� �� �ٸ� �������� ����������. �׸��� �߰����� �۾��� ���ؼ� �� ���� �������� ������� ����ȭ�ϰ�, ���������� ������ ������ �ϳ��� 32 ��Ʈ �ε��Ҽ��� ��(�̰��� �Լ��� ����̴�)�� �����Ѵ�. �ٸ� �Լ��� ���� �̷��� ����� ����ȭ ������� ����ȭ�� �� �ִ�. IEEE ���Ŀ����� �� ���� �̵��� �� ���� ����ũ ���길���ε� ������ ���� ��Ʈ��� ������ ���� ��Ʈ���� �̾Ƴ� �� �ִ�. �����κ��� ebits ���� ��Ʈ���� �̰� �����κ��� mbits ���� ��Ʈ���� �̾Ƴ��� ����� ������ ����.

bits = (n >> (23 - mbits)) & ((1 << (ebits + mbits)) - 1)

�� �ڵ�� �� n�� ������ ���� �� ���ϴ� ��ŭ�� ��Ʈ���� �� n�� ���� ���������� �о �̵���Ű��, ���ʿ��� ��Ʈ���� ���ֱ� ����(����ŷ) AND ������ �����ϴ� ���̴�.

��ȣ ��Ʈ ���� �ս��� ������ �� �ִ�. �Ű������� �׻� ������ Ȯ���ϴٴ���, �Ǵ� �Լ��� ����� �׻� ������ Ȯ���ϴٸ� ��ȣ ��Ʈ�� ������ �� �ִ�. ����� ��ȣ�� �Ű������� ��ȣ�� ���ٸ�(�� f(-x) = -f(x)), ��ȣ ��Ʈ�� ������ �ξ��� �ٽ� ������Ű�⸸ �ϸ� �ȴ�.

�Ű����� ���� Ư�� ������ ���ѵǾ� �ִ� �Լ��� ���, ������ ����κ��� �̾Ƴ� ��Ʈ���� ����ŷ�����ν� ���� ���̺� ������ ���� �� �ִ�. ���� �� ���ǿ��� [1,16)�̶�� �������� 2 ��Ʈ, ������� 4 ��Ʈ(���� ���ڸ�)�� �̾Ƴ��� �ȴ�. �׷��� 0:2:4 ������ ��Ʈ���� �Ǵµ�, �̴� 1.0000 x 20���� 1.1111 x 23 ������ ���� ������ �ǹ��ϸ�, �������δ� 1.0���� 15.5 ���̰� �ȴ�. �� ��Ʈ�鸸 �̾Ƴ��� �� ��� 64 �׸��� ���̺��� ���� ������ �Ǵ� ���̴�. �̷��� ������ �� �� ����Ŭ�� ������ �� �����Ƿ� �ӵ��� ������. �׷��� ���е��� �� ���� �ʿ��ϴٸ� ���̺��� Ű���� �ϸ�, ���̺��� ��� ���� �̻� Ŀ���� ij�� ���߷��� �������� �ȴ�.

�� �ٸ� ����� ������ �������� ���� ������ ��� ������ �����ϴ� ���̴�. �Լ� f(x)�� ������ ���� ������ �� �ִٰ� �ϸ�:

f(x) = f(1.m x 2e) = f1(1.m) x 2f2(e)

8 ��Ʈ�� ���� m�� �̿��ؼ� f1�� 256 �׸��� ���� ���̺��� �ٻ��ϰ�(approximate), f2�� ���� e�� ���� ���� �������μ� ���� ����� �� �ִ�. ���������� �̰��� ������ ������ ������ ����̴�.

����� ����ȭ�� ������ �����̳�, �Լ����� ��Ʈ���� �����ϴ� ����� ���� �ٸ� ��찡 ����. ������ �Ϲ�ȭ�� ����� �׻� ������ ���� �ƴϳ�, �� �ۿ��� ������ ������� Ư���� ����ȭ ������ �ذ��ϴ� ������ ������ �� �� ���� ���̴�.

���� ����

�ڵ带 ����ȭ�� ������ ����ȭ ���� ����ȭ ���� ������ �����ϰ� �����ؾ� �Ѵ�. �̷л����δ� ���� ����ȭ ����� ���� ���������� ij���� �ൿ����̶���� �б� ���� ����, �����Ϸ��� ��û�� �ڵ� ���� ���� ���ε� ������ '���ϴ��ϸ� ����' ����� ���� �� �ִ�. ������ �����ߴٸ� ������ ������ ���Ǿ������� �� ¤����� �Ѵ�.

�����Ϸ� ����ȭ �ɼǵ��� Ȱ��ȭ��Ű�� �͵� �߿��ϴ�. ������ ���̶�� �ζ��� �Լ����� ����� ��. ����, �ζ��� �Լ��� ����߰ų� �����Ϸ� ������ �ٲ�ٸ� �� ����� ������ ���� �Ѵ�.

�ڵ带 ��ġ��ŷ�� �� �����Ϸ� ����ȭ�� �׽�Ʈ�� ���ذ� ���� �ʵ��� �ؾ� �Ѵ�. �ڵ带 �𽺾������ ���� �ǵ��� ��� �ڵ尡 ����������� �ڼ��� �����ؾ� �� ���̴�. Ÿ�̹��� �߿��� �κ��̶�� ������ ������ �ð��� ���� �͵� ������ ����� �� �� �ִ�. �׷��� �����Ϸ��� ����ȭ�� ���� ���� ���ΰ� �����Ͽ��� ���ܵǾ� �����ٸ� �ð� ���� ����� ���� �� ���� �Ǿ������.

��Ƽ�� ��ǻ���� ��� rdtsc(read time stamp counter) ������ �̿��ؼ� ������ CPU ����Ŭ ī��Ʈ�� ���� �� �ִ�. ������ �� ������ ����� ��� �����ϱ� ���� �� �� �� ����ȴٰ� ����ϰ� �ִ�. ������ ���� �� �� �ϰ����� Ÿ�̹� ����� ��� ���ؼ��� cpuid ó�� ���� ij�ø� ���� ������ ����ϵ��� �����ϰ� �ִ�. ������ �ð��� ���� �ϴ� ���, ����Ŭ ī��Ʈ�� ���μ����� ���� �ӵ�(MHz)�� ������ �� ���� �ð��� ���� �� �ִ�.

������ ���� �������� ���� �ŷ��� �� �ִ� ������ �ٷ� ����Ŭ ī���͵��̴�. VTune�̳� TrueTime ���� �����鵵 ������ �������ϸ��� �����ϴ�(PC�� ���). ��� ��ġ��ŷ�̵� �޸� �ൿ ����� �ִ��� ���� ��Ȳ�� ���� ������ �Ѵ�. �޸� ���� ������ ���� ���μ������� ������ ����߸��� �ֹ��̱� �����̴�. ij�� ���� ���������̴�. ��ġ��ũ������ ij�� ���´� ���� ��Ȳ�� �ִ��� ����ؾ� �Ѵ�. ��ġ��ũ�� ��� ���� �ð� ������ ���� ���� ��� �˰������� �� �� ���� ������ �༭ ij�ø� �̸� ä���δ� ����� ������ ���� �ٶ���. �׷��� �׷� ������ε� �׻� ���� ��Ȳ�� ��Ȯ�ϰ� �ݿ��Ǵ� ���� �ƴϴ�. ���� ���� ����� ������ ������ ������ ���߿� ���� ������ �����ϴ� ���̴�. �� �� �ŷ��� ���� ����� ��� ���ؼ��� ���ͷ�Ʈ���� ��Ȱ��ȭ��Ű�ų�, �Ǵ� ����� ���� �� �����ϰ� ���������� ����� ���ܽ�Ű�� ���� ����� ����� ���� ���� ���̴�.

�� �ۿ��� ����� ��� ����Ŭ ������� ���� ��Ƽ�� II 450-MHz ��ǻ�Ϳ��� ���� ���̴�. �� ������ �ϳ��� ���� �ȿ��� 1000 �� �ݺ��Ǿ�����, �� ���� �Լ����� �̸� �����ؼ� ���� ij�ÿ� ������ ij�ø� �̸� ä���ξ���. ����Ŭ ������� ������ ���� �߰��δ㵵 ���ԵǾ� �ִ�. ��ġ��ũ�� ���� ���� �ڵ尡 �η� CD�� ��� �ִ�.

�� �ۿ��� �̾߱��� ���� ������� ���� ���̺��� ij�� �ȿ� ���� �ִ� ��쿡�� ȿ���� �ִ�. ��ü�� ������ �����������̳� ����(physics, ����) ���� ���� ������ ����� ���̺��� ij�� ������ �з����� ���� ���̴�. �׷��� �ڵ� ���� ���⿡�� �Լ�(���̺��� ����ϴ�)�� ȣ���Ѵٸ� ���̺��� ij�� ������ �з��� ���ɼ��� ����. ���� ���̺��� ij�� �ȿ� ������Ű�� ���� �����, ���׽� �ٻ�(polynomial approximation, ������ ����. �̿� ���� ������ [Edwards00]�� �� �Ұ��Ǿ� �ִ�)ó�� ������ ���� �޸� ������ ���� ����� �� ȿ������ ���� �ִ�.

���

�� �ۿ����� �ε��Ҽ��� ����ȭ��� ������ �ϰ����� �Ұ��Ǿ��� ���̴�. �� ���� ���� ���̺� ����� �ַ� �ٷ�� �ִ�. ���� ���̺� ����� ����ϸ� ����� ���� ����� ���� ���� ������, ij���� �۵� ����� �����ؾ� �ϸ�, �׻� ��ü���� ���� ������ ���� ���ƾ� �Ѵ�. ���δ� �� �� �������, �׸��� �޸𸮸� �� �ǵ帮�� ���(���׽� �ٻ� ��)�� ���� ���� ���� ����� ���� ���� �ִ�. �� �ۿ��� ���� �� ������� ���� ���� ������� Ȯ��, ������ �� �ִ�. ���� �ٸ� ����鵵 Ž���� �� �� ���� ���̴�. � ������ å�� ���񿡼�ó��, �ڵ� ����ȭ ������� ��(��)�̶�� ���� �����ϸ�, �� ��ó�� ª�� ���並 ���ؼ��� ��� ���ɼ����� �����ϱⰡ �Ұ����ϴ�.

�����ڷ�