#define FLOATEX_SIZE 10 /* FLOATEX型のサイズ */ typedef unsigned char FLOATEX[FLOATEX_SIZE],*PFLOATEX;FLOATEX型の実体は unsigned char です。
例. #include <stdio.h> #include "floatex.h" int main(void) { FLOATEX a,b; unsigned int oldcw; oldcw = floatex_storecw(); floatex_loadcw(FEX_MCW_EM | FEX_PC_64 | FEX_RC_NEAR); /* double 値 12345.0 を FLOATEX 型に変換し、a へ格納 */ floatex_doubleto( 12345.0, a); /* double 値 67890.0 を FLOATEX 型に変換し、b へ格納 */ floatex_doubleto( 67890.0, b); floatex_add(a,b); /* a = a + b */ /* a の内容を double 型に変換し表示する */ printf("%.16G\n",floatex_todouble(a)); floatex_loadcw(oldcw); return 0; }floatex.dll は、80 bit 精度の long double 型をサポートしていないコンパイラで使用する事を想定しており、ソースコードでの表現上も、数値をバイナリデータとして扱いますが、FPU と直接やり取りするデータなので、内容は拡張倍精度浮動小数点値そのものです(コンパイラが拡張倍精度浮動小数点値を認識しないので、バイナリデータとして扱う)。
PFLOATEX 型とは別に、FLOATEX_TBLPTR 型が定義されています。 この型は、1 要素を 10 バイト単位で操作しますので、複雑なポインタ演算を行う時に便利です。 |
FLOATEX a,b; floatex_copy(b,a); /* b = a */通常は、FLOATEX 型に関する処理である事を明確にするため floatex_copy で統一した方が良いのですが、単純なメモリコピーであれば、どのようなものを用いても問題はありません。
/* コピーサイズに注意 */ memcpy(b,a,FLOATEX_SIZE); CopyMemory(b,a,FLOATEX_SIZE);