double型 → FIXEDVAL型
この処理は、与えられる double値が正規化されている事を前提にしています。
例2.
#include <memory.h>
#include "fixedX.h"
/* double値を FIXEDVAL値に変換する */
void to_fv(double src,PFIXEDVAL pdest,int width)
{
unsigned long *ptr;
int s,exp;
if (src == 0.0){ memset(pdest,0,width); return; }
/* pdest に src の内容を全てコピー */
memset(pdest + sizeof(double ),0,width - sizeof(double ));
*(double *)pdest = src;
ptr = (unsigned long *)pdest;
/* 指数部を抽出しバイアスを除く */
exp = ((ptr[1] >> (32 - 12)) & 0x7ff) - 1023 - 1;
s = ptr[1] >> 31; /* 符号の抽出 */
/* 仮数部上位側の抽出と暗黙整数の追加 */
ptr[1] = (ptr[1] & 0xfffff) | 0x100000;
/* 指数分、仮数部をシフトする */
if ((exp -= 52 - 1) < 0)
fixed_rshift(pdest,-exp,sizeof(double ));
else
fixed_lshift(pdest,exp,width);
if (s) fixed_neg(pdest,width); /* 符号がある場合、負の値にする */
}
この処理では標準ライブラリを使用せず、直に double型を解体します。double値を FIXEDVAL領域へ丸ごとコピーし、領域の中で各種操作を行っています。