systfloat.c revision 1.8 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