● ldstr.dll

特殊な値

ldstr は、いくつかの特殊な値に対して、特定の文字列を出力します。
例えば、負のゼロは "-0" を返します。

例."-0" を表示する

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

void __cdecl    main(void)
{
    unsigned int        oldcw;
    FLOATEX             val;
    char                buf[32];

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

    floatex_setz(val); /* 0 のセット */
    floatex_chsign(val);  /* 符号反転 */

    floatex_ldstr_ldtoa(val,buf);
    printf("%s\n",buf);

    floatex_loadcw(oldcw);
}
この他には±∞、±NaN があります(リファレンス floatex_ldstr_ldtoa 参照の事)。「特殊」といっても、処理を行う時にはよく出現する値なので、複雑な計算を行った後の文字列出力は、値の選別を意識しておく必要があります。

0 に符号を付けないようにする一例.

    if (!floatex_nzero(val)) /* 0 の場合は絶対値にする */
        floatex_abs(val);

特殊な値を見分ける関数に floatex_examine があります。文字列へ変換する値を事前に検査する事で、次のように特殊数の表示を拡張する事ができます。

例.

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

int     ldtoaEx(PFLOATEX psrc,char *pdest)
{
    switch(floatex_examine(psrc)){
        case    FEX_EXAM_P_ZERO:
        case    FEX_EXAM_M_ZERO:
                *pdest++ = '0';
                *pdest = 0;
                return 1;

        case    FEX_EXAM_P_DENORMAL:
        case    FEX_EXAM_M_DENORMAL:
                strcpy(pdest,"DEN");
                return 3;

        case    FEX_EXAM_P_NAN:
        case    FEX_EXAM_M_NAN:
                strcpy(pdest,"NAN");
                return 3;

        case    FEX_EXAM_P_INFINITY:
        case    FEX_EXAM_M_INFINITY:
                strcpy(pdest,"INF");
                return 3;

        case    FEX_EXAM_P_UNSUPPORT:
        case    FEX_EXAM_M_UNSUPPORT:
                strcpy(pdest,"UNS");
                return 3;
    }

    return floatex_ldstr_ldtoa(psrc,pdest);
}