1206917Smarius 2206917Smarius/* 3206917Smarius=============================================================================== 4206917Smarius 5206917SmariusThis C source file is part of TestFloat, Release 2a, a package of programs 6206917Smariusfor testing the correctness of floating-point arithmetic complying to the 7206917SmariusIEC/IEEE Standard for Floating-Point. 8206917Smarius 9206917SmariusWritten by John R. Hauser. More information is available through the Web 10206917Smariuspage `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'. 11206917Smarius 12206917SmariusTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 13206917Smariushas been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 14206917SmariusTIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 15206917SmariusPERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 16206917SmariusAND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 17206917Smarius 18206917SmariusDerivative works are acceptable, even for commercial purposes, so long as 19206917Smarius(1) they include prominent notice that the work is derivative, and (2) they 20206917Smariusinclude prominent notice akin to these four paragraphs for those parts of 21206917Smariusthis code that are retained. 22206917Smarius 23206917Smarius=============================================================================== 24206917Smarius*/ 25206917Smarius 26206917Smarius#include <math.h> 27206917Smarius#include "milieu.h" 28206917Smarius#include "softfloat.h" 29206917Smarius#include "systfloat.h" 30206917Smarius 31206917Smariusfloat32 syst_int32_to_float32( int32 a ) 32206917Smarius{ 33206917Smarius float32 z; 34206917Smarius 35206917Smarius *( (float *) &z ) = a; 36206917Smarius return z; 37206917Smarius 38206917Smarius} 39206917Smarius 40206917Smariusfloat64 syst_int32_to_float64( int32 a ) 41206917Smarius{ 42206917Smarius float64 z; 43206917Smarius 44206917Smarius *( (double *) &z ) = a; 45206917Smarius return z; 46206917Smarius 47206917Smarius} 48206917Smarius 49206917Smarius#if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 50206917Smarius 51206917Smariusfloatx80 syst_int32_to_floatx80( int32 a ) 52206917Smarius{ 53206917Smarius floatx80 z; 54206917Smarius 55206917Smarius *( (long double *) &z ) = a; 56206917Smarius return z; 57206917Smarius 58206917Smarius} 59206917Smarius 60206917Smarius#endif 61206917Smarius 62206917Smarius#if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 63206917Smarius 64206917Smariusfloat128 syst_int32_to_float128( int32 a ) 65206917Smarius{ 66206917Smarius float128 z; 67206917Smarius 68206917Smarius *( (long double *) &z ) = a; 69206917Smarius return z; 70206917Smarius 71206917Smarius} 72206917Smarius 73206917Smarius#endif 74206917Smarius 75206917Smarius#ifdef BITS64 76206917Smarius 77206917Smariusfloat32 syst_int64_to_float32( int64 a ) 78206917Smarius{ 79206917Smarius float32 z; 80206917Smarius 81206917Smarius *( (float *) &z ) = a; 82206917Smarius return z; 83206917Smarius 84206917Smarius} 85206917Smarius 86206917Smariusfloat64 syst_int64_to_float64( int64 a ) 87206917Smarius{ 88206917Smarius float64 z; 89206917Smarius 90206917Smarius *( (double *) &z ) = a; 91206917Smarius return z; 92206917Smarius 93206917Smarius} 94206917Smarius 95206917Smarius#if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 96206917Smarius 97206917Smariusfloatx80 syst_int64_to_floatx80( int64 a ) 98206917Smarius{ 99206917Smarius floatx80 z; 100206917Smarius 101206917Smarius *( (long double *) &z ) = a; 102206917Smarius return z; 103206917Smarius 104206917Smarius} 105206917Smarius 106206917Smarius#endif 107206917Smarius 108206917Smarius#if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 109206917Smarius 110206917Smariusfloat128 syst_int64_to_float128( int64 a ) 111206917Smarius{ 112206917Smarius float128 z; 113206917Smarius 114206917Smarius *( (long double *) &z ) = a; 115206917Smarius return z; 116206917Smarius 117206917Smarius} 118206917Smarius 119206917Smarius#endif 120206917Smarius 121206917Smarius#endif 122206917Smarius 123206917Smariusint32 syst_float32_to_int32_round_to_zero( float32 a ) 124206917Smarius{ 125206917Smarius 126206917Smarius return *( (float *) &a ); 127206917Smarius 128206917Smarius} 129206917Smarius 130206917Smarius#ifdef BITS64 131206917Smarius 132206917Smariusint64 syst_float32_to_int64_round_to_zero( float32 a ) 133206917Smarius{ 134206917Smarius 135206917Smarius return *( (float *) &a ); 136206917Smarius 137206917Smarius} 138206917Smarius 139206917Smarius#endif 140206917Smarius 141206917Smariusfloat64 syst_float32_to_float64( float32 a ) 142206917Smarius{ 143206917Smarius float64 z; 144206917Smarius 145206917Smarius *( (double *) &z ) = *( (float *) &a ); 146206917Smarius return z; 147206917Smarius 148206917Smarius} 149206917Smarius 150206917Smarius#if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 151206917Smarius 152206917Smariusfloatx80 syst_float32_to_floatx80( float32 a ) 153206917Smarius{ 154206917Smarius floatx80 z; 155206917Smarius 156206917Smarius *( (long double *) &z ) = *( (float *) &a ); 157206917Smarius return z; 158206917Smarius 159206917Smarius} 160206917Smarius 161206917Smarius#endif 162206917Smarius 163206917Smarius#if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 164206917Smarius 165206917Smariusfloat128 syst_float32_to_float128( float32 a ) 166206917Smarius{ 167206917Smarius float128 z; 168206917Smarius 169206917Smarius *( (long double *) &z ) = *( (float *) &a ); 170206917Smarius return z; 171206917Smarius 172206917Smarius} 173206917Smarius 174206917Smarius#endif 175206917Smarius 176206917Smariusfloat32 syst_float32_add( float32 a, float32 b ) 177206917Smarius{ 178206917Smarius float32 z; 179206917Smarius 180206917Smarius *( (float *) &z ) = *( (float *) &a ) + *( (float *) &b ); 181206917Smarius return z; 182206917Smarius 183206917Smarius} 184206917Smarius 185206917Smariusfloat32 syst_float32_sub( float32 a, float32 b ) 186206917Smarius{ 187206917Smarius float32 z; 188206917Smarius 189206917Smarius *( (float *) &z ) = *( (float *) &a ) - *( (float *) &b ); 190206917Smarius return z; 191206917Smarius 192206917Smarius} 193206917Smarius 194206917Smariusfloat32 syst_float32_mul( float32 a, float32 b ) 195206917Smarius{ 196206917Smarius float32 z; 197206917Smarius 198206917Smarius *( (float *) &z ) = *( (float *) &a ) * *( (float *) &b ); 199206917Smarius return z; 200206917Smarius 201206917Smarius} 202206917Smarius 203206917Smariusfloat32 syst_float32_div( float32 a, float32 b ) 204206917Smarius{ 205206917Smarius float32 z; 206206917Smarius 207206917Smarius *( (float *) &z ) = *( (float *) &a ) / *( (float *) &b ); 208206917Smarius return z; 209206917Smarius 210206917Smarius} 211206917Smarius 212206917Smariusflag syst_float32_eq( float32 a, float32 b ) 213206917Smarius{ 214206917Smarius 215206917Smarius return ( *( (float *) &a ) == *( (float *) &b ) ); 216206917Smarius 217206917Smarius} 218206917Smarius 219206917Smariusflag syst_float32_le( float32 a, float32 b ) 220206917Smarius{ 221206917Smarius 222206917Smarius return ( *( (float *) &a ) <= *( (float *) &b ) ); 223206917Smarius 224206917Smarius} 225206917Smarius 226206917Smariusflag syst_float32_lt( float32 a, float32 b ) 227206917Smarius{ 228206917Smarius 229206917Smarius return ( *( (float *) &a ) < *( (float *) &b ) ); 230206917Smarius 231206917Smarius} 232206917Smarius 233206917Smariusint32 syst_float64_to_int32_round_to_zero( float64 a ) 234206917Smarius{ 235206917Smarius 236206917Smarius return *( (double *) &a ); 237206917Smarius 238206917Smarius} 239206917Smarius 240206917Smarius#ifdef BITS64 241206917Smarius 242206917Smariusint64 syst_float64_to_int64_round_to_zero( float64 a ) 243206917Smarius{ 244206917Smarius 245206917Smarius return *( (double *) &a ); 246206917Smarius 247206917Smarius} 248206917Smarius 249206917Smarius#endif 250206917Smarius 251206917Smariusfloat32 syst_float64_to_float32( float64 a ) 252206917Smarius{ 253206917Smarius float32 z; 254206917Smarius 255206917Smarius *( (float *) &z ) = *( (double *) &a ); 256206917Smarius return z; 257206917Smarius 258206917Smarius} 259206917Smarius 260206917Smarius#if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 261206917Smarius 262206917Smariusfloatx80 syst_float64_to_floatx80( float64 a ) 263206917Smarius{ 264206917Smarius floatx80 z; 265206917Smarius 266206917Smarius *( (long double *) &z ) = *( (double *) &a ); 267206917Smarius return z; 268206917Smarius 269206917Smarius} 270206917Smarius 271206917Smarius#endif 272206917Smarius 273206917Smarius#if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 274206917Smarius 275206917Smariusfloat128 syst_float64_to_float128( float64 a ) 276206917Smarius{ 277206917Smarius float128 z; 278206917Smarius 279206917Smarius *( (long double *) &z ) = *( (double *) &a ); 280206917Smarius return z; 281206917Smarius 282206917Smarius} 283206917Smarius 284206917Smarius#endif 285206917Smarius 286206917Smariusfloat64 syst_float64_add( float64 a, float64 b ) 287206917Smarius{ 288206917Smarius float64 z; 289206917Smarius 290206917Smarius *( (double *) &z ) = *( (double *) &a ) + *( (double *) &b ); 291206917Smarius return z; 292206917Smarius 293206917Smarius} 294206917Smarius 295206917Smariusfloat64 syst_float64_sub( float64 a, float64 b ) 296206917Smarius{ 297206917Smarius float64 z; 298206917Smarius 299206917Smarius *( (double *) &z ) = *( (double *) &a ) - *( (double *) &b ); 300206917Smarius return z; 301206917Smarius 302206917Smarius} 303206917Smarius 304206917Smariusfloat64 syst_float64_mul( float64 a, float64 b ) 305206917Smarius{ 306206917Smarius float64 z; 307206917Smarius 308206917Smarius *( (double *) &z ) = *( (double *) &a ) * *( (double *) &b ); 309206917Smarius return z; 310206917Smarius 311206917Smarius} 312206917Smarius 313206917Smariusfloat64 syst_float64_div( float64 a, float64 b ) 314206917Smarius{ 315206917Smarius float64 z; 316206917Smarius 317206917Smarius *( (double *) &z ) = *( (double *) &a ) / *( (double *) &b ); 318206917Smarius return z; 319206917Smarius 320206917Smarius} 321206917Smarius 322206917Smariusfloat64 syst_float64_sqrt( float64 a ) 323206917Smarius{ 324206917Smarius float64 z; 325206917Smarius 326206917Smarius *( (double *) &z ) = sqrt( *( (double *) &a ) ); 327206917Smarius return z; 328206917Smarius 329206917Smarius} 330206917Smarius 331206917Smariusflag syst_float64_eq( float64 a, float64 b ) 332206917Smarius{ 333206917Smarius 334206917Smarius return ( *( (double *) &a ) == *( (double *) &b ) ); 335206917Smarius 336206917Smarius} 337206917Smarius 338206917Smariusflag syst_float64_le( float64 a, float64 b ) 339206917Smarius{ 340206917Smarius 341206917Smarius return ( *( (double *) &a ) <= *( (double *) &b ) ); 342206917Smarius 343206917Smarius} 344206917Smarius 345206917Smariusflag syst_float64_lt( float64 a, float64 b ) 346206917Smarius{ 347206917Smarius 348206917Smarius return ( *( (double *) &a ) < *( (double *) &b ) ); 349206917Smarius 350206917Smarius} 351206917Smarius 352206917Smarius#if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 353206917Smarius 354206917Smariusint32 syst_floatx80_to_int32_round_to_zero( floatx80 a ) 355206917Smarius{ 356206917Smarius 357206917Smarius return *( (long double *) &a ); 358206917Smarius 359206917Smarius} 360206917Smarius 361206917Smarius#ifdef BITS64 362206917Smarius 363206917Smariusint64 syst_floatx80_to_int64_round_to_zero( floatx80 a ) 364206917Smarius{ 365206917Smarius 366206917Smarius return *( (long double *) &a ); 367206917Smarius 368206917Smarius} 369206917Smarius 370206917Smarius#endif 371206917Smarius 372206917Smariusfloat32 syst_floatx80_to_float32( floatx80 a ) 373206917Smarius{ 374206917Smarius float32 z; 375206917Smarius 376206917Smarius *( (float *) &z ) = *( (long double *) &a ); 377206917Smarius return z; 378206917Smarius 379206917Smarius} 380206917Smarius 381206917Smariusfloat64 syst_floatx80_to_float64( floatx80 a ) 382206917Smarius{ 383206917Smarius float64 z; 384206917Smarius 385206917Smarius *( (double *) &z ) = *( (long double *) &a ); 386206917Smarius return z; 387206917Smarius 388206917Smarius} 389206917Smarius 390206917Smariusfloatx80 syst_floatx80_add( floatx80 a, floatx80 b ) 391206917Smarius{ 392206917Smarius floatx80 z; 393206917Smarius 394206917Smarius *( (long double *) &z ) = 395206917Smarius *( (long double *) &a ) + *( (long double *) &b ); 396206917Smarius return z; 397206917Smarius 398206917Smarius} 399206917Smarius 400206917Smariusfloatx80 syst_floatx80_sub( floatx80 a, floatx80 b ) 401206917Smarius{ 402206917Smarius floatx80 z; 403206917Smarius 404206917Smarius *( (long double *) &z ) = 405206917Smarius *( (long double *) &a ) - *( (long double *) &b ); 406206917Smarius return z; 407206917Smarius 408206917Smarius} 409206917Smarius 410206917Smariusfloatx80 syst_floatx80_mul( floatx80 a, floatx80 b ) 411206917Smarius{ 412206917Smarius floatx80 z; 413206917Smarius 414206917Smarius *( (long double *) &z ) = 415206917Smarius *( (long double *) &a ) * *( (long double *) &b ); 416206917Smarius return z; 417206917Smarius 418206917Smarius} 419206917Smarius 420206917Smariusfloatx80 syst_floatx80_div( floatx80 a, floatx80 b ) 421206917Smarius{ 422206917Smarius floatx80 z; 423206917Smarius 424206917Smarius *( (long double *) &z ) = 425206917Smarius *( (long double *) &a ) / *( (long double *) &b ); 426206917Smarius return z; 427206917Smarius 428206917Smarius} 429206917Smarius 430206917Smariusflag syst_floatx80_eq( floatx80 a, floatx80 b ) 431206917Smarius{ 432206917Smarius 433206917Smarius return ( *( (long double *) &a ) == *( (long double *) &b ) ); 434206917Smarius 435206917Smarius} 436206917Smarius 437206917Smariusflag syst_floatx80_le( floatx80 a, floatx80 b ) 438206917Smarius{ 439206917Smarius 440206917Smarius return ( *( (long double *) &a ) <= *( (long double *) &b ) ); 441206917Smarius 442206917Smarius} 443206917Smarius 444206917Smariusflag syst_floatx80_lt( floatx80 a, floatx80 b ) 445206917Smarius{ 446206917Smarius 447206917Smarius return ( *( (long double *) &a ) < *( (long double *) &b ) ); 448206917Smarius 449206917Smarius} 450206917Smarius 451206917Smarius#endif 452206917Smarius 453206917Smarius#if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 454206917Smarius 455206917Smariusint32 syst_float128_to_int32_round_to_zero( float128 a ) 456206917Smarius{ 457206917Smarius 458206917Smarius return *( (long double *) &a ); 459206917Smarius 460206917Smarius} 461206917Smarius 462206917Smarius#ifdef BITS64 463206917Smarius 464206917Smariusint64 syst_float128_to_int64_round_to_zero( float128 a ) 465206917Smarius{ 466206917Smarius 467206917Smarius return *( (long double *) &a ); 468206917Smarius 469206917Smarius} 470206917Smarius 471206917Smarius#endif 472206917Smarius 473206917Smariusfloat32 syst_float128_to_float32( float128 a ) 474206917Smarius{ 475206917Smarius float32 z; 476206917Smarius 477206917Smarius *( (float *) &z ) = *( (long double *) &a ); 478206917Smarius return z; 479206917Smarius 480206917Smarius} 481206917Smarius 482206917Smariusfloat64 syst_float128_to_float64( float128 a ) 483206917Smarius{ 484206917Smarius float64 z; 485206917Smarius 486206917Smarius *( (double *) &z ) = *( (long double *) &a ); 487206917Smarius return z; 488206917Smarius 489206917Smarius} 490206917Smarius 491206917Smariusfloat128 syst_float128_add( float128 a, float128 b ) 492206917Smarius{ 493206917Smarius float128 z; 494206917Smarius 495206917Smarius *( (long double *) &z ) = 496206917Smarius *( (long double *) &a ) + *( (long double *) &b ); 497206917Smarius return z; 498206917Smarius 499206917Smarius} 500206917Smarius 501206917Smariusfloat128 syst_float128_sub( float128 a, float128 b ) 502206917Smarius{ 503206917Smarius float128 z; 504206917Smarius 505206917Smarius *( (long double *) &z ) = 506206917Smarius *( (long double *) &a ) - *( (long double *) &b ); 507206917Smarius return z; 508206917Smarius 509206917Smarius} 510206917Smarius 511206917Smariusfloat128 syst_float128_mul( float128 a, float128 b ) 512206917Smarius{ 513206917Smarius float128 z; 514206917Smarius 515206917Smarius *( (long double *) &z ) = 516206917Smarius *( (long double *) &a ) * *( (long double *) &b ); 517206917Smarius return z; 518206917Smarius 519206917Smarius} 520206917Smarius 521206917Smariusfloat128 syst_float128_div( float128 a, float128 b ) 522206917Smarius{ 523206917Smarius float128 z; 524206917Smarius 525206917Smarius *( (long double *) &z ) = 526206917Smarius *( (long double *) &a ) / *( (long double *) &b ); 527206917Smarius return z; 528206917Smarius 529206917Smarius} 530206917Smarius 531206917Smariusflag syst_float128_eq( float128 a, float128 b ) 532206917Smarius{ 533206917Smarius 534206917Smarius return ( *( (long double *) &a ) == *( (long double *) &b ) ); 535206917Smarius 536206917Smarius} 537206917Smarius 538206917Smariusflag syst_float128_le( float128 a, float128 b ) 539206917Smarius{ 540206917Smarius 541206917Smarius return ( *( (long double *) &a ) <= *( (long double *) &b ) ); 542206917Smarius 543206917Smarius} 544206917Smarius 545206917Smariusflag syst_float128_lt( float128 a, float128 b ) 546206917Smarius{ 547206917Smarius 548206917Smarius return ( *( (long double *) &a ) < *( (long double *) &b ) ); 549206917Smarius 550206917Smarius} 551206917Smarius 552206917Smarius#endif 553206917Smarius 554