● 型

FLOATEX値と FLOATEX_VALUE 共用体

floatex.h に、FLOATEX_VALUE 共用体が定義されています。

FLOATEX_VALUE 共用体.

typedef union {
    FLOATEX             fex_val;

#ifdef FEX_LONG_DOUBLE_SUPPORT
    long double         ld_val;
#endif

    struct {
        UINT64          mantissa;
        unsigned int    exp : 15;
        unsigned int    sign : 1;
    } bits;
} FLOATEX_VALUE,*PFLOATEX_VALUE;

FLOATEX 型と long double 型を変換する時や、FLOATEX 型を拡張倍精度浮動小数点型のフォーマットに分解する時等に使用します。


デノーマル数

値が 2-16382 よりも小さい場合は、15 ビットのバイアス付き指数では表現する事ができないので、仮数部をビット単位で右シフトして、全体を真の値に近付けます(指数部に入り切らない分を、仮数部を小さくする事で持たせる)。この値は「デノーマル数」と呼ばれます。ビットパターンは指数部が 0 で、仮数部の MSB が 0 となります(MSB が 1 の場合は「擬似デノーマル数」)。
デノーマル数では、仮数部の上位側にゼロを挿入するので、有効桁数が減り、精度が落ちます。

デノーマル数は、無限大や NaN と同じ特殊数という扱いになります。FPU からデノーマル化された結果が返された場合は、アンダーフロー例外が発生した事を意味します。また、デノーマル数を演算しようとした場合は、デノーマライズド・オペランド例外が発生します。


非数(NaN:Not a Number)

仮数部の LSB から 61 bit 目までは、任意の目的で使用する事ができます。

(関連:
「例外処理」floatex_qnanfloatex_snan

テスト. QNaN の各要素を表示する

#include <stdio.h>
#include "floatex.h"

void    main(void)
{
    FLOATEX_VALUE       a;
    unsigned int        oldcw;

    oldcw = floatex_storecw();
    floatex_loadcw(FEX_MCW_EM | FEX_PC_64 | FEX_RC_NEAR);

    floatex_qnan(1,a.fex_val);
    floatex_nabs(a.fex_val);

    printf("  符号:%d\n",a.bits.sign);
    printf("指数部:%x\n",a.bits.exp);
    printf("仮数部:%I64x\n",a.bits.mantissa);

    floatex_loadcw(oldcw);
}


結果.

  符号:1
指数部:7fff
仮数部:c000000000000001