1da2e3ebdSchinset prototyped 27c2fbfb3SApril Chinset nooptimize 3*b30d1939SAndy Fiddamanset stdio FEATURE/standards 4da2e3ebdSchinhdr float,limits,math,values 5*b30d1939SAndy Fiddamanlib,npt frexp,frexpl,ldexp,ldexpl,finite,finitel,isinfl,isnanl,copysign,copysignl FEATURE/standards math.h -lm 6*b30d1939SAndy Fiddamanlib fpclassify -lm note{ fpclassify present and works }end link{ 7*b30d1939SAndy Fiddaman #include <sys/types.h> 8*b30d1939SAndy Fiddaman #include <sys/stat.h> 9*b30d1939SAndy Fiddaman #include <stdlib.h> 10*b30d1939SAndy Fiddaman #include <unistd.h> 11*b30d1939SAndy Fiddaman #include <math.h> 12*b30d1939SAndy Fiddaman int main() { return fpclassify(-0.0); } 13*b30d1939SAndy Fiddaman }end 14*b30d1939SAndy Fiddamanlib isinf -lm note{ isinf present and works }end link{ 15*b30d1939SAndy Fiddaman #include <sys/types.h> 16*b30d1939SAndy Fiddaman #include <sys/stat.h> 17*b30d1939SAndy Fiddaman #include <stdlib.h> 18*b30d1939SAndy Fiddaman #include <unistd.h> 19*b30d1939SAndy Fiddaman #include <math.h> 20*b30d1939SAndy Fiddaman int main() { return isinf(-0.0); } 21*b30d1939SAndy Fiddaman }end 22*b30d1939SAndy Fiddamanlib isnan -lm note{ isnan present and works }end link{ 23*b30d1939SAndy Fiddaman #include <sys/types.h> 24*b30d1939SAndy Fiddaman #include <sys/stat.h> 25*b30d1939SAndy Fiddaman #include <stdlib.h> 26*b30d1939SAndy Fiddaman #include <unistd.h> 27*b30d1939SAndy Fiddaman #include <math.h> 28*b30d1939SAndy Fiddaman int main() { return isnan(-0.0); } 29*b30d1939SAndy Fiddaman }end 30*b30d1939SAndy Fiddamanlib signbit -lm note{ signbit present and works }end link{ 31*b30d1939SAndy Fiddaman #include <sys/types.h> 32*b30d1939SAndy Fiddaman #include <sys/stat.h> 33*b30d1939SAndy Fiddaman #include <stdlib.h> 34*b30d1939SAndy Fiddaman #include <unistd.h> 35*b30d1939SAndy Fiddaman #include <math.h> 36*b30d1939SAndy Fiddaman int main() { return signbit(-0.0); } 37*b30d1939SAndy Fiddaman }end 38da2e3ebdSchin 39da2e3ebdSchintst ast_no_um2fm note{ no unsigned intmax => floatmax cast }end nolink{ 40da2e3ebdSchin #include "FEATURE/common" 41da2e3ebdSchin int 42da2e3ebdSchin main() 43da2e3ebdSchin { 44da2e3ebdSchin _ast_fltmax_t f = 0; 45da2e3ebdSchin unsigned _ast_intmax_t i = 0; 46da2e3ebdSchin f = i; 47da2e3ebdSchin i = f; 48da2e3ebdSchin return f == i; 49da2e3ebdSchin } 50da2e3ebdSchin}end 51da2e3ebdSchin 52da2e3ebdSchintst ast_mpy_overflow_fpe note{ fpe on mpy overflow }end noexecute{ 53da2e3ebdSchin int 54da2e3ebdSchin main() 55da2e3ebdSchin { 56da2e3ebdSchin float f; 57da2e3ebdSchin float p; 58da2e3ebdSchin int i; 59da2e3ebdSchin 60da2e3ebdSchin i = 0; 61da2e3ebdSchin p = f = 1.0; 62da2e3ebdSchin do 63da2e3ebdSchin { 64da2e3ebdSchin p = f; 65da2e3ebdSchin f *= 2.0; 66da2e3ebdSchin } while (f != p && ++i < 1024); 67da2e3ebdSchin return 0; 68da2e3ebdSchin } 69da2e3ebdSchin}end 70da2e3ebdSchin 71da2e3ebdSchintst ast_div_underflow_fpe note{ fpe on div underflow }end noexecute{ 72da2e3ebdSchin int 73da2e3ebdSchin main() 74da2e3ebdSchin { 75da2e3ebdSchin float f; 76da2e3ebdSchin float p; 77da2e3ebdSchin int i; 78da2e3ebdSchin 79da2e3ebdSchin i = 0; 80da2e3ebdSchin p = f = 1.0; 81da2e3ebdSchin do 82da2e3ebdSchin { 83da2e3ebdSchin p = f; 84da2e3ebdSchin f /= 2.0; 85da2e3ebdSchin } while (f != p && ++i < 1024); 86da2e3ebdSchin return 0; 87da2e3ebdSchin } 88da2e3ebdSchin}end 89da2e3ebdSchin 90da2e3ebdSchinmacro{ 91da2e3ebdSchin #if _hdr_float 92da2e3ebdSchin #include <float.h> 93da2e3ebdSchin #endif 94da2e3ebdSchin #if _hdr_limits 95da2e3ebdSchin #include <limits.h> 96da2e3ebdSchin #endif 97da2e3ebdSchin #if _hdr_math 98da2e3ebdSchin #include <math.h> 99da2e3ebdSchin #endif 100da2e3ebdSchin #if _hdr_values 101da2e3ebdSchin #include <values.h> 102da2e3ebdSchin #endif 103da2e3ebdSchin 104da2e3ebdSchin #if !defined(FLT_MIN_EXP) && defined(FMINEXP) 105da2e3ebdSchin #define FLT_MIN_EXP FMINEXP 106da2e3ebdSchin #endif 107da2e3ebdSchin #if !defined(FLT_MIN) && defined(MINFLOAT) 108da2e3ebdSchin #define FLT_MIN MINFLOAT 109da2e3ebdSchin #endif 110da2e3ebdSchin #if !defined(FLT_MAX_EXP) && defined(FMAXEXP) 111da2e3ebdSchin #define FLT_MAX_EXP FMAXEXP 112da2e3ebdSchin #endif 113da2e3ebdSchin #if !defined(FLT_MAX) && defined(MAXFLOAT) 114da2e3ebdSchin #define FLT_MAX MAXFLOAT 115da2e3ebdSchin #endif 116da2e3ebdSchin 117da2e3ebdSchin #if !defined(DBL_MIN_EXP) && defined(DMINEXP) 118da2e3ebdSchin #define DBL_MIN_EXP DMINEXP 119da2e3ebdSchin #endif 120da2e3ebdSchin #if !defined(DBL_MIN) && defined(MINDOUBLE) 121da2e3ebdSchin #define DBL_MIN MINDOUBLE 122da2e3ebdSchin #endif 123da2e3ebdSchin #if !defined(DBL_MAX_EXP) && defined(DMAXEXP) 124da2e3ebdSchin #define DBL_MAX_EXP DMAXEXP 125da2e3ebdSchin #endif 126da2e3ebdSchin #if !defined(DBL_MAX) && defined(MAXDOUBLE) 127da2e3ebdSchin #define DBL_MAX MAXDOUBLE 128da2e3ebdSchin #endif 129da2e3ebdSchin 130da2e3ebdSchin <<"#include <ast_common.h>">> 131da2e3ebdSchin #if _hdr_float 132da2e3ebdSchin <<"#include <float.h>">> 133da2e3ebdSchin #endif 134da2e3ebdSchin #if _hdr_math 135da2e3ebdSchin <<"#include <math.h>">> 136da2e3ebdSchin #endif 137da2e3ebdSchin #ifdef FLT_DIG 138da2e3ebdSchin <<"#ifndef FLT_DIG">> 139da2e3ebdSchin <<"#define FLT_DIG">> FLT_DIG 140da2e3ebdSchin <<"#endif">> 141da2e3ebdSchin #endif 142da2e3ebdSchin #ifdef FLT_MAX 143da2e3ebdSchin <<"#ifndef FLT_MAX">> 144da2e3ebdSchin <<"#define FLT_MAX">> FLT_MAX 145da2e3ebdSchin <<"#endif">> 146da2e3ebdSchin #endif 147da2e3ebdSchin #ifdef FLT_MAX_10_EXP 148da2e3ebdSchin <<"#ifndef FLT_MAX_10_EXP">> 149da2e3ebdSchin <<"#define FLT_MAX_10_EXP">> FLT_MAX_10_EXP 150da2e3ebdSchin <<"#endif">> 151da2e3ebdSchin #endif 152da2e3ebdSchin #ifdef FLT_MAX_EXP 153da2e3ebdSchin <<"#ifndef FLT_MAX_EXP">> 154da2e3ebdSchin <<"#define FLT_MAX_EXP">> FLT_MAX_EXP 155da2e3ebdSchin <<"#endif">> 156da2e3ebdSchin #endif 157da2e3ebdSchin #ifdef FLT_MIN 158da2e3ebdSchin <<"#ifndef FLT_MIN">> 159da2e3ebdSchin <<"#define FLT_MIN">> FLT_MIN 160da2e3ebdSchin <<"#endif">> 161da2e3ebdSchin #endif 162da2e3ebdSchin #ifdef FLT_MIN_10_EXP 163da2e3ebdSchin <<"#ifndef FLT_MIN_10_EXP">> 164da2e3ebdSchin <<"#define FLT_MIN_10_EXP">> FLT_MIN_10_EXP 165da2e3ebdSchin <<"#endif">> 166da2e3ebdSchin #endif 167da2e3ebdSchin #ifdef FLT_MIN_EXP 168da2e3ebdSchin <<"#ifndef FLT_MIN_EXP">> 169da2e3ebdSchin <<"#define FLT_MIN_EXP">> FLT_MIN_EXP 170da2e3ebdSchin <<"#endif">> 171da2e3ebdSchin #endif 172da2e3ebdSchin 173da2e3ebdSchin #ifdef DBL_DIG 174da2e3ebdSchin <<"#ifndef DBL_DIG">> 175da2e3ebdSchin <<"#define DBL_DIG">> DBL_DIG 176da2e3ebdSchin <<"#endif">> 177da2e3ebdSchin #endif 178da2e3ebdSchin #ifdef DBL_MAX 179da2e3ebdSchin <<"#ifndef DBL_MAX">> 180da2e3ebdSchin <<"#define DBL_MAX">> DBL_MAX 181da2e3ebdSchin <<"#endif">> 182da2e3ebdSchin #endif 183da2e3ebdSchin #ifdef DBL_MAX_10_EXP 184da2e3ebdSchin <<"#ifndef DBL_MAX_10_EXP">> 185da2e3ebdSchin <<"#define DBL_MAX_10_EXP">> DBL_MAX_10_EXP 186da2e3ebdSchin <<"#endif">> 187da2e3ebdSchin #endif 188da2e3ebdSchin #ifdef DBL_MAX_EXP 189da2e3ebdSchin <<"#ifndef DBL_MAX_EXP">> 190da2e3ebdSchin <<"#define DBL_MAX_EXP">> DBL_MAX_EXP 191da2e3ebdSchin <<"#endif">> 192da2e3ebdSchin #endif 193da2e3ebdSchin #ifdef DBL_MIN 194da2e3ebdSchin <<"#ifndef DBL_MIN">> 195da2e3ebdSchin <<"#define DBL_MIN">> DBL_MIN 196da2e3ebdSchin <<"#endif">> 197da2e3ebdSchin #endif 198da2e3ebdSchin #ifdef DBL_MIN_10_EXP 199da2e3ebdSchin <<"#ifndef DBL_MIN_10_EXP">> 200da2e3ebdSchin <<"#define DBL_MIN_10_EXP">> DBL_MIN_10_EXP 201da2e3ebdSchin <<"#endif">> 202da2e3ebdSchin #endif 203da2e3ebdSchin #ifdef DBL_MIN_EXP 204da2e3ebdSchin <<"#ifndef DBL_MIN_EXP">> 205da2e3ebdSchin <<"#define DBL_MIN_EXP">> DBL_MIN_EXP 206da2e3ebdSchin <<"#endif">> 207da2e3ebdSchin #endif 208da2e3ebdSchin 209da2e3ebdSchin #ifdef LDBL_DIG 210da2e3ebdSchin <<"#ifndef LDBL_DIG">> 211da2e3ebdSchin <<"#define LDBL_DIG">> LDBL_DIG 212da2e3ebdSchin <<"#endif">> 213da2e3ebdSchin #endif 214da2e3ebdSchin #ifdef LDBL_MAX 215da2e3ebdSchin <<"#ifndef LDBL_MAX">> 216da2e3ebdSchin <<"#define LDBL_MAX">> LDBL_MAX 217da2e3ebdSchin <<"#endif">> 218da2e3ebdSchin #endif 219da2e3ebdSchin #ifdef LDBL_MAX_10_EXP 220da2e3ebdSchin <<"#ifndef LDBL_MAX_10_EXP">> 221da2e3ebdSchin <<"#define LDBL_MAX_10_EXP">> LDBL_MAX_10_EXP 222da2e3ebdSchin <<"#endif">> 223da2e3ebdSchin #endif 224da2e3ebdSchin #ifdef LDBL_MAX_EXP 225da2e3ebdSchin <<"#ifndef LDBL_MAX_EXP">> 226da2e3ebdSchin <<"#define LDBL_MAX_EXP">> LDBL_MAX_EXP 227da2e3ebdSchin <<"#endif">> 228da2e3ebdSchin #endif 229da2e3ebdSchin #ifdef LDBL_MIN 230da2e3ebdSchin <<"#ifndef LDBL_MIN">> 231da2e3ebdSchin <<"#define LDBL_MIN">> LDBL_MIN 232da2e3ebdSchin <<"#endif">> 233da2e3ebdSchin #endif 234da2e3ebdSchin #ifdef LDBL_MIN_10_EXP 235da2e3ebdSchin <<"#ifndef LDBL_MIN_10_EXP">> 236da2e3ebdSchin <<"#define LDBL_MIN_10_EXP">> LDBL_MIN_10_EXP 237da2e3ebdSchin <<"#endif">> 238da2e3ebdSchin #endif 239da2e3ebdSchin #ifdef LDBL_MIN_EXP 240da2e3ebdSchin <<"#ifndef LDBL_MIN_EXP">> 241da2e3ebdSchin <<"#define LDBL_MIN_EXP">> LDBL_MIN_EXP 242da2e3ebdSchin <<"#endif">> 243da2e3ebdSchin #endif 244da2e3ebdSchin}end 245da2e3ebdSchin 246da2e3ebdSchintst - note{ missing floating point limits }end output{ 247da2e3ebdSchin #include "FEATURE/common" 2487c2fbfb3SApril Chin #include <stdio.h> 249da2e3ebdSchin #if _hdr_float 250da2e3ebdSchin #include <float.h> 251da2e3ebdSchin #endif 252da2e3ebdSchin #if _hdr_limits 253da2e3ebdSchin #include <limits.h> 254da2e3ebdSchin #endif 255da2e3ebdSchin #if _hdr_math 256da2e3ebdSchin #include <math.h> 257da2e3ebdSchin #endif 258da2e3ebdSchin #if _hdr_values 259da2e3ebdSchin #include <values.h> 260da2e3ebdSchin #endif 261da2e3ebdSchin #include <signal.h> 262da2e3ebdSchin #ifdef SIGFPE 263da2e3ebdSchin static int caught = 0; 264da2e3ebdSchin #if _STD_ 265da2e3ebdSchin static void catch(int sig) 266da2e3ebdSchin #else 267da2e3ebdSchin static void catch(sig) int sig; 268da2e3ebdSchin #endif 269da2e3ebdSchin { 270da2e3ebdSchin signal(sig, SIG_IGN); 271da2e3ebdSchin caught++; 272da2e3ebdSchin } 273da2e3ebdSchin #endif 274da2e3ebdSchin int 275da2e3ebdSchin main() 276da2e3ebdSchin { 277da2e3ebdSchin register int i; 278da2e3ebdSchin register int s; 279da2e3ebdSchin float f; 280da2e3ebdSchin float pf; 281da2e3ebdSchin float mf; 282da2e3ebdSchin float xf; 283da2e3ebdSchin double d; 284da2e3ebdSchin double pd; 285da2e3ebdSchin double md; 286da2e3ebdSchin char* fp; 287da2e3ebdSchin #if _ast_fltmax_double 288da2e3ebdSchin char* fs = ""; 289da2e3ebdSchin char* ds = ""; 290da2e3ebdSchin #else 291da2e3ebdSchin _ast_fltmax_t l; 292da2e3ebdSchin _ast_fltmax_t pl; 293da2e3ebdSchin _ast_fltmax_t ml; 294da2e3ebdSchin char* fs = "F"; 295da2e3ebdSchin char* ds = ""; 296da2e3ebdSchin char* ls = "L"; 297da2e3ebdSchin #endif 298da2e3ebdSchin unsigned long u; 299da2e3ebdSchin unsigned _ast_intmax_t w; 300da2e3ebdSchin unsigned _ast_intmax_t pw; 301da2e3ebdSchin unsigned _ast_intmax_t x; 302da2e3ebdSchin unsigned short us; 303da2e3ebdSchin unsigned int ui; 304da2e3ebdSchin unsigned long ul; 305da2e3ebdSchin unsigned _ast_intmax_t uq; 306da2e3ebdSchin 307da2e3ebdSchin #ifdef SIGFPE 308da2e3ebdSchin signal(SIGFPE, catch); 309da2e3ebdSchin #endif 310da2e3ebdSchin printf("\n"); 311da2e3ebdSchin printf("\n"); 312da2e3ebdSchin us = 0; 313da2e3ebdSchin us = ~us; 314da2e3ebdSchin i = 0; 315da2e3ebdSchin while (us /= 10) 316da2e3ebdSchin i++; 317da2e3ebdSchin printf("#define USHRT_DIG %d\n", i); 318da2e3ebdSchin ui = 0; 319da2e3ebdSchin ui = ~ui; 320da2e3ebdSchin i = 0; 321da2e3ebdSchin while (ui /= 10) 322da2e3ebdSchin i++; 323da2e3ebdSchin printf("#define UINT_DIG %d\n", i); 324da2e3ebdSchin ul = 0; 325da2e3ebdSchin ul = ~ul; 326da2e3ebdSchin i = 0; 327da2e3ebdSchin while (ul /= 10) 328da2e3ebdSchin i++; 329da2e3ebdSchin printf("#define ULONG_DIG %d\n", i); 330da2e3ebdSchin if (sizeof(uq) > sizeof(ul)) 331da2e3ebdSchin { 332da2e3ebdSchin uq = 0; 333da2e3ebdSchin uq = ~uq; 334da2e3ebdSchin i = 0; 335da2e3ebdSchin while (uq /= 10) 336da2e3ebdSchin i++; 337da2e3ebdSchin printf("#define ULLONG_DIG %d\n", i); 338da2e3ebdSchin printf("#define UINTMAX_DIG ULLONG_DIG\n"); 339da2e3ebdSchin } 340da2e3ebdSchin else 341da2e3ebdSchin printf("#define UINTMAX_DIG ULONG_DIG\n"); 342da2e3ebdSchin printf("\n"); 343da2e3ebdSchin w = 1; 344da2e3ebdSchin do 345da2e3ebdSchin { 346da2e3ebdSchin pw = w; 347da2e3ebdSchin w *= 2; 348da2e3ebdSchin f = (_ast_intmax_t)w; 349da2e3ebdSchin x = (_ast_intmax_t)f; 350da2e3ebdSchin } while (w > pw && w == x); 351da2e3ebdSchin w = (pw - 1) + pw; 352da2e3ebdSchin u = ~0; 353da2e3ebdSchin if (u > w) 354da2e3ebdSchin u = w; 355da2e3ebdSchin printf("#define FLT_ULONG_MAX %lu.0F\n", u); 356da2e3ebdSchin if (sizeof(w) > sizeof(u)) 357da2e3ebdSchin { 358da2e3ebdSchin printf("#define FLT_ULLONG_MAX %llu.0F\n", w); 359da2e3ebdSchin printf("#define FLT_UINTMAX_MAX FLT_ULLONG_MAX\n"); 360da2e3ebdSchin } 361da2e3ebdSchin else 362da2e3ebdSchin { 363da2e3ebdSchin printf("#define FLT_ULLONG_MAX FLT_ULONG_MAX\n"); 364da2e3ebdSchin printf("#define FLT_UINTMAX_MAX FLT_ULONG_MAX\n"); 365da2e3ebdSchin } 366da2e3ebdSchin u /= 2; 367da2e3ebdSchin w /= 2; 368da2e3ebdSchin printf("#define FLT_LONG_MAX %lu.0F\n", u); 369da2e3ebdSchin if (sizeof(w) > sizeof(u)) 370da2e3ebdSchin { 371da2e3ebdSchin printf("#define FLT_LLONG_MAX %llu.0F\n", w); 372da2e3ebdSchin printf("#define FLT_INTMAX_MAX FLT_LLONG_MAX\n"); 373da2e3ebdSchin } 374da2e3ebdSchin else 375da2e3ebdSchin { 376da2e3ebdSchin printf("#define FLT_LLONG_MAX FLT_LONG_MAX\n"); 377da2e3ebdSchin printf("#define FLT_INTMAX_MAX FLT_LONG_MAX\n"); 378da2e3ebdSchin } 379da2e3ebdSchin u++; 380da2e3ebdSchin w++; 381da2e3ebdSchin printf("#define FLT_LONG_MIN (-%lu.0F)\n", u); 382da2e3ebdSchin if (sizeof(w) > sizeof(u)) 383da2e3ebdSchin { 384da2e3ebdSchin printf("#define FLT_LLONG_MIN (-%llu.0F)\n", w); 385da2e3ebdSchin printf("#define FLT_INTMAX_MIN FLT_LLONG_MIN\n"); 386da2e3ebdSchin } 387da2e3ebdSchin else 388da2e3ebdSchin { 389da2e3ebdSchin printf("#define FLT_LLONG_MIN FLT_LONG_MIN\n"); 390da2e3ebdSchin printf("#define FLT_INTMAX_MIN FLT_LONG_MIN\n"); 391da2e3ebdSchin } 392da2e3ebdSchin #ifdef FLT_DIG 393da2e3ebdSchin s = FLT_DIG; 394da2e3ebdSchin #else 395da2e3ebdSchin f = pf = 1.0; 396da2e3ebdSchin s = -1; 397da2e3ebdSchin do 398da2e3ebdSchin { 399da2e3ebdSchin s++; 400da2e3ebdSchin f *= 10.0; 401da2e3ebdSchin } while (f != (f + pf)); 402da2e3ebdSchin #endif 403da2e3ebdSchin #if defined(FLT_MIN) && defined(FLT_MIN_EXP) 404da2e3ebdSchin i = FLT_MIN_EXP; 405da2e3ebdSchin mf = FLT_MIN; 406da2e3ebdSchin #else 407da2e3ebdSchin i = 3; 408da2e3ebdSchin f = pf = 1.0; 409da2e3ebdSchin do 410da2e3ebdSchin { 411da2e3ebdSchin i--; 412da2e3ebdSchin mf = pf; 413da2e3ebdSchin pf = f; 414da2e3ebdSchin f /= 2.0; 415da2e3ebdSchin } while (f < pf); 416da2e3ebdSchin #ifdef FLT_MIN_EXP 417da2e3ebdSchin i = FLT_MIN_EXP; 418da2e3ebdSchin #endif 419da2e3ebdSchin #ifdef FLT_MIN 420da2e3ebdSchin mf = FLT_MIN; 421da2e3ebdSchin #endif 422da2e3ebdSchin #endif 423da2e3ebdSchin #ifndef FLT_DIG 424da2e3ebdSchin printf("#ifndef FLT_DIG\n"); 425da2e3ebdSchin printf("#define FLT_DIG %d\n", s); 426da2e3ebdSchin printf("#endif\n"); 427da2e3ebdSchin #endif 428da2e3ebdSchin #ifndef FLT_MIN 429da2e3ebdSchin printf("#ifndef FLT_MIN\n"); 430da2e3ebdSchin printf("#define FLT_MIN %.*E%s\n", s + 1, mf, fs); 431da2e3ebdSchin printf("#endif\n"); 432da2e3ebdSchin #endif 433da2e3ebdSchin #ifndef FLT_MIN_EXP 434da2e3ebdSchin printf("#ifndef FLT_MIN_EXP\n"); 435da2e3ebdSchin printf("#define FLT_MIN_EXP (%d)\n", i); 436da2e3ebdSchin printf("#endif\n"); 437da2e3ebdSchin #endif 438da2e3ebdSchin 439da2e3ebdSchin #if defined(FLT_MAX) && defined(FLT_MAX_EXP) 440da2e3ebdSchin i = FLT_MAX_EXP; 441da2e3ebdSchin f = FLT_MAX; 442da2e3ebdSchin #else 443da2e3ebdSchin i = -1; 444da2e3ebdSchin f = pf = 1.0; 445da2e3ebdSchin do 446da2e3ebdSchin { 447da2e3ebdSchin i++; 448da2e3ebdSchin mf = pf; 449da2e3ebdSchin pf = f; 450da2e3ebdSchin f *= 2.0; 451da2e3ebdSchin } while (f > pf); 452da2e3ebdSchin #ifdef FLT_MAX_EXP 453da2e3ebdSchin i = FLT_MAX_EXP; 454da2e3ebdSchin #endif 455da2e3ebdSchin #ifdef FLT_MAX 456da2e3ebdSchin f = FLT_MAX; 457da2e3ebdSchin #endif 458da2e3ebdSchin #endif 459da2e3ebdSchin #ifdef FLT_MAX_EXP 460da2e3ebdSchin i = FLT_MAX_EXP; 461da2e3ebdSchin #else 462da2e3ebdSchin f = 1; 463da2e3ebdSchin do 464da2e3ebdSchin { 465da2e3ebdSchin f *= 2.0; 466da2e3ebdSchin } while (mf == (mf + f)); 467da2e3ebdSchin f = (mf - f) * 2.0 + f; 468da2e3ebdSchin #endif 469da2e3ebdSchin xf = f; 470da2e3ebdSchin #ifndef FLT_MAX 471da2e3ebdSchin printf("#ifndef FLT_MAX\n"); 472da2e3ebdSchin printf("#define FLT_MAX %.*E%s\n", s + 1, f, fs); 473da2e3ebdSchin printf("#endif\n"); 474da2e3ebdSchin #endif 475da2e3ebdSchin #ifndef FLT_MAX_EXP 476da2e3ebdSchin printf("#ifndef FLT_MAX_EXP\n"); 477da2e3ebdSchin printf("#define FLT_MAX_EXP %d\n", i); 478da2e3ebdSchin printf("#endif\n"); 479da2e3ebdSchin #endif 480da2e3ebdSchin 481da2e3ebdSchin #ifdef FLT_MIN_10_EXP 482da2e3ebdSchin i = FLT_MIN_10_EXP; 483da2e3ebdSchin #else 484da2e3ebdSchin i = 2; 485da2e3ebdSchin f = 1.0; 486da2e3ebdSchin do 487da2e3ebdSchin { 488da2e3ebdSchin i--; 489da2e3ebdSchin pf = f; 490da2e3ebdSchin f /= 10.0; 491da2e3ebdSchin } while (f < pf); 492da2e3ebdSchin #endif 493da2e3ebdSchin #ifndef FLT_MIN_10_EXP 494da2e3ebdSchin printf("#ifndef FLT_MIN_10_EXP\n"); 495da2e3ebdSchin printf("#define FLT_MIN_10_EXP (%d)\n", i); 496da2e3ebdSchin printf("#endif\n"); 497da2e3ebdSchin #endif 498da2e3ebdSchin 499da2e3ebdSchin #ifdef FLT_MAX_10_EXP 500da2e3ebdSchin i = FLT_MAX_10_EXP; 501da2e3ebdSchin #else 502da2e3ebdSchin i = -2; 503da2e3ebdSchin f = 1.0; 504da2e3ebdSchin do 505da2e3ebdSchin { 506da2e3ebdSchin i++; 507da2e3ebdSchin pf = f; 508da2e3ebdSchin f *= 10.0; 509da2e3ebdSchin } while (f > pf); 510da2e3ebdSchin #endif 511da2e3ebdSchin #ifndef FLT_MAX_10_EXP 512da2e3ebdSchin printf("#ifndef FLT_MAX_10_EXP\n"); 513da2e3ebdSchin printf("#define FLT_MAX_10_EXP %d\n", i); 514da2e3ebdSchin printf("#endif\n"); 515da2e3ebdSchin #endif 516da2e3ebdSchin 517da2e3ebdSchin printf("\n"); 518da2e3ebdSchin w = 1; 519da2e3ebdSchin do 520da2e3ebdSchin { 521da2e3ebdSchin pw = w; 522da2e3ebdSchin w *= 2; 523da2e3ebdSchin d = (_ast_intmax_t)w; 524da2e3ebdSchin x = (_ast_intmax_t)d; 525da2e3ebdSchin } while (w > pw && w == x); 526da2e3ebdSchin w = (pw - 1) + pw; 527da2e3ebdSchin u = ~0; 528da2e3ebdSchin if (u > w) 529da2e3ebdSchin u = w; 530da2e3ebdSchin printf("#define DBL_ULONG_MAX %lu.0\n", u); 531da2e3ebdSchin if (sizeof(w) > sizeof(u)) 532da2e3ebdSchin { 533da2e3ebdSchin printf("#define DBL_ULLONG_MAX %llu.0\n", w); 534da2e3ebdSchin printf("#define DBL_UINTMAX_MAX DBL_ULLONG_MAX\n"); 535da2e3ebdSchin } 536da2e3ebdSchin else 537da2e3ebdSchin { 538da2e3ebdSchin printf("#define DBL_ULLONG_MAX DBL_ULONG_MAX\n"); 539da2e3ebdSchin printf("#define DBL_UINTMAX_MAX DBL_ULONG_MAX\n"); 540da2e3ebdSchin } 541da2e3ebdSchin u /= 2; 542da2e3ebdSchin w /= 2; 543da2e3ebdSchin printf("#define DBL_LONG_MAX %lu.0\n", u); 544da2e3ebdSchin if (sizeof(w) > sizeof(u)) 545da2e3ebdSchin { 546da2e3ebdSchin printf("#define DBL_LLONG_MAX %llu.0\n", w); 547da2e3ebdSchin printf("#define DBL_INTMAX_MAX DBL_LLONG_MAX\n"); 548da2e3ebdSchin } 549da2e3ebdSchin else 550da2e3ebdSchin { 551da2e3ebdSchin printf("#define DBL_LLONG_MAX DBL_LONG_MAX\n"); 552da2e3ebdSchin printf("#define DBL_INTMAX_MAX DBL_LONG_MAX\n"); 553da2e3ebdSchin } 554da2e3ebdSchin u++; 555da2e3ebdSchin w++; 556da2e3ebdSchin printf("#define DBL_LONG_MIN (-%lu.0)\n", u); 557da2e3ebdSchin if (sizeof(w) > sizeof(u)) 558da2e3ebdSchin { 559da2e3ebdSchin printf("#define DBL_LLONG_MIN (-%llu.0)\n", w); 560da2e3ebdSchin printf("#define DBL_INTMAX_MIN DBL_LLONG_MIN\n"); 561da2e3ebdSchin } 562da2e3ebdSchin else 563da2e3ebdSchin { 564da2e3ebdSchin printf("#define DBL_LLONG_MIN DBL_LONG_MIN\n"); 565da2e3ebdSchin printf("#define DBL_INTMAX_MIN DBL_LONG_MIN\n"); 566da2e3ebdSchin } 567da2e3ebdSchin #ifdef DBL_DIG 568da2e3ebdSchin s = DBL_DIG; 569da2e3ebdSchin #else 570da2e3ebdSchin d = pd = 1.0; 571da2e3ebdSchin s = -1; 572da2e3ebdSchin do 573da2e3ebdSchin { 574da2e3ebdSchin s++; 575da2e3ebdSchin d *= 10.0; 576da2e3ebdSchin } while (d != (d + pd)); 577da2e3ebdSchin #endif 578da2e3ebdSchin #if defined(DBL_MIN) && defined(DBL_MIN_EXP) 579da2e3ebdSchin i = DBL_MIN_EXP; 580da2e3ebdSchin md = DBL_MIN; 581da2e3ebdSchin #else 582da2e3ebdSchin i = 3; 583da2e3ebdSchin d = pd = 1.0; 584da2e3ebdSchin do 585da2e3ebdSchin { 586da2e3ebdSchin i--; 587da2e3ebdSchin md = pd; 588da2e3ebdSchin pd = d; 589da2e3ebdSchin d /= 2.0; 590da2e3ebdSchin } while (d < pd); 591da2e3ebdSchin #ifdef DBL_MIN_EXP 592da2e3ebdSchin i = DBL_MIN_EXP; 593da2e3ebdSchin #endif 594da2e3ebdSchin #ifdef DBL_MIN 595da2e3ebdSchin md = DBL_MIN; 596da2e3ebdSchin #endif 597da2e3ebdSchin #endif 598da2e3ebdSchin #ifndef DBL_DIG 599da2e3ebdSchin printf("#ifndef DBL_DIG\n"); 600da2e3ebdSchin printf("#define DBL_DIG %d\n", s); 601da2e3ebdSchin printf("#endif\n"); 602da2e3ebdSchin #endif 603da2e3ebdSchin #ifndef DBL_MIN 604da2e3ebdSchin printf("#ifndef DBL_MIN\n"); 605da2e3ebdSchin printf("#define DBL_MIN %.*E%s\n", s + 1, md, ds); 606da2e3ebdSchin printf("#endif\n"); 607da2e3ebdSchin #endif 608da2e3ebdSchin #ifndef DBL_MIN_EXP 609da2e3ebdSchin printf("#ifndef DBL_MIN_EXP\n"); 610da2e3ebdSchin printf("#define DBL_MIN_EXP (%d)\n", i); 611da2e3ebdSchin printf("#endif\n"); 612da2e3ebdSchin #endif 613da2e3ebdSchin 614da2e3ebdSchin #if defined(DBL_MAX) && defined(DBL_MAX_EXP) 615da2e3ebdSchin i = DBL_MAX_EXP; 616da2e3ebdSchin d = DBL_MAX; 617da2e3ebdSchin #else 618da2e3ebdSchin i = -1; 619da2e3ebdSchin d = pd = 1.0; 620da2e3ebdSchin do 621da2e3ebdSchin { 622da2e3ebdSchin i++; 623da2e3ebdSchin md = pd; 624da2e3ebdSchin pd = d; 625da2e3ebdSchin d *= 2.0; 626da2e3ebdSchin } while (d > pd); 627da2e3ebdSchin d = 1.0; 628da2e3ebdSchin do 629da2e3ebdSchin { 630da2e3ebdSchin d *= 2.0; 631da2e3ebdSchin } while (md == (md + d)); 632da2e3ebdSchin d = (md - d) * 2.0 + d; 633da2e3ebdSchin #ifdef DBL_MAX_EXP 634da2e3ebdSchin i = DBL_MAX_EXP; 635da2e3ebdSchin #endif 636da2e3ebdSchin #ifdef DBL_MAX 637da2e3ebdSchin d = DBL_MAX; 638da2e3ebdSchin #endif 639da2e3ebdSchin #endif 640da2e3ebdSchin #ifndef DBL_MAX 641da2e3ebdSchin printf("#ifndef DBL_MAX\n"); 642da2e3ebdSchin printf("#define DBL_MAX %.*E%s\n", s + 1, d, ds); 643da2e3ebdSchin printf("#endif\n"); 644da2e3ebdSchin #endif 645da2e3ebdSchin #ifndef DBL_MAX_EXP 646da2e3ebdSchin printf("#ifndef DBL_MAX_EXP\n"); 647da2e3ebdSchin printf("#define DBL_MAX_EXP %d\n", i); 648da2e3ebdSchin printf("#endif\n"); 649da2e3ebdSchin #endif 650da2e3ebdSchin 651da2e3ebdSchin #ifdef DBL_MIN_10_EXP 652da2e3ebdSchin i = DBL_MIN_10_EXP; 653da2e3ebdSchin #else 654da2e3ebdSchin i = 2; 655da2e3ebdSchin d = 1.0; 656da2e3ebdSchin do 657da2e3ebdSchin { 658da2e3ebdSchin i--; 659da2e3ebdSchin pd = d; 660da2e3ebdSchin d /= 10.0; 661da2e3ebdSchin } while (d < pd); 662da2e3ebdSchin #endif 663da2e3ebdSchin #ifndef DBL_MIN_10_EXP 664da2e3ebdSchin printf("#ifndef DBL_MIN_10_EXP\n"); 665da2e3ebdSchin printf("#define DBL_MIN_10_EXP (%d)\n", i); 666da2e3ebdSchin printf("#endif\n"); 667da2e3ebdSchin #endif 668da2e3ebdSchin 669da2e3ebdSchin #ifdef DBL_MAX_10_EXP 670da2e3ebdSchin i = DBL_MAX_10_EXP; 671da2e3ebdSchin #else 672da2e3ebdSchin i = -2; 673da2e3ebdSchin d = 1.0; 674da2e3ebdSchin do 675da2e3ebdSchin { 676da2e3ebdSchin i++; 677da2e3ebdSchin pd = d; 678da2e3ebdSchin d *= 10.0; 679da2e3ebdSchin } while (d > pd); 680da2e3ebdSchin #endif 681da2e3ebdSchin #ifndef DBL_MAX_10_EXP 682da2e3ebdSchin printf("#ifndef DBL_MAX_10_EXP\n"); 683da2e3ebdSchin printf("#define DBL_MAX_10_EXP %d\n", i); 684da2e3ebdSchin printf("#endif\n"); 685da2e3ebdSchin #endif 686da2e3ebdSchin 687da2e3ebdSchin #if !_ast_fltmax_double 688da2e3ebdSchin printf("\n"); 689da2e3ebdSchin w = 1; 690da2e3ebdSchin do 691da2e3ebdSchin { 692da2e3ebdSchin pw = w; 693da2e3ebdSchin w *= 2; 694da2e3ebdSchin l = (_ast_intmax_t)w; 695da2e3ebdSchin x = (_ast_intmax_t)l; 696da2e3ebdSchin } while (w > pw && w == x); 697da2e3ebdSchin w = (pw - 1) + pw; 698da2e3ebdSchin u = ~0; 699da2e3ebdSchin if (u > w) 700da2e3ebdSchin u = w; 701da2e3ebdSchin printf("#define LDBL_ULONG_MAX %lu.0L\n", u); 702da2e3ebdSchin if (sizeof(w) > sizeof(u)) 703da2e3ebdSchin { 704da2e3ebdSchin printf("#define LDBL_ULLONG_MAX %llu.0L\n", w); 705da2e3ebdSchin printf("#define LDBL_UINTMAX_MAX LDBL_ULLONG_MAX\n"); 706da2e3ebdSchin } 707da2e3ebdSchin else 708da2e3ebdSchin { 709da2e3ebdSchin printf("#define LDBL_ULLONG_MAX LDBL_ULONG_MAX\n"); 710da2e3ebdSchin printf("#define LDBL_UINTMAX_MAX LDBL_ULONG_MAX\n"); 711da2e3ebdSchin } 712da2e3ebdSchin u /= 2; 713da2e3ebdSchin w /= 2; 714da2e3ebdSchin printf("#define LDBL_LONG_MAX %lu.0L\n", u); 715da2e3ebdSchin if (sizeof(w) > sizeof(u)) 716da2e3ebdSchin { 717da2e3ebdSchin printf("#define LDBL_LLONG_MAX %llu.0L\n", w); 718da2e3ebdSchin printf("#define LDBL_INTMAX_MAX LDBL_LLONG_MAX\n"); 719da2e3ebdSchin } 720da2e3ebdSchin else 721da2e3ebdSchin { 722da2e3ebdSchin printf("#define LDBL_LLONG_MAX LDBL_LONG_MAX\n"); 723da2e3ebdSchin printf("#define LDBL_INTMAX_MAX LDBL_LONG_MAX\n"); 724da2e3ebdSchin } 725da2e3ebdSchin u++; 726da2e3ebdSchin w++; 727da2e3ebdSchin printf("#define LDBL_LONG_MIN (-%lu.0L)\n", u); 728da2e3ebdSchin if (sizeof(w) > sizeof(u)) 729da2e3ebdSchin { 730da2e3ebdSchin printf("#define LDBL_LLONG_MIN (-%llu.0L)\n", w); 731da2e3ebdSchin printf("#define LDBL_INTMAX_MIN LDBL_LLONG_MIN\n"); 732da2e3ebdSchin } 733da2e3ebdSchin else 734da2e3ebdSchin { 735da2e3ebdSchin printf("#define LDBL_LLONG_MIN LDBL_LONG_MIN\n"); 736da2e3ebdSchin printf("#define LDBL_INTMAX_MIN LDBL_LONG_MIN\n"); 737da2e3ebdSchin } 738da2e3ebdSchin #ifdef LDBL_DIG 739da2e3ebdSchin s = LDBL_DIG; 740da2e3ebdSchin #else 741da2e3ebdSchin l = pl = 1.0L; 742da2e3ebdSchin s = -1; 743da2e3ebdSchin do 744da2e3ebdSchin { 745da2e3ebdSchin s++; 746da2e3ebdSchin l *= 10.0L; 747da2e3ebdSchin } while (l != (l + pl)); 748da2e3ebdSchin #endif 749da2e3ebdSchin #if defined(LDBL_MIN) && defined(LDBL_MIN_EXP) 750da2e3ebdSchin i = LDBL_MIN_EXP; 751da2e3ebdSchin ml = LDBL_MIN; 752da2e3ebdSchin #else 753da2e3ebdSchin i = 3; 754da2e3ebdSchin l = pl = 1.0L; 755da2e3ebdSchin do 756da2e3ebdSchin { 757da2e3ebdSchin i--; 758da2e3ebdSchin ml = pl; 759da2e3ebdSchin pl = l; 760da2e3ebdSchin l /= 2.0L; 761da2e3ebdSchin } while (l < pl); 762da2e3ebdSchin #ifdef LDBL_MIN_EXP 763da2e3ebdSchin i = LDBL_MIN_EXP; 764da2e3ebdSchin #endif 765da2e3ebdSchin #ifdef LDBL_MIN 766da2e3ebdSchin ml = LDBL_MIN; 767da2e3ebdSchin #endif 768da2e3ebdSchin #endif 769da2e3ebdSchin #ifndef LDBL_DIG 770da2e3ebdSchin printf("#ifndef LDBL_DIG\n"); 771da2e3ebdSchin printf("#define LDBL_DIG %d\n", s); 772da2e3ebdSchin printf("#endif\n"); 773da2e3ebdSchin #endif 774da2e3ebdSchin #ifndef LDBL_MIN 775da2e3ebdSchin printf("#ifndef LDBL_MIN\n"); 776da2e3ebdSchin printf("#define LDBL_MIN %.*LE%s\n", s + 1, ml, ls); 777da2e3ebdSchin printf("#endif\n"); 778da2e3ebdSchin #endif 779da2e3ebdSchin #ifndef LDBL_MIN_EXP 780da2e3ebdSchin printf("#ifndef LDBL_MIN_EXP\n"); 781da2e3ebdSchin printf("#define LDBL_MIN_EXP (%d)\n", i); 782da2e3ebdSchin printf("#endif\n"); 783da2e3ebdSchin #endif 784da2e3ebdSchin 785da2e3ebdSchin #if defined(LDBL_MAX) && defined(LDBL_MAX_EXP) 786da2e3ebdSchin i = LDBL_MAX_EXP; 787da2e3ebdSchin l = LDBL_MAX; 788da2e3ebdSchin #else 789da2e3ebdSchin i = -1; 790da2e3ebdSchin l = pl = 1.0L; 791da2e3ebdSchin do 792da2e3ebdSchin { 793da2e3ebdSchin i++; 794da2e3ebdSchin ml = pl; 795da2e3ebdSchin pl = l; 796da2e3ebdSchin l *= 2.0L; 797da2e3ebdSchin } while (l > pl); 798da2e3ebdSchin l = 1.0L; 799da2e3ebdSchin do 800da2e3ebdSchin { 801da2e3ebdSchin l *= 2.0L; 802da2e3ebdSchin } while (ml == (ml + l)); 803da2e3ebdSchin l = (ml - l) * 2.0L + l; 804da2e3ebdSchin #ifdef LDBL_MAX_EXP 805da2e3ebdSchin i = LDBL_MAX_EXP; 806da2e3ebdSchin #endif 807da2e3ebdSchin #ifdef LDBL_MAX 808da2e3ebdSchin l = LDBL_MAX; 809da2e3ebdSchin #endif 810da2e3ebdSchin #endif 811da2e3ebdSchin #ifndef LDBL_MAX 812da2e3ebdSchin printf("#ifndef LDBL_MAX\n"); 813da2e3ebdSchin printf("#define LDBL_MAX %.*LE%s\n", s + 1, l, ls); 814da2e3ebdSchin printf("#endif\n"); 815da2e3ebdSchin #endif 816da2e3ebdSchin #ifndef LDBL_MAX_EXP 817da2e3ebdSchin printf("#ifndef LDBL_MAX_EXP\n"); 818da2e3ebdSchin printf("#define LDBL_MAX_EXP %d\n", i); 819da2e3ebdSchin printf("#endif\n"); 820da2e3ebdSchin #endif 821da2e3ebdSchin 822da2e3ebdSchin #ifdef LDBL_MIN_10_EXP 823da2e3ebdSchin i = LDBL_MIN_10_EXP; 824da2e3ebdSchin #else 825da2e3ebdSchin i = 2; 826da2e3ebdSchin l = 1.0L; 827da2e3ebdSchin do 828da2e3ebdSchin { 829da2e3ebdSchin i--; 830da2e3ebdSchin pl = l; 831da2e3ebdSchin l /= 10.0L; 832da2e3ebdSchin } while (l < pl); 833da2e3ebdSchin #endif 834da2e3ebdSchin #ifndef LDBL_MIN_10_EXP 835da2e3ebdSchin printf("#ifndef LDBL_MIN_10_EXP\n"); 836da2e3ebdSchin printf("#define LDBL_MIN_10_EXP (%d)\n", i); 837da2e3ebdSchin printf("#endif\n"); 838da2e3ebdSchin #endif 839da2e3ebdSchin 840da2e3ebdSchin #ifdef LDBL_MAX_10_EXP 841da2e3ebdSchin i = LDBL_MAX_10_EXP; 842da2e3ebdSchin #else 843da2e3ebdSchin i = -2; 844da2e3ebdSchin l = 1.0L; 845da2e3ebdSchin do 846da2e3ebdSchin { 847da2e3ebdSchin i++; 848da2e3ebdSchin pl = l; 849da2e3ebdSchin l *= 10.0L; 850da2e3ebdSchin } while (l > pl); 851da2e3ebdSchin #endif 852da2e3ebdSchin #ifndef LDBL_MAX_10_EXP 853da2e3ebdSchin printf("#ifndef LDBL_MAX_10_EXP\n"); 854da2e3ebdSchin printf("#define LDBL_MAX_10_EXP %d\n", i); 855da2e3ebdSchin printf("#endif\n"); 856da2e3ebdSchin #endif 857da2e3ebdSchin fp = "LDBL"; 858da2e3ebdSchin #else 859da2e3ebdSchin fp = "DBL"; 860da2e3ebdSchin #endif 861da2e3ebdSchin 862da2e3ebdSchin printf("\n"); 863da2e3ebdSchin printf("#define FLTMAX_UINTMAX_MAX %s_UINTMAX_MAX\n", fp); 864da2e3ebdSchin printf("#define FLTMAX_INTMAX_MAX %s_INTMAX_MAX\n", fp); 865da2e3ebdSchin printf("#define FLTMAX_INTMAX_MIN %s_INTMAX_MIN\n", fp); 866da2e3ebdSchin 867da2e3ebdSchin #ifdef SIGFPE 868da2e3ebdSchin if (!caught) 869da2e3ebdSchin { 870da2e3ebdSchin #if !__MVS__ 871da2e3ebdSchin f = xf; 872da2e3ebdSchin f *= 2; 873da2e3ebdSchin if (!f) 874da2e3ebdSchin #endif 875da2e3ebdSchin caught = 1; 876da2e3ebdSchin } 877da2e3ebdSchin if (caught) 878da2e3ebdSchin printf("\n#define _ast_fltsig %d\n", SIGFPE); 879da2e3ebdSchin #endif 880da2e3ebdSchin 881da2e3ebdSchin printf("\n"); 882*b30d1939SAndy Fiddaman #if !_lib_frexp || _npt_frexp 883da2e3ebdSchin printf("extern double frexp(double, int*);\n"); 884da2e3ebdSchin #endif 885*b30d1939SAndy Fiddaman #if !_lib_frexpl || _npt_frexpl 886da2e3ebdSchin printf("extern _ast_fltmax_t frexpl(_ast_fltmax_t, int*);\n"); 887da2e3ebdSchin #endif 888*b30d1939SAndy Fiddaman #if !_lib_ldexp || _npt_ldexp 889da2e3ebdSchin printf("extern double ldexp(double, int);\n"); 890da2e3ebdSchin #endif 891*b30d1939SAndy Fiddaman #if !_lib_ldexpl || _npt_ldexpl 892da2e3ebdSchin printf("extern _ast_fltmax_t ldexpl(_ast_fltmax_t, int);\n"); 893da2e3ebdSchin #endif 894da2e3ebdSchin 895da2e3ebdSchin return 0; 896da2e3ebdSchin } 897da2e3ebdSchin}end 898da2e3ebdSchin 899da2e3ebdSchintst - note{ double exponent bitfoolery }end output{ 900da2e3ebdSchin #include "FEATURE/common" 9017c2fbfb3SApril Chin #include <stdio.h> 902da2e3ebdSchin typedef union _dbl_exp_u 903da2e3ebdSchin { 904da2e3ebdSchin unsigned _ast_int4_t e[sizeof(double) / 4]; 905da2e3ebdSchin double f; 906da2e3ebdSchin } _ast_dbl_exp_t; 907da2e3ebdSchin int 908da2e3ebdSchin main() 909da2e3ebdSchin { 910da2e3ebdSchin int i; 911da2e3ebdSchin int j; 912da2e3ebdSchin unsigned _ast_int4_t e; 913da2e3ebdSchin _ast_dbl_exp_t a; 914da2e3ebdSchin _ast_dbl_exp_t b; 915da2e3ebdSchin a.f = 1; 916da2e3ebdSchin b.f = 2; 917da2e3ebdSchin for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++) 918da2e3ebdSchin if (e = a.e[i] ^ b.e[i]) 919da2e3ebdSchin { 920da2e3ebdSchin for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++) 921da2e3ebdSchin if (a.e[j] ^ b.e[j]) 922da2e3ebdSchin return 0; 923da2e3ebdSchin printf("typedef union _ast_dbl_exp_u\n{\n\tuint32_t\t\te[sizeof(double)/4];\n\tdouble\t\t\tf;\n} _ast_dbl_exp_t;\n\n"); 924da2e3ebdSchin printf("#define _ast_dbl_exp_index %d\n", i); 925da2e3ebdSchin for (i = 0; !(e & 1); e >>= 1, i++); 926da2e3ebdSchin printf("#define _ast_dbl_exp_shift %d\n\n", i); 927da2e3ebdSchin return 0; 928da2e3ebdSchin } 929da2e3ebdSchin return 0; 930da2e3ebdSchin } 931da2e3ebdSchin}end 932da2e3ebdSchin 933da2e3ebdSchintst - note{ long double exponent bitfoolery }end output{ 934da2e3ebdSchin #include "FEATURE/common" 9357c2fbfb3SApril Chin #include <stdio.h> 936da2e3ebdSchin typedef union _ast_fltmax_exp_u 937da2e3ebdSchin { 938da2e3ebdSchin unsigned _ast_int4_t e[sizeof(_ast_fltmax_t) / 4]; 939da2e3ebdSchin _ast_fltmax_t f; 940da2e3ebdSchin } _ast_fltmax_exp_t; 941da2e3ebdSchin int 942da2e3ebdSchin main() 943da2e3ebdSchin { 944da2e3ebdSchin int i; 945da2e3ebdSchin int j; 946da2e3ebdSchin unsigned _ast_int4_t e; 947da2e3ebdSchin _ast_fltmax_exp_t a; 948da2e3ebdSchin _ast_fltmax_exp_t b; 949da2e3ebdSchin a.f = 1; 950da2e3ebdSchin b.f = 2; 951da2e3ebdSchin for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++) 952da2e3ebdSchin if (e = a.e[i] ^ b.e[i]) 953da2e3ebdSchin { 954da2e3ebdSchin for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++) 955da2e3ebdSchin if (a.e[j] ^ b.e[j]) 956da2e3ebdSchin return 0; 957da2e3ebdSchin printf("typedef union _fltmax_exp_u\n{\n\tuint32_t\t\te[sizeof(_ast_fltmax_t)/4];\n\t_ast_fltmax_t\t\tf;\n} _ast_fltmax_exp_t;\n\n"); 958da2e3ebdSchin printf("#define _ast_fltmax_exp_index\t%d\n", i); 959da2e3ebdSchin for (i = 0; !(e & 1); e >>= 1, i++); 960da2e3ebdSchin printf("#define _ast_fltmax_exp_shift\t%d\n\n", i); 961da2e3ebdSchin return 0; 962da2e3ebdSchin } 963da2e3ebdSchin return 0; 964da2e3ebdSchin } 965da2e3ebdSchin}end 966da2e3ebdSchin 967da2e3ebdSchintst - -DN=1 - -DN=2 note{ _ast_fltmax_t maximum integral type }end output{ 9687c2fbfb3SApril Chin #include <stdio.h> 969da2e3ebdSchin int 970da2e3ebdSchin main() 971da2e3ebdSchin { 972da2e3ebdSchin #if N == 1 973da2e3ebdSchin unsigned long long m; 974da2e3ebdSchin long double f = 123.456; 975da2e3ebdSchin 976da2e3ebdSchin m = f; 977da2e3ebdSchin if (!m || f == m) 978da2e3ebdSchin return 1; 979da2e3ebdSchin printf("#define _ast_flt_unsigned_max_t unsigned long long\n"); 980da2e3ebdSchin #else 981da2e3ebdSchin printf("#define _ast_flt_unsigned_max_t unsigned long\n"); 982da2e3ebdSchin #endif 983da2e3ebdSchin return 0; 984da2e3ebdSchin } 985da2e3ebdSchin}end 986da2e3ebdSchin 98734f9b3eeSRoland Mainztst - -DSCAN=1 - -lm -DSTRTO=1 - -DMAC=1 - -DDIV=1 - -DEXP=1 - -DADD=1 - -DMPY=1 note{ INF and NAN memory representations }end output{ 98834f9b3eeSRoland Mainz #if MAC 98934f9b3eeSRoland Mainz #define _AIX_COMPATIBILITY 1 99034f9b3eeSRoland Mainz #define _FP_MODE_VARIABLE 1 99134f9b3eeSRoland Mainz #endif 992da2e3ebdSchin #include "FEATURE/common" 9937c2fbfb3SApril Chin #include <stdio.h> 994da2e3ebdSchin #include <sys/types.h> 995da2e3ebdSchin #include <signal.h> 996*b30d1939SAndy Fiddaman #include <strings.h> 997da2e3ebdSchin #if _hdr_float 998da2e3ebdSchin #include <float.h> 999da2e3ebdSchin #endif 1000da2e3ebdSchin #if _hdr_limits 1001da2e3ebdSchin #include <limits.h> 1002da2e3ebdSchin #endif 1003da2e3ebdSchin #if _hdr_math 1004da2e3ebdSchin #include <math.h> 1005da2e3ebdSchin #endif 1006da2e3ebdSchin #if _hdr_values 1007da2e3ebdSchin #include <values.h> 1008da2e3ebdSchin #endif 1009da2e3ebdSchin #if STRTO && _hdr_stdlib 1010da2e3ebdSchin #include <stdlib.h> 1011da2e3ebdSchin #endif 1012da2e3ebdSchin #if !defined(FLT_MAX) && defined(MAXFLOAT) 1013da2e3ebdSchin #define FLT_MAX MAXFLOAT 1014da2e3ebdSchin #endif 1015da2e3ebdSchin #if !defined(DBL_MAX) && defined(MAXDOUBLE) 1016da2e3ebdSchin #define DBL_MAX MAXDOUBLE 1017da2e3ebdSchin #endif 1018da2e3ebdSchin #if _ast_fltmax_double 1019da2e3ebdSchin #undef LDBL_MAX 1020da2e3ebdSchin #endif 1021da2e3ebdSchin static void 1022da2e3ebdSchin #if _STD_ 1023da2e3ebdSchin list(const char* typ, const char* var, void* val, int siz) 1024da2e3ebdSchin #else 1025da2e3ebdSchin list(typ, var, val, siz) 1026da2e3ebdSchin char* typ; 1027da2e3ebdSchin char* var; 1028da2e3ebdSchin void* val; 1029da2e3ebdSchin int siz; 1030da2e3ebdSchin #endif 1031da2e3ebdSchin { 1032da2e3ebdSchin register unsigned char* u = (unsigned char*)val; 1033da2e3ebdSchin register unsigned char* e = u + siz; 1034da2e3ebdSchin 1035da2e3ebdSchin printf("#define _ast_%s_%s_init\t0x%02x", typ, var, *u); 1036da2e3ebdSchin while (++u < e) 1037da2e3ebdSchin printf(",0x%02x", *u); 1038da2e3ebdSchin printf("\n"); 1039da2e3ebdSchin } 1040da2e3ebdSchin int 1041da2e3ebdSchin main() 1042da2e3ebdSchin { 1043da2e3ebdSchin #if SCAN || STRTO 1044da2e3ebdSchin #undef NAN 1045da2e3ebdSchin #define NAN "NaN" 1046da2e3ebdSchin #undef INF 1047da2e3ebdSchin #define INF "INF" 1048da2e3ebdSchin { 1049da2e3ebdSchin float f; 1050da2e3ebdSchin 1051da2e3ebdSchin #if SCAN 1052da2e3ebdSchin if (sscanf(NAN, "%g", &f) != 1) 1053da2e3ebdSchin return 1; 1054da2e3ebdSchin #else 1055da2e3ebdSchin f = atof(NAN); 1056da2e3ebdSchin #endif 1057da2e3ebdSchin list("flt", "nan", &f, sizeof(f)); 1058da2e3ebdSchin #if SCAN 1059da2e3ebdSchin if (sscanf(INF, "%g", &f) != 1) 1060da2e3ebdSchin return 1; 1061da2e3ebdSchin #else 1062da2e3ebdSchin f = atof(INF); 1063da2e3ebdSchin #endif 1064da2e3ebdSchin list("flt", "inf", &f, sizeof(f)); 1065da2e3ebdSchin } 1066da2e3ebdSchin { 1067da2e3ebdSchin double f; 1068da2e3ebdSchin #if STRTO 1069da2e3ebdSchin char* e; 1070da2e3ebdSchin #endif 1071da2e3ebdSchin 1072da2e3ebdSchin #if SCAN 1073da2e3ebdSchin if (sscanf(NAN, "%lg", &f) != 1) 1074da2e3ebdSchin return 1; 1075da2e3ebdSchin #else 1076da2e3ebdSchin f = strtod(NAN, &e); 1077da2e3ebdSchin if (*e) 1078da2e3ebdSchin return 1; 1079da2e3ebdSchin #endif 1080da2e3ebdSchin list("dbl", "nan", &f, sizeof(f)); 1081da2e3ebdSchin #if SCAN 1082da2e3ebdSchin if (sscanf(INF, "%lg", &f) != 1) 1083da2e3ebdSchin return 1; 1084da2e3ebdSchin #else 1085da2e3ebdSchin f = strtod(INF, &e); 1086da2e3ebdSchin if (*e) 1087da2e3ebdSchin return 1; 1088da2e3ebdSchin #endif 1089da2e3ebdSchin list("dbl", "inf", &f, sizeof(f)); 1090da2e3ebdSchin } 1091da2e3ebdSchin #ifdef LDBL_MAX 1092da2e3ebdSchin { 1093da2e3ebdSchin long double f; 1094da2e3ebdSchin #if STRTO 1095da2e3ebdSchin char* e; 1096da2e3ebdSchin #endif 1097da2e3ebdSchin 1098*b30d1939SAndy Fiddaman bzero(&f, sizeof (f)); 1099da2e3ebdSchin #if SCAN 1100da2e3ebdSchin if (sscanf(NAN, "%Lg", &f) != 1) 1101da2e3ebdSchin return 1; 1102da2e3ebdSchin #else 1103da2e3ebdSchin f = strtold(NAN, &e); 1104da2e3ebdSchin if (*e) 1105da2e3ebdSchin return 1; 1106da2e3ebdSchin #endif 1107da2e3ebdSchin list("ldbl", "nan", &f, sizeof(f)); 1108*b30d1939SAndy Fiddaman bzero(&f, sizeof (f)); 1109da2e3ebdSchin #if SCAN 1110da2e3ebdSchin if (sscanf(INF, "%Lg", &f) != 1) 1111da2e3ebdSchin return 1; 1112da2e3ebdSchin #else 1113da2e3ebdSchin f = strtold(INF, &e); 1114da2e3ebdSchin if (*e) 1115da2e3ebdSchin return 1; 1116da2e3ebdSchin #endif 1117da2e3ebdSchin list("ldbl", "inf", &f, sizeof(f)); 1118da2e3ebdSchin } 1119da2e3ebdSchin #endif 1120da2e3ebdSchin #else 1121da2e3ebdSchin #ifdef SIGFPE 1122da2e3ebdSchin signal(SIGFPE, SIG_IGN); 1123da2e3ebdSchin #endif 1124da2e3ebdSchin #ifdef FLT_MAX 1125da2e3ebdSchin { 1126da2e3ebdSchin float f = FLT_MAX; 1127da2e3ebdSchin #if DIV 1128da2e3ebdSchin float z = 0; 1129da2e3ebdSchin 1130da2e3ebdSchin f = 0.0 / z; 1131da2e3ebdSchin if (!f) 1132da2e3ebdSchin return 1; 1133da2e3ebdSchin list("flt", "nan", &f, sizeof(f)); 1134da2e3ebdSchin f = 1.0 / z; 1135da2e3ebdSchin list("flt", "inf", &f, sizeof(f)); 1136da2e3ebdSchin #else 1137da2e3ebdSchin #if ADD 1138da2e3ebdSchin f += f; 1139da2e3ebdSchin #endif 1140da2e3ebdSchin #if EXP 1141da2e3ebdSchin f = exp(f); 1142da2e3ebdSchin #endif 1143da2e3ebdSchin #if MPY 1144da2e3ebdSchin f *= 2; 114534f9b3eeSRoland Mainz #endif 114634f9b3eeSRoland Mainz #if MAC 114734f9b3eeSRoland Mainz f = FLT_QNAN; 1148da2e3ebdSchin #endif 1149da2e3ebdSchin list("flt", "nan", &f, sizeof(f)); 115034f9b3eeSRoland Mainz #if MAC 115134f9b3eeSRoland Mainz f = FLT_INFINITY; 115234f9b3eeSRoland Mainz #endif 1153da2e3ebdSchin list("flt", "inf", &f, sizeof(f)); 1154da2e3ebdSchin #endif 1155da2e3ebdSchin } 1156da2e3ebdSchin #endif 1157da2e3ebdSchin #ifdef DBL_MAX 1158da2e3ebdSchin { 1159da2e3ebdSchin double f = DBL_MAX; 1160da2e3ebdSchin #if DIV 1161da2e3ebdSchin double z = 0; 1162da2e3ebdSchin 1163da2e3ebdSchin f = 0.0 / z; 1164da2e3ebdSchin if (!f) 1165da2e3ebdSchin return 1; 1166da2e3ebdSchin list("dbl", "nan", &f, sizeof(f)); 1167da2e3ebdSchin f = 1.0 / z; 1168da2e3ebdSchin list("dbl", "inf", &f, sizeof(f)); 1169da2e3ebdSchin #else 1170da2e3ebdSchin #if ADD 1171da2e3ebdSchin f += f; 1172da2e3ebdSchin #endif 1173da2e3ebdSchin #if EXP 1174da2e3ebdSchin f = exp(f); 1175da2e3ebdSchin #endif 1176da2e3ebdSchin #if MPY 1177da2e3ebdSchin f *= 2; 117834f9b3eeSRoland Mainz #endif 117934f9b3eeSRoland Mainz #if MAC 118034f9b3eeSRoland Mainz f = DBL_QNAN; 1181da2e3ebdSchin #endif 1182da2e3ebdSchin list("dbl", "nan", &f, sizeof(f)); 118334f9b3eeSRoland Mainz #if MAC 118434f9b3eeSRoland Mainz f = DBL_INFINITY; 118534f9b3eeSRoland Mainz #endif 1186da2e3ebdSchin list("dbl", "inf", &f, sizeof(f)); 1187da2e3ebdSchin #endif 1188da2e3ebdSchin } 1189da2e3ebdSchin #endif 1190da2e3ebdSchin #ifdef LDBL_MAX 1191da2e3ebdSchin { 1192da2e3ebdSchin long double f = LDBL_MAX; 1193da2e3ebdSchin #if DIV 1194da2e3ebdSchin long double z = 0; 1195da2e3ebdSchin 1196da2e3ebdSchin f = 0.0 / z; 1197da2e3ebdSchin if (!f) 1198da2e3ebdSchin return 1; 1199da2e3ebdSchin list("ldbl", "nan", &f, sizeof(f)); 1200da2e3ebdSchin f = 1.0 / z; 1201da2e3ebdSchin list("ldbl", "inf", &f, sizeof(f)); 1202da2e3ebdSchin #else 1203da2e3ebdSchin #if ADD 1204da2e3ebdSchin f += f; 1205da2e3ebdSchin #endif 1206da2e3ebdSchin #if EXP 1207da2e3ebdSchin f = exp(f); 1208da2e3ebdSchin #endif 1209da2e3ebdSchin #if MPY 1210da2e3ebdSchin f *= 2; 121134f9b3eeSRoland Mainz #endif 121234f9b3eeSRoland Mainz #if MAC 121334f9b3eeSRoland Mainz f = LDBL_QNAN; 1214da2e3ebdSchin #endif 1215da2e3ebdSchin list("ldbl", "nan", &f, sizeof(f)); 121634f9b3eeSRoland Mainz #if MAC 121734f9b3eeSRoland Mainz f = LDBL_INFINITY; 121834f9b3eeSRoland Mainz #endif 1219da2e3ebdSchin list("ldbl", "inf", &f, sizeof(f)); 1220da2e3ebdSchin #endif 1221da2e3ebdSchin } 1222da2e3ebdSchin #endif 1223da2e3ebdSchin #endif 1224da2e3ebdSchin return 0; 1225da2e3ebdSchin } 1226da2e3ebdSchin}end 1227