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