Annotation of OpenXM_contrib2/asir2000/builtin/round.c, Revision 1.8
1.8 ! kondoh 1: /* $OpenXM: OpenXM_contrib2/asir2000/builtin/round.c,v 1.7 2018/03/29 01:32:50 noro Exp $ */
1.6 noro 2:
3: #undef INTERVAL
1.8 ! kondoh 4: #define INTERVAL 1
1.1 noro 5: #include "ca.h"
6: #include "parse.h"
1.6 noro 7: #include "interval.h"
8:
9: void Padd_pinf(),Padd_minf();
10: void Psub_pinf(),Psub_minf();
11: void Pmul_pinf(),Pmul_minf();
12: void Pdiv_pinf(),Pdiv_minf();
1.1 noro 13:
14: struct ftab round_tab[] = {
1.7 noro 15: {"add_pinf",Padd_pinf,2},
16: {"add_minf",Padd_minf,2},
17: {"sub_pinf",Psub_pinf,2},
18: {"sub_minf",Psub_minf,2},
19: {"mul_pinf",Pmul_pinf,2},
20: {"mul_minf",Pmul_minf,2},
21: {"div_pinf",Pdiv_pinf,2},
22: {"div_minf",Pdiv_minf,2},
23: {0,0,0},
1.1 noro 24: };
1.6 noro 25:
26: void Padd_pinf(NODE arg,Real *rp)
27: {
1.7 noro 28: Real a,b,r;
29: double c;
1.6 noro 30:
1.7 noro 31: a = (Real)ARG0(arg);
32: b = (Real)ARG1(arg);
33: if ( !a )
34: *rp = b;
35: else if ( !b )
36: *rp = a;
37: else if ( NID(a) != N_R || NID(b) != N_R )
38: error("add_pinf : invalid argument");
39: else {
40: FPPLUSINF
41: c = BDY(a)+BDY(b);
42: FPNEAREST
43: MKReal(c,r);
44: *rp = r;
45: }
1.6 noro 46: }
47:
48: void Padd_minf(NODE arg,Real *rp)
49: {
1.7 noro 50: Real a,b,r;
51: double c;
1.6 noro 52:
1.7 noro 53: a = (Real)ARG0(arg);
54: b = (Real)ARG1(arg);
55: if ( !a )
56: *rp = b;
57: else if ( !b )
58: *rp = a;
59: else if ( NID(a) != N_R || NID(b) != N_R )
60: error("add_pinf : invalid argument");
61: else {
62: FPMINUSINF
63: c = BDY(a)+BDY(b);
64: FPNEAREST
65: MKReal(c,r);
66: *rp = r;
67: }
1.6 noro 68: }
69:
70: void Psub_pinf(NODE arg,Real *rp)
71: {
1.7 noro 72: Real a,b,r;
73: double c;
1.6 noro 74:
1.7 noro 75: a = (Real)ARG0(arg);
76: b = (Real)ARG1(arg);
77: if ( !a ) {
78: if ( !b )
79: *rp = 0;
80: else {
81: c = -BDY(b);
82: MKReal(c,r);
83: *rp = r;
84: }
85: } else if ( !b )
86: *rp = a;
87: else if ( NID(a) != N_R || NID(b) != N_R )
88: error("sub_pinf : invalid argument");
89: else {
90: FPPLUSINF
91: c = BDY(a)-BDY(b);
92: FPNEAREST
93: MKReal(c,r);
94: *rp = r;
95: }
1.6 noro 96: }
97:
98: void Psub_minf(NODE arg,Real *rp)
99: {
1.7 noro 100: Real a,b,r;
101: double c;
1.6 noro 102:
1.7 noro 103: a = (Real)ARG0(arg);
104: b = (Real)ARG1(arg);
105: if ( !a ) {
106: if ( !b )
107: *rp = 0;
108: else {
109: c = -BDY(b);
110: MKReal(c,r);
111: *rp = r;
112: }
113: } else if ( !b )
114: *rp = a;
115: else if ( NID(a) != N_R || NID(b) != N_R )
116: error("sub_minf : invalid argument");
117: else {
118: FPMINUSINF
119: c = BDY(a)-BDY(b);
120: FPNEAREST
121: MKReal(c,r);
122: *rp = r;
123: }
1.6 noro 124: }
125:
126: void Pmul_pinf(NODE arg,Real *rp)
127: {
1.7 noro 128: Real a,b,r;
129: double c;
1.6 noro 130:
1.7 noro 131: a = (Real)ARG0(arg);
132: b = (Real)ARG1(arg);
133: if ( !a || !b )
134: *rp = 0;
135: else if ( NID(a) != N_R || NID(b) != N_R )
136: error("mul_pinf : invalid argument");
137: else {
138: FPPLUSINF
139: c = BDY(a)*BDY(b);
140: FPNEAREST
141: MKReal(c,r);
142: *rp = r;
143: }
1.6 noro 144: }
145:
146: void Pmul_minf(NODE arg,Real *rp)
147: {
1.7 noro 148: Real a,b,r;
149: double c;
1.6 noro 150:
1.7 noro 151: a = (Real)ARG0(arg);
152: b = (Real)ARG1(arg);
153: if ( !a || !b )
154: *rp = 0;
155: else if ( NID(a) != N_R || NID(b) != N_R )
156: error("mul_minf : invalid argument");
157: else {
158: FPMINUSINF
159: c = BDY(a)*BDY(b);
160: FPNEAREST
161: MKReal(c,r);
162: *rp = r;
163: }
1.6 noro 164: }
165:
166: void Pdiv_pinf(NODE arg,Real *rp)
167: {
1.7 noro 168: Real a,b,r;
169: double c;
1.6 noro 170:
1.7 noro 171: a = (Real)ARG0(arg);
172: b = (Real)ARG1(arg);
173: if ( !b )
174: error("div_pinf : division by 0");
175: else if ( !a )
176: *rp = 0;
177: else if ( NID(a) != N_R || NID(b) != N_R )
178: error("div_pinf : invalid argument");
179: else {
180: FPPLUSINF
181: c = BDY(a)/BDY(b);
182: FPNEAREST
183: MKReal(c,r);
184: *rp = r;
185: }
1.6 noro 186: }
187:
188: void Pdiv_minf(NODE arg,Real *rp)
189: {
1.7 noro 190: Real a,b,r;
191: double c;
1.6 noro 192:
1.7 noro 193: a = (Real)ARG0(arg);
194: b = (Real)ARG1(arg);
195: if ( !b )
196: error("div_minf : division by 0");
197: else if ( !a )
198: *rp = 0;
199: else if ( NID(a) != N_R || NID(b) != N_R )
200: error("div_minf : invalid argument");
201: else {
202: FPMINUSINF
203: c = BDY(a)/BDY(b);
204: FPNEAREST
205: MKReal(c,r);
206: *rp = r;
207: }
1.6 noro 208: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>