● 型

FLOATEX型

floatex.dll では、拡張倍精度浮動小数点の表現に FLOATEX型を定義しています。この定義は floatex.h 内にあります。
    #define FLOATEX_SIZE            10 /* FLOATEX型のサイズ */

    typedef unsigned char       FLOATEX[FLOATEX_SIZE],*PFLOATEX;
FLOATEX型の実体は unsigned char です。

floatex.dll を利用するプログラムは、この変数を用いて 80 bit の浮動小数点演算を行います。値の範囲はおよそ 3.36×10-4932 〜 1.18×104932 となります。

例.

#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 と直接やり取りするデータなので、内容は拡張倍精度浮動小数点値そのものです(コンパイラが拡張倍精度浮動小数点値を認識しないので、バイナリデータとして扱う)。

PFLOTAEX 型は FLOATEX 型のポインタです(頭文字がポインタの "P" )。FLOATEX 型の変数の先頭アドレスを指したり、変数の内容を 1 バイト単位に参照する時に使用する事ができます。
floatex.dll の関数の多くは、引数が PFLOATEX 型になっています。FLOATEX 型は unsigned char 型の配列なので、関数に変数を引数として指定する際に、アンパサンドを付ける必要がありません。

PFLOATEX 型とは別に、FLOATEX_TBLPTR 型が定義されています。
この型は、1 要素を 10 バイト単位で操作しますので、複雑なポインタ演算を行う時に便利です。

FLOATEX型 のコピーには、floatex_copy を用います

    FLOATEX      a,b;

    floatex_copy(b,a); /* b = a */

通常は、FLOATEX 型に関する処理である事を明確にするため floatex_copy で統一した方が良いのですが、単純なメモリコピーであれば、どのようなものを用いても問題はありません。

    /* コピーサイズに注意 */

    memcpy(b,a,FLOATEX_SIZE);

    CopyMemory(b,a,FLOATEX_SIZE);