fxtract.c revision e739ac0589b4fb43561f801c4faba8c1b89f8680
1
2#include <stdio.h>
3#include <math.h>
4
5double arg, res1, res2;
6
7extern void do_fxtract ( void );
8asm("\n"
9".global do_fxtract\n"
10"do_fxtract:\n"
11"\tfinit\n"
12"\tfldl arg\n"
13"\tfxtract\n"
14"\tfstpl res1\n"
15"\tfstpl res2\n"
16"\tret"
17);
18
19void try ( double x )
20{
21  arg = x * 1.414213562373049;
22  res1 = res2 = 0.0;
23  do_fxtract();
24  printf("%17.10e  -> %14.10f %14.10f\n", arg, res1, res2);
25}
26
27int main ( void )
28{
29  int i;
30
31  /* positives */
32
33  for (i = 0; i < 40; i++)
34     try( 1.27 + (double)(i*10 - 200) );
35
36  try(+0.0);
37  try(1.0 / 0.0);
38  try(sqrt(-1.0));
39
40  try(5.1e-308);
41  try(4.1e-308);
42  try(3.1e-308);
43  try(2.1e-308);
44  try(1.1e-308);
45  try(0.9e-308);
46  try(0.7e-308);
47  try(0.6e-308);
48  try(0.5e-308);
49  try(0.4e-308);
50  try(0.3e-308);
51  try(0.1e-308);
52
53  try(1.3e-320);
54  try(1.3e-321);
55  try(1.3e-322);
56  try(1.3e-323);
57  try(0.9e-323);
58  try(0.7e-323);
59  try(0.5e-323);
60  try(0.3e-323);
61  try(0.2e-323);
62  try(1.3e-324);
63
64  /* negatives */
65
66  printf("\n");
67  for (i = 0; i < 40; i++)
68     try( - (1.27 + (double)(i*10 - 200)) );
69
70  try(-0.0);
71  try(-(1.0 / 0.0));
72  try(-sqrt(-1.0));
73
74  try(-5.1e-308);
75  try(-4.1e-308);
76  try(-3.1e-308);
77  try(-2.1e-308);
78  try(-1.1e-308);
79  try(-0.9e-308);
80  try(-0.7e-308);
81  try(-0.6e-308);
82  try(-0.5e-308);
83  try(-0.4e-308);
84  try(-0.3e-308);
85  try(-0.1e-308);
86
87  try(-1.3e-320);
88  try(-1.3e-321);
89  try(-1.3e-322);
90  try(-1.3e-323);
91  try(-0.9e-323);
92  try(-0.7e-323);
93  try(-0.5e-323);
94  try(-0.3e-323);
95  try(-0.2e-323);
96  try(-1.3e-324);
97
98  return 0;
99}
100