● 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);
}