Home | History | Annotate | Line # | Download | only in testfloat
systfloat.c revision 1.1
      1 
      2 /*
      3 ===============================================================================
      4 
      5 This C source file is part of TestFloat, Release 2a, a package of programs
      6 for testing the correctness of floating-point arithmetic complying to the
      7 IEC/IEEE Standard for Floating-Point.
      8 
      9 Written by John R. Hauser.  More information is available through the Web
     10 page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
     11 
     12 THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
     13 has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
     14 TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
     15 PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
     16 AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
     17 
     18 Derivative works are acceptable, even for commercial purposes, so long as
     19 (1) they include prominent notice that the work is derivative, and (2) they
     20 include prominent notice akin to these four paragraphs for those parts of
     21 this code that are retained.
     22 
     23 ===============================================================================
     24 */
     25 
     26 #include <math.h>
     27 #include "milieu.h"
     28 #include "softfloat.h"
     29 #include "systfloat.h"
     30 
     31 float32 syst_int32_to_float32( int32 a )
     32 {
     33     float32 z;
     34 
     35     *( (float *) &z ) = a;
     36     return z;
     37 
     38 }
     39 
     40 float64 syst_int32_to_float64( int32 a )
     41 {
     42     float64 z;
     43 
     44     *( (double *) &z ) = a;
     45     return z;
     46 
     47 }
     48 
     49 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
     50 
     51 floatx80 syst_int32_to_floatx80( int32 a )
     52 {
     53     floatx80 z;
     54 
     55     *( (long double *) &z ) = a;
     56     return z;
     57 
     58 }
     59 
     60 #endif
     61 
     62 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
     63 
     64 float128 syst_int32_to_float128( int32 a )
     65 {
     66     float128 z;
     67 
     68     *( (long double *) &z ) = a;
     69     return z;
     70 
     71 }
     72 
     73 #endif
     74 
     75 #ifdef BITS64
     76 
     77 float32 syst_int64_to_float32( int64 a )
     78 {
     79     float32 z;
     80 
     81     *( (float *) &z ) = a;
     82     return z;
     83 
     84 }
     85 
     86 float64 syst_int64_to_float64( int64 a )
     87 {
     88     float64 z;
     89 
     90     *( (double *) &z ) = a;
     91     return z;
     92 
     93 }
     94 
     95 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
     96 
     97 floatx80 syst_int64_to_floatx80( int64 a )
     98 {
     99     floatx80 z;
    100 
    101     *( (long double *) &z ) = a;
    102     return z;
    103 
    104 }
    105 
    106 #endif
    107 
    108 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    109 
    110 float128 syst_int64_to_float128( int64 a )
    111 {
    112     float128 z;
    113 
    114     *( (long double *) &z ) = a;
    115     return z;
    116 
    117 }
    118 
    119 #endif
    120 
    121 #endif
    122 
    123 int32 syst_float32_to_int32_round_to_zero( float32 a )
    124 {
    125 
    126     return *( (float *) &a );
    127 
    128 }
    129 
    130 #ifdef BITS64
    131 
    132 int64 syst_float32_to_int64_round_to_zero( float32 a )
    133 {
    134 
    135     return *( (float *) &a );
    136 
    137 }
    138 
    139 #endif
    140 
    141 float64 syst_float32_to_float64( float32 a )
    142 {
    143     float64 z;
    144 
    145     *( (double *) &z ) = *( (float *) &a );
    146     return z;
    147 
    148 }
    149 
    150 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    151 
    152 floatx80 syst_float32_to_floatx80( float32 a )
    153 {
    154     floatx80 z;
    155 
    156     *( (long double *) &z ) = *( (float *) &a );
    157     return z;
    158 
    159 }
    160 
    161 #endif
    162 
    163 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    164 
    165 float128 syst_float32_to_float128( float32 a )
    166 {
    167     float128 z;
    168 
    169     *( (long double *) &z ) = *( (float *) &a );
    170     return z;
    171 
    172 }
    173 
    174 #endif
    175 
    176 float32 syst_float32_add( float32 a, float32 b )
    177 {
    178     float32 z;
    179 
    180     *( (float *) &z ) = *( (float *) &a ) + *( (float *) &b );
    181     return z;
    182 
    183 }
    184 
    185 float32 syst_float32_sub( float32 a, float32 b )
    186 {
    187     float32 z;
    188 
    189     *( (float *) &z ) = *( (float *) &a ) - *( (float *) &b );
    190     return z;
    191 
    192 }
    193 
    194 float32 syst_float32_mul( float32 a, float32 b )
    195 {
    196     float32 z;
    197 
    198     *( (float *) &z ) = *( (float *) &a ) * *( (float *) &b );
    199     return z;
    200 
    201 }
    202 
    203 float32 syst_float32_div( float32 a, float32 b )
    204 {
    205     float32 z;
    206 
    207     *( (float *) &z ) = *( (float *) &a ) / *( (float *) &b );
    208     return z;
    209 
    210 }
    211 
    212 flag syst_float32_eq( float32 a, float32 b )
    213 {
    214 
    215     return ( *( (float *) &a ) == *( (float *) &b ) );
    216 
    217 }
    218 
    219 flag syst_float32_le( float32 a, float32 b )
    220 {
    221 
    222     return ( *( (float *) &a ) <= *( (float *) &b ) );
    223 
    224 }
    225 
    226 flag syst_float32_lt( float32 a, float32 b )
    227 {
    228 
    229     return ( *( (float *) &a ) < *( (float *) &b ) );
    230 
    231 }
    232 
    233 int32 syst_float64_to_int32_round_to_zero( float64 a )
    234 {
    235 
    236     return *( (double *) &a );
    237 
    238 }
    239 
    240 #ifdef BITS64
    241 
    242 int64 syst_float64_to_int64_round_to_zero( float64 a )
    243 {
    244 
    245     return *( (double *) &a );
    246 
    247 }
    248 
    249 #endif
    250 
    251 float32 syst_float64_to_float32( float64 a )
    252 {
    253     float32 z;
    254 
    255     *( (float *) &z ) = *( (double *) &a );
    256     return z;
    257 
    258 }
    259 
    260 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    261 
    262 floatx80 syst_float64_to_floatx80( float64 a )
    263 {
    264     floatx80 z;
    265 
    266     *( (long double *) &z ) = *( (double *) &a );
    267     return z;
    268 
    269 }
    270 
    271 #endif
    272 
    273 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    274 
    275 float128 syst_float64_to_float128( float64 a )
    276 {
    277     float128 z;
    278 
    279     *( (long double *) &z ) = *( (double *) &a );
    280     return z;
    281 
    282 }
    283 
    284 #endif
    285 
    286 float64 syst_float64_add( float64 a, float64 b )
    287 {
    288     float64 z;
    289 
    290     *( (double *) &z ) = *( (double *) &a ) + *( (double *) &b );
    291     return z;
    292 
    293 }
    294 
    295 float64 syst_float64_sub( float64 a, float64 b )
    296 {
    297     float64 z;
    298 
    299     *( (double *) &z ) = *( (double *) &a ) - *( (double *) &b );
    300     return z;
    301 
    302 }
    303 
    304 float64 syst_float64_mul( float64 a, float64 b )
    305 {
    306     float64 z;
    307 
    308     *( (double *) &z ) = *( (double *) &a ) * *( (double *) &b );
    309     return z;
    310 
    311 }
    312 
    313 float64 syst_float64_div( float64 a, float64 b )
    314 {
    315     float64 z;
    316 
    317     *( (double *) &z ) = *( (double *) &a ) / *( (double *) &b );
    318     return z;
    319 
    320 }
    321 
    322 float64 syst_float64_sqrt( float64 a )
    323 {
    324     float64 z;
    325 
    326     *( (double *) &z ) = sqrt( *( (double *) &a ) );
    327     return z;
    328 
    329 }
    330 
    331 flag syst_float64_eq( float64 a, float64 b )
    332 {
    333 
    334     return ( *( (double *) &a ) == *( (double *) &b ) );
    335 
    336 }
    337 
    338 flag syst_float64_le( float64 a, float64 b )
    339 {
    340 
    341     return ( *( (double *) &a ) <= *( (double *) &b ) );
    342 
    343 }
    344 
    345 flag syst_float64_lt( float64 a, float64 b )
    346 {
    347 
    348     return ( *( (double *) &a ) < *( (double *) &b ) );
    349 
    350 }
    351 
    352 #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 )
    353 
    354 int32 syst_floatx80_to_int32_round_to_zero( floatx80 a )
    355 {
    356 
    357     return *( (long double *) &a );
    358 
    359 }
    360 
    361 #ifdef BITS64
    362 
    363 int64 syst_floatx80_to_int64_round_to_zero( floatx80 a )
    364 {
    365 
    366     return *( (long double *) &a );
    367 
    368 }
    369 
    370 #endif
    371 
    372 float32 syst_floatx80_to_float32( floatx80 a )
    373 {
    374     float32 z;
    375 
    376     *( (float *) &z ) = *( (long double *) &a );
    377     return z;
    378 
    379 }
    380 
    381 float64 syst_floatx80_to_float64( floatx80 a )
    382 {
    383     float64 z;
    384 
    385     *( (double *) &z ) = *( (long double *) &a );
    386     return z;
    387 
    388 }
    389 
    390 floatx80 syst_floatx80_add( floatx80 a, floatx80 b )
    391 {
    392     floatx80 z;
    393 
    394     *( (long double *) &z ) =
    395         *( (long double *) &a ) + *( (long double *) &b );
    396     return z;
    397 
    398 }
    399 
    400 floatx80 syst_floatx80_sub( floatx80 a, floatx80 b )
    401 {
    402     floatx80 z;
    403 
    404     *( (long double *) &z ) =
    405         *( (long double *) &a ) - *( (long double *) &b );
    406     return z;
    407 
    408 }
    409 
    410 floatx80 syst_floatx80_mul( floatx80 a, floatx80 b )
    411 {
    412     floatx80 z;
    413 
    414     *( (long double *) &z ) =
    415         *( (long double *) &a ) * *( (long double *) &b );
    416     return z;
    417 
    418 }
    419 
    420 floatx80 syst_floatx80_div( floatx80 a, floatx80 b )
    421 {
    422     floatx80 z;
    423 
    424     *( (long double *) &z ) =
    425         *( (long double *) &a ) / *( (long double *) &b );
    426     return z;
    427 
    428 }
    429 
    430 flag syst_floatx80_eq( floatx80 a, floatx80 b )
    431 {
    432 
    433     return ( *( (long double *) &a ) == *( (long double *) &b ) );
    434 
    435 }
    436 
    437 flag syst_floatx80_le( floatx80 a, floatx80 b )
    438 {
    439 
    440     return ( *( (long double *) &a ) <= *( (long double *) &b ) );
    441 
    442 }
    443 
    444 flag syst_floatx80_lt( floatx80 a, floatx80 b )
    445 {
    446 
    447     return ( *( (long double *) &a ) < *( (long double *) &b ) );
    448 
    449 }
    450 
    451 #endif
    452 
    453 #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 )
    454 
    455 int32 syst_float128_to_int32_round_to_zero( float128 a )
    456 {
    457 
    458     return *( (long double *) &a );
    459 
    460 }
    461 
    462 #ifdef BITS64
    463 
    464 int64 syst_float128_to_int64_round_to_zero( float128 a )
    465 {
    466 
    467     return *( (long double *) &a );
    468 
    469 }
    470 
    471 #endif
    472 
    473 float32 syst_float128_to_float32( float128 a )
    474 {
    475     float32 z;
    476 
    477     *( (float *) &z ) = *( (long double *) &a );
    478     return z;
    479 
    480 }
    481 
    482 float64 syst_float128_to_float64( float128 a )
    483 {
    484     float64 z;
    485 
    486     *( (double *) &z ) = *( (long double *) &a );
    487     return z;
    488 
    489 }
    490 
    491 float128 syst_float128_add( float128 a, float128 b )
    492 {
    493     float128 z;
    494 
    495     *( (long double *) &z ) =
    496         *( (long double *) &a ) + *( (long double *) &b );
    497     return z;
    498 
    499 }
    500 
    501 float128 syst_float128_sub( float128 a, float128 b )
    502 {
    503     float128 z;
    504 
    505     *( (long double *) &z ) =
    506         *( (long double *) &a ) - *( (long double *) &b );
    507     return z;
    508 
    509 }
    510 
    511 float128 syst_float128_mul( float128 a, float128 b )
    512 {
    513     float128 z;
    514 
    515     *( (long double *) &z ) =
    516         *( (long double *) &a ) * *( (long double *) &b );
    517     return z;
    518 
    519 }
    520 
    521 float128 syst_float128_div( float128 a, float128 b )
    522 {
    523     float128 z;
    524 
    525     *( (long double *) &z ) =
    526         *( (long double *) &a ) / *( (long double *) &b );
    527     return z;
    528 
    529 }
    530 
    531 flag syst_float128_eq( float128 a, float128 b )
    532 {
    533 
    534     return ( *( (long double *) &a ) == *( (long double *) &b ) );
    535 
    536 }
    537 
    538 flag syst_float128_le( float128 a, float128 b )
    539 {
    540 
    541     return ( *( (long double *) &a ) <= *( (long double *) &b ) );
    542 
    543 }
    544 
    545 flag syst_float128_lt( float128 a, float128 b )
    546 {
    547 
    548     return ( *( (long double *) &a ) < *( (long double *) &b ) );
    549 
    550 }
    551 
    552 #endif
    553 
    554