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