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