1 1.8 martin /* $NetBSD: systfloat.c,v 1.8 2008/04/28 20:23:04 martin Exp $ */ 2 1.3 ross 3 1.3 ross /* This is a derivative work. */ 4 1.3 ross 5 1.3 ross /*- 6 1.3 ross * Copyright (c) 2001 The NetBSD Foundation, Inc. 7 1.3 ross * All rights reserved. 8 1.3 ross * 9 1.3 ross * This code is derived from software contributed to The NetBSD Foundation 10 1.3 ross * by Ross Harvey. 11 1.3 ross * 12 1.3 ross * Redistribution and use in source and binary forms, with or without 13 1.3 ross * modification, are permitted provided that the following conditions 14 1.3 ross * are met: 15 1.3 ross * 1. Redistributions of source code must retain the above copyright 16 1.3 ross * notice, this list of conditions and the following disclaimer. 17 1.3 ross * 2. Redistributions in binary form must reproduce the above copyright 18 1.3 ross * notice, this list of conditions and the following disclaimer in the 19 1.3 ross * documentation and/or other materials provided with the distribution. 20 1.3 ross * 21 1.3 ross * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 22 1.3 ross * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 23 1.3 ross * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 1.3 ross * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 25 1.3 ross * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 1.3 ross * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 1.3 ross * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 1.3 ross * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 1.3 ross * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 1.3 ross * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 1.3 ross * POSSIBILITY OF SUCH DAMAGE. 32 1.3 ross */ 33 1.1 ross 34 1.1 ross /* 35 1.1 ross =============================================================================== 36 1.1 ross 37 1.1 ross This C source file is part of TestFloat, Release 2a, a package of programs 38 1.1 ross for testing the correctness of floating-point arithmetic complying to the 39 1.1 ross IEC/IEEE Standard for Floating-Point. 40 1.1 ross 41 1.1 ross Written by John R. Hauser. More information is available through the Web 42 1.1 ross page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'. 43 1.1 ross 44 1.1 ross THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 45 1.1 ross has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 46 1.1 ross TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 47 1.1 ross PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 48 1.1 ross AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 49 1.1 ross 50 1.1 ross Derivative works are acceptable, even for commercial purposes, so long as 51 1.1 ross (1) they include prominent notice that the work is derivative, and (2) they 52 1.1 ross include prominent notice akin to these four paragraphs for those parts of 53 1.1 ross this code that are retained. 54 1.1 ross 55 1.1 ross =============================================================================== 56 1.1 ross */ 57 1.1 ross 58 1.4 ross #include <sys/cdefs.h> 59 1.4 ross #ifndef __lint 60 1.8 martin __RCSID("$NetBSD: systfloat.c,v 1.8 2008/04/28 20:23:04 martin Exp $"); 61 1.4 ross #endif 62 1.4 ross 63 1.1 ross #include <math.h> 64 1.4 ross #include <ieeefp.h> 65 1.1 ross #include "milieu.h" 66 1.1 ross #include "softfloat.h" 67 1.1 ross #include "systfloat.h" 68 1.4 ross #include "systflags.h" 69 1.4 ross #include "systmodes.h" 70 1.4 ross 71 1.7 matt typedef union { 72 1.7 matt float32 f32; 73 1.7 matt float f; 74 1.7 matt } union32; 75 1.7 matt typedef union { 76 1.7 matt float64 f64; 77 1.7 matt double d; 78 1.7 matt } union64; 79 1.7 matt #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 80 1.7 matt typedef union { 81 1.7 matt floatx80 fx80; 82 1.7 matt long double ld; 83 1.7 matt } unionx80; 84 1.7 matt #endif 85 1.7 matt #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 86 1.7 matt typedef union { 87 1.7 matt float128 f128; 88 1.7 matt long double ld; 89 1.7 matt } union128; 90 1.7 matt #endif 91 1.7 matt 92 1.4 ross fp_except 93 1.4 ross syst_float_flags_clear(void) 94 1.4 ross { 95 1.5 ross return fpsetsticky(0) 96 1.5 ross & (FP_X_IMP | FP_X_UFL | FP_X_OFL | FP_X_DZ | FP_X_INV); 97 1.4 ross } 98 1.4 ross 99 1.4 ross void 100 1.4 ross syst_float_set_rounding_mode(fp_rnd direction) 101 1.4 ross { 102 1.4 ross fpsetround(direction); 103 1.4 ross fpsetmask(0); 104 1.4 ross } 105 1.1 ross 106 1.1 ross float32 syst_int32_to_float32( int32 a ) 107 1.1 ross { 108 1.7 matt const union32 uz = { .f = a }; 109 1.1 ross 110 1.7 matt return uz.f32; 111 1.1 ross 112 1.1 ross } 113 1.1 ross 114 1.1 ross float64 syst_int32_to_float64( int32 a ) 115 1.1 ross { 116 1.7 matt const union64 uz = { .d = a }; 117 1.1 ross 118 1.7 matt return uz.f64; 119 1.1 ross 120 1.1 ross } 121 1.1 ross 122 1.1 ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 123 1.1 ross 124 1.1 ross floatx80 syst_int32_to_floatx80( int32 a ) 125 1.1 ross { 126 1.7 matt const unionx80 uz = { .ld = a }; 127 1.1 ross 128 1.7 matt return uz.fx80; 129 1.1 ross 130 1.1 ross } 131 1.1 ross 132 1.1 ross #endif 133 1.1 ross 134 1.1 ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 135 1.1 ross 136 1.1 ross float128 syst_int32_to_float128( int32 a ) 137 1.1 ross { 138 1.7 matt const union128 uz = { .ld = a }; 139 1.1 ross 140 1.7 matt return uz.f128; 141 1.1 ross 142 1.1 ross } 143 1.1 ross 144 1.1 ross #endif 145 1.1 ross 146 1.1 ross #ifdef BITS64 147 1.1 ross 148 1.1 ross float32 syst_int64_to_float32( int64 a ) 149 1.1 ross { 150 1.7 matt const union32 uz = { .f = a }; 151 1.1 ross 152 1.7 matt return uz.f32; 153 1.1 ross } 154 1.1 ross 155 1.1 ross float64 syst_int64_to_float64( int64 a ) 156 1.1 ross { 157 1.7 matt const union64 uz = { .d = a }; 158 1.1 ross 159 1.7 matt return uz.f64; 160 1.1 ross } 161 1.1 ross 162 1.1 ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 163 1.1 ross 164 1.1 ross floatx80 syst_int64_to_floatx80( int64 a ) 165 1.1 ross { 166 1.7 matt const unionx80 uz = { .ld = a }; 167 1.1 ross 168 1.7 matt return uz.fx80; 169 1.1 ross } 170 1.1 ross 171 1.1 ross #endif 172 1.1 ross 173 1.1 ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 174 1.1 ross 175 1.1 ross float128 syst_int64_to_float128( int64 a ) 176 1.1 ross { 177 1.7 matt const union128 uz = { .ld = a }; 178 1.1 ross 179 1.7 matt return uz.f128; 180 1.1 ross } 181 1.1 ross 182 1.1 ross #endif 183 1.1 ross 184 1.1 ross #endif 185 1.1 ross 186 1.1 ross int32 syst_float32_to_int32_round_to_zero( float32 a ) 187 1.1 ross { 188 1.7 matt const union32 uz = { .f32 = a }; 189 1.1 ross 190 1.7 matt return uz.f; 191 1.1 ross 192 1.1 ross } 193 1.1 ross 194 1.1 ross #ifdef BITS64 195 1.1 ross 196 1.1 ross int64 syst_float32_to_int64_round_to_zero( float32 a ) 197 1.1 ross { 198 1.7 matt const union32 uz = { .f32 = a }; 199 1.1 ross 200 1.7 matt return uz.f; 201 1.1 ross } 202 1.1 ross 203 1.1 ross #endif 204 1.1 ross 205 1.1 ross float64 syst_float32_to_float64( float32 a ) 206 1.1 ross { 207 1.7 matt const union32 ua = { .f32 = a }; 208 1.7 matt union64 uz; 209 1.1 ross 210 1.7 matt uz.d = ua.f; 211 1.7 matt return uz.f64; 212 1.1 ross 213 1.1 ross } 214 1.1 ross 215 1.1 ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 216 1.1 ross 217 1.1 ross floatx80 syst_float32_to_floatx80( float32 a ) 218 1.1 ross { 219 1.7 matt const union32 ua = { .f32 = a }; 220 1.7 matt unionx80 uz; 221 1.1 ross 222 1.7 matt uz.ld = ua.f; 223 1.7 matt return uz.fx80; 224 1.1 ross } 225 1.1 ross 226 1.1 ross #endif 227 1.1 ross 228 1.1 ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 229 1.1 ross 230 1.1 ross float128 syst_float32_to_float128( float32 a ) 231 1.1 ross { 232 1.7 matt const union32 ua = { .f32 = a }; 233 1.7 matt union128 ub; 234 1.1 ross 235 1.7 matt ub.ld = ua.f; 236 1.7 matt return ub.f128; 237 1.1 ross } 238 1.1 ross 239 1.1 ross #endif 240 1.1 ross 241 1.1 ross float32 syst_float32_add( float32 a, float32 b ) 242 1.1 ross { 243 1.7 matt const union32 ua = { .f32 = a }, ub = { .f32 = b }; 244 1.7 matt union32 uz; 245 1.1 ross 246 1.7 matt uz.f = ua.f + ub.f; 247 1.7 matt return uz.f32; 248 1.1 ross } 249 1.1 ross 250 1.1 ross float32 syst_float32_sub( float32 a, float32 b ) 251 1.1 ross { 252 1.7 matt const union32 ua = { .f32 = a }, ub = { .f32 = b }; 253 1.7 matt union32 uz; 254 1.1 ross 255 1.7 matt uz.f = ua.f - ub.f; 256 1.7 matt return uz.f32; 257 1.1 ross } 258 1.1 ross 259 1.1 ross float32 syst_float32_mul( float32 a, float32 b ) 260 1.1 ross { 261 1.7 matt const union32 ua = { .f32 = a }, ub = { .f32 = b }; 262 1.7 matt union32 uz; 263 1.1 ross 264 1.7 matt uz.f = ua.f * ub.f; 265 1.7 matt return uz.f32; 266 1.1 ross } 267 1.1 ross 268 1.1 ross float32 syst_float32_div( float32 a, float32 b ) 269 1.1 ross { 270 1.7 matt const union32 ua = { .f32 = a }, ub = { .f32 = b }; 271 1.7 matt union32 uz; 272 1.1 ross 273 1.7 matt uz.f = ua.f / ub.f; 274 1.7 matt return uz.f32; 275 1.1 ross } 276 1.1 ross 277 1.1 ross flag syst_float32_eq( float32 a, float32 b ) 278 1.1 ross { 279 1.7 matt const union32 ua = { .f32 = a }, ub = { .f32 = b }; 280 1.1 ross 281 1.7 matt return ua.f == ub.f; 282 1.1 ross } 283 1.1 ross 284 1.1 ross flag syst_float32_le( float32 a, float32 b ) 285 1.1 ross { 286 1.7 matt const union32 ua = { .f32 = a }, ub = { .f32 = b }; 287 1.1 ross 288 1.7 matt return ua.f <= ub.f; 289 1.1 ross } 290 1.1 ross 291 1.1 ross flag syst_float32_lt( float32 a, float32 b ) 292 1.1 ross { 293 1.7 matt const union32 ua = { .f32 = a }, ub = { .f32 = b }; 294 1.1 ross 295 1.7 matt return ua.f < ub.f; 296 1.1 ross } 297 1.1 ross 298 1.1 ross int32 syst_float64_to_int32_round_to_zero( float64 a ) 299 1.1 ross { 300 1.7 matt const union64 uz = { .f64 = a }; 301 1.1 ross 302 1.7 matt return uz.d; 303 1.1 ross } 304 1.1 ross 305 1.1 ross #ifdef BITS64 306 1.1 ross 307 1.1 ross int64 syst_float64_to_int64_round_to_zero( float64 a ) 308 1.1 ross { 309 1.7 matt const union64 uz = { .f64 = a }; 310 1.1 ross 311 1.7 matt return uz.d; 312 1.1 ross } 313 1.1 ross 314 1.1 ross #endif 315 1.1 ross 316 1.1 ross float32 syst_float64_to_float32( float64 a ) 317 1.1 ross { 318 1.7 matt const union64 ua = { .f64 = a }; 319 1.7 matt union32 uz; 320 1.1 ross 321 1.7 matt uz.f = ua.d; 322 1.7 matt return uz.f32; 323 1.1 ross } 324 1.1 ross 325 1.1 ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 326 1.1 ross 327 1.1 ross floatx80 syst_float64_to_floatx80( float64 a ) 328 1.1 ross { 329 1.7 matt const union64 ua = { .f64 = a }; 330 1.7 matt unionx80 u; 331 1.1 ross 332 1.7 matt u.ld = ua.d; 333 1.7 matt return u.fx80; 334 1.1 ross } 335 1.1 ross 336 1.1 ross #endif 337 1.1 ross 338 1.1 ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 339 1.1 ross 340 1.1 ross float128 syst_float64_to_float128( float64 a ) 341 1.1 ross { 342 1.7 matt const union64 ua = { .f64 = a }; 343 1.7 matt union128 uz; 344 1.1 ross 345 1.7 matt uz.ld = ua.d; 346 1.7 matt return uz.f128; 347 1.1 ross } 348 1.1 ross 349 1.1 ross #endif 350 1.1 ross 351 1.1 ross float64 syst_float64_add( float64 a, float64 b ) 352 1.1 ross { 353 1.7 matt const union64 ua = { .f64 = a }, ub = { .f64 = b }; 354 1.7 matt union64 uz; 355 1.1 ross 356 1.7 matt uz.d = ua.d + ub.d; 357 1.7 matt return uz.f64; 358 1.1 ross } 359 1.1 ross 360 1.1 ross float64 syst_float64_sub( float64 a, float64 b ) 361 1.1 ross { 362 1.7 matt const union64 ua = { .f64 = a }, ub = { .f64 = b }; 363 1.7 matt union64 uz; 364 1.1 ross 365 1.7 matt uz.d = ua.d - ub.d; 366 1.7 matt return uz.f64; 367 1.1 ross } 368 1.1 ross 369 1.1 ross float64 syst_float64_mul( float64 a, float64 b ) 370 1.1 ross { 371 1.7 matt const union64 ua = { .f64 = a }, ub = { .f64 = b }; 372 1.7 matt union64 uz; 373 1.1 ross 374 1.7 matt uz.d = ua.d * ub.d; 375 1.7 matt return uz.f64; 376 1.1 ross } 377 1.1 ross 378 1.1 ross float64 syst_float64_div( float64 a, float64 b ) 379 1.1 ross { 380 1.7 matt const union64 ua = { .f64 = a }, ub = { .f64 = b }; 381 1.7 matt union64 uz; 382 1.1 ross 383 1.7 matt uz.d = ua.d / ub.d; 384 1.7 matt return uz.f64; 385 1.1 ross } 386 1.1 ross 387 1.1 ross float64 syst_float64_sqrt( float64 a ) 388 1.1 ross { 389 1.7 matt const union64 ua = { .f64 = a }; 390 1.7 matt union64 uz; 391 1.1 ross 392 1.7 matt uz.d = sqrt(ua.d); 393 1.7 matt return uz.f64; 394 1.1 ross } 395 1.1 ross 396 1.1 ross flag syst_float64_eq( float64 a, float64 b ) 397 1.1 ross { 398 1.7 matt const union64 ua = { .f64 = a }, ub = { .f64 = b }; 399 1.1 ross 400 1.7 matt return ua.d == ub.d; 401 1.1 ross } 402 1.1 ross 403 1.1 ross flag syst_float64_le( float64 a, float64 b ) 404 1.1 ross { 405 1.7 matt const union64 ua = { .f64 = a }, ub = { .f64 = b }; 406 1.1 ross 407 1.7 matt return ua.d <= ub.d; 408 1.1 ross } 409 1.1 ross 410 1.1 ross flag syst_float64_lt( float64 a, float64 b ) 411 1.1 ross { 412 1.7 matt const union64 ua = { .f64 = a }, ub = { .f64 = b }; 413 1.1 ross 414 1.7 matt return ua.d < ub.d; 415 1.1 ross } 416 1.1 ross 417 1.1 ross #if defined( FLOATX80 ) && defined( LONG_DOUBLE_IS_FLOATX80 ) 418 1.1 ross 419 1.1 ross int32 syst_floatx80_to_int32_round_to_zero( floatx80 a ) 420 1.1 ross { 421 1.7 matt const unionx80 uz = { .fx80 = a }; 422 1.1 ross 423 1.7 matt return uz.ld; 424 1.1 ross } 425 1.1 ross 426 1.1 ross #ifdef BITS64 427 1.1 ross 428 1.1 ross int64 syst_floatx80_to_int64_round_to_zero( floatx80 a ) 429 1.1 ross { 430 1.7 matt const unionx80 uz = { .fx80 = a }; 431 1.1 ross 432 1.7 matt return uz.ld; 433 1.1 ross } 434 1.1 ross 435 1.1 ross #endif 436 1.1 ross 437 1.1 ross float32 syst_floatx80_to_float32( floatx80 a ) 438 1.1 ross { 439 1.7 matt const unionx80 ua = { .fx80 = a }; 440 1.7 matt union32 uz; 441 1.1 ross 442 1.7 matt uz.f = ua.ld; 443 1.7 matt return uz.f32; 444 1.1 ross } 445 1.1 ross 446 1.1 ross float64 syst_floatx80_to_float64( floatx80 a ) 447 1.1 ross { 448 1.7 matt const unionx80 ua = { .fx80 = a }; 449 1.7 matt union64 uz; 450 1.1 ross 451 1.7 matt uz.d = ua.ld; 452 1.7 matt return uz.f64; 453 1.1 ross } 454 1.1 ross 455 1.1 ross floatx80 syst_floatx80_add( floatx80 a, floatx80 b ) 456 1.1 ross { 457 1.7 matt const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b }; 458 1.7 matt unionx80 uz; 459 1.1 ross 460 1.7 matt uz.ld = ua.ld + ub.ld; 461 1.7 matt return uz.fx80; 462 1.1 ross } 463 1.1 ross 464 1.1 ross floatx80 syst_floatx80_sub( floatx80 a, floatx80 b ) 465 1.1 ross { 466 1.7 matt const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b }; 467 1.7 matt unionx80 uz; 468 1.1 ross 469 1.7 matt uz.ld = ua.ld - ub.ld; 470 1.7 matt return uz.fx80; 471 1.1 ross } 472 1.1 ross 473 1.1 ross floatx80 syst_floatx80_mul( floatx80 a, floatx80 b ) 474 1.1 ross { 475 1.7 matt const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b }; 476 1.7 matt unionx80 uz; 477 1.1 ross 478 1.7 matt uz.ld = ua.ld * ub.ld; 479 1.7 matt return uz.fx80; 480 1.1 ross } 481 1.1 ross 482 1.1 ross floatx80 syst_floatx80_div( floatx80 a, floatx80 b ) 483 1.1 ross { 484 1.7 matt const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b }; 485 1.7 matt unionx80 uz; 486 1.1 ross 487 1.7 matt uz.ld = ua.ld / ub.ld; 488 1.7 matt return uz.fx80; 489 1.1 ross } 490 1.1 ross 491 1.1 ross flag syst_floatx80_eq( floatx80 a, floatx80 b ) 492 1.1 ross { 493 1.7 matt const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b }; 494 1.1 ross 495 1.7 matt return ua.ld == ub.ld; 496 1.1 ross } 497 1.1 ross 498 1.1 ross flag syst_floatx80_le( floatx80 a, floatx80 b ) 499 1.1 ross { 500 1.7 matt const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b }; 501 1.1 ross 502 1.7 matt return ua.ld <= ub.ld; 503 1.1 ross } 504 1.1 ross 505 1.1 ross flag syst_floatx80_lt( floatx80 a, floatx80 b ) 506 1.1 ross { 507 1.7 matt const unionx80 ua = { .fx80 = a }, ub = { .fx80 = b }; 508 1.1 ross 509 1.7 matt return ua.ld < ub.ld; 510 1.1 ross } 511 1.1 ross 512 1.1 ross #endif 513 1.1 ross 514 1.1 ross #if defined( FLOAT128 ) && defined( LONG_DOUBLE_IS_FLOAT128 ) 515 1.1 ross 516 1.1 ross int32 syst_float128_to_int32_round_to_zero( float128 a ) 517 1.1 ross { 518 1.7 matt const union128 ua = { .f128 = a }; 519 1.1 ross 520 1.7 matt return ua.ld; 521 1.1 ross } 522 1.1 ross 523 1.1 ross #ifdef BITS64 524 1.1 ross 525 1.1 ross int64 syst_float128_to_int64_round_to_zero( float128 a ) 526 1.1 ross { 527 1.7 matt const union128 ua = { .f128 = a }; 528 1.1 ross 529 1.7 matt return ua.ld; 530 1.1 ross } 531 1.1 ross 532 1.1 ross #endif 533 1.1 ross 534 1.1 ross float32 syst_float128_to_float32( float128 a ) 535 1.1 ross { 536 1.7 matt const union128 ua = { .f128 = a }; 537 1.7 matt union32 uz; 538 1.1 ross 539 1.7 matt uz.f = ua.ld; 540 1.7 matt return uz.f32; 541 1.1 ross 542 1.1 ross } 543 1.1 ross 544 1.1 ross float64 syst_float128_to_float64( float128 a ) 545 1.1 ross { 546 1.7 matt const union128 ua = { .f128 = a }; 547 1.7 matt union64 uz; 548 1.1 ross 549 1.7 matt uz.d = ua.ld; 550 1.7 matt return uz.f64; 551 1.1 ross } 552 1.1 ross 553 1.1 ross float128 syst_float128_add( float128 a, float128 b ) 554 1.1 ross { 555 1.7 matt const union128 ua = { .f128 = a }, ub = { .f128 = b }; 556 1.7 matt union128 uz; 557 1.1 ross 558 1.7 matt uz.ld = ua.ld + ub.ld; 559 1.7 matt return uz.f128; 560 1.1 ross 561 1.1 ross } 562 1.1 ross 563 1.1 ross float128 syst_float128_sub( float128 a, float128 b ) 564 1.1 ross { 565 1.7 matt const union128 ua = { .f128 = a }, ub = { .f128 = b }; 566 1.7 matt union128 uz; 567 1.1 ross 568 1.7 matt uz.ld = ua.ld - ub.ld; 569 1.7 matt return uz.f128; 570 1.1 ross } 571 1.1 ross 572 1.1 ross float128 syst_float128_mul( float128 a, float128 b ) 573 1.1 ross { 574 1.7 matt const union128 ua = { .f128 = a }, ub = { .f128 = b }; 575 1.7 matt union128 uz; 576 1.1 ross 577 1.7 matt uz.ld = ua.ld * ub.ld; 578 1.7 matt return uz.f128; 579 1.1 ross } 580 1.1 ross 581 1.1 ross float128 syst_float128_div( float128 a, float128 b ) 582 1.1 ross { 583 1.7 matt const union128 ua = { .f128 = a }, ub = { .f128 = b }; 584 1.7 matt union128 uz; 585 1.1 ross 586 1.7 matt uz.ld = ua.ld / ub.ld; 587 1.7 matt return uz.f128; 588 1.1 ross } 589 1.1 ross 590 1.1 ross flag syst_float128_eq( float128 a, float128 b ) 591 1.1 ross { 592 1.7 matt const union128 ua = { .f128 = a }, ub = { .f128 = b }; 593 1.1 ross 594 1.7 matt return ua.ld == ub.ld; 595 1.1 ross } 596 1.1 ross 597 1.1 ross flag syst_float128_le( float128 a, float128 b ) 598 1.1 ross { 599 1.7 matt const union128 ua = { .f128 = a }, ub = { .f128 = b }; 600 1.1 ross 601 1.7 matt return ua.ld <= ub.ld; 602 1.1 ross } 603 1.1 ross 604 1.1 ross flag syst_float128_lt( float128 a, float128 b ) 605 1.1 ross { 606 1.7 matt const union128 ua = { .f128 = a }, ub = { .f128 = b }; 607 1.1 ross 608 1.7 matt return ua.ld < ub.ld; 609 1.1 ross } 610 1.1 ross 611 1.1 ross #endif 612