1 | /* |
2 | * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved. |
3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | * |
5 | * This code is free software; you can redistribute it and/or modify it |
6 | * under the terms of the GNU General Public License version 2 only, as |
7 | * published by the Free Software Foundation. Oracle designates this |
8 | * particular file as subject to the "Classpath" exception as provided |
9 | * by Oracle in the LICENSE file that accompanied this code. |
10 | * |
11 | * This code is distributed in the hope that it will be useful, but WITHOUT |
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
14 | * version 2 for more details (a copy is included in the LICENSE file that |
15 | * accompanied this code). |
16 | * |
17 | * You should have received a copy of the GNU General Public License version |
18 | * 2 along with this work; if not, write to the Free Software Foundation, |
19 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
20 | * |
21 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 | * or visit www.oracle.com if you need additional information or have any |
23 | * questions. |
24 | */ |
25 | |
26 | #include "fdlibm.h" |
27 | #include <errno.h> |
28 | |
29 | #ifndef _USE_WRITE |
30 | #include <stdio.h> /* fputs(), stderr */ |
31 | #define WRITE2(u,v) fputs(u, stderr) |
32 | #else /* !defined(_USE_WRITE) */ |
33 | #include <unistd.h> /* write */ |
34 | #define WRITE2(u,v) write(2, u, v) |
35 | #undef fflush |
36 | #endif /* !defined(_USE_WRITE) */ |
37 | |
38 | static double zero = 0.0; /* used as const */ |
39 | |
40 | /* |
41 | * Standard conformance (non-IEEE) on exception cases. |
42 | * Mapping: |
43 | * 1 -- acos(|x|>1) |
44 | * 2 -- asin(|x|>1) |
45 | * 3 -- atan2(+-0,+-0) |
46 | * 4 -- hypot overflow |
47 | * 5 -- cosh overflow |
48 | * 6 -- exp overflow |
49 | * 7 -- exp underflow |
50 | * 8 -- y0(0) |
51 | * 9 -- y0(-ve) |
52 | * 10-- y1(0) |
53 | * 11-- y1(-ve) |
54 | * 12-- yn(0) |
55 | * 13-- yn(-ve) |
56 | * 14-- lgamma(finite) overflow |
57 | * 15-- lgamma(-integer) |
58 | * 16-- log(0) |
59 | * 17-- log(x<0) |
60 | * 18-- log10(0) |
61 | * 19-- log10(x<0) |
62 | * 20-- pow(0.0,0.0) |
63 | * 21-- pow(x,y) overflow |
64 | * 22-- pow(x,y) underflow |
65 | * 23-- pow(0,negative) |
66 | * 24-- pow(neg,non-integral) |
67 | * 25-- sinh(finite) overflow |
68 | * 26-- sqrt(negative) |
69 | * 27-- fmod(x,0) |
70 | * 28-- remainder(x,0) |
71 | * 29-- acosh(x<1) |
72 | * 30-- atanh(|x|>1) |
73 | * 31-- atanh(|x|=1) |
74 | * 32-- scalb overflow |
75 | * 33-- scalb underflow |
76 | * 34-- j0(|x|>X_TLOSS) |
77 | * 35-- y0(x>X_TLOSS) |
78 | * 36-- j1(|x|>X_TLOSS) |
79 | * 37-- y1(x>X_TLOSS) |
80 | * 38-- jn(|x|>X_TLOSS, n) |
81 | * 39-- yn(x>X_TLOSS, n) |
82 | * 40-- gamma(finite) overflow |
83 | * 41-- gamma(-integer) |
84 | * 42-- pow(NaN,0.0) |
85 | */ |
86 | |
87 | |
88 | #ifdef __STDC__ |
89 | double __kernel_standard(double x, double y, int type) |
90 | #else |
91 | double __kernel_standard(x,y,type) |
92 | double x,y; int type; |
93 | #endif |
94 | { |
95 | struct exception exc; |
96 | #ifndef HUGE_VAL /* this is the only routine that uses HUGE_VAL */ |
97 | #define HUGE_VAL inf |
98 | double inf = 0.0; |
99 | |
100 | __HI(inf) = 0x7ff00000; /* set inf to infinite */ |
101 | #endif |
102 | |
103 | #ifdef _USE_WRITE |
104 | (void) fflush(stdout); |
105 | #endif |
106 | exc.arg1 = x; |
107 | exc.arg2 = y; |
108 | switch(type) { |
109 | case 1: |
110 | /* acos(|x|>1) */ |
111 | exc.type = DOMAIN; |
112 | exc.name = "acos" ; |
113 | exc.retval = zero; |
114 | if (_LIB_VERSION == _POSIX_) |
115 | errno = EDOM; |
116 | else if (!matherr(&exc)) { |
117 | if(_LIB_VERSION == _SVID_) { |
118 | (void) WRITE2("acos: DOMAIN error\n" , 19); |
119 | } |
120 | errno = EDOM; |
121 | } |
122 | break; |
123 | case 2: |
124 | /* asin(|x|>1) */ |
125 | exc.type = DOMAIN; |
126 | exc.name = "asin" ; |
127 | exc.retval = zero; |
128 | if(_LIB_VERSION == _POSIX_) |
129 | errno = EDOM; |
130 | else if (!matherr(&exc)) { |
131 | if(_LIB_VERSION == _SVID_) { |
132 | (void) WRITE2("asin: DOMAIN error\n" , 19); |
133 | } |
134 | errno = EDOM; |
135 | } |
136 | break; |
137 | case 3: |
138 | /* atan2(+-0,+-0) */ |
139 | exc.arg1 = y; |
140 | exc.arg2 = x; |
141 | exc.type = DOMAIN; |
142 | exc.name = "atan2" ; |
143 | exc.retval = zero; |
144 | if(_LIB_VERSION == _POSIX_) |
145 | errno = EDOM; |
146 | else if (!matherr(&exc)) { |
147 | if(_LIB_VERSION == _SVID_) { |
148 | (void) WRITE2("atan2: DOMAIN error\n" , 20); |
149 | } |
150 | errno = EDOM; |
151 | } |
152 | break; |
153 | case 4: |
154 | /* hypot(finite,finite) overflow */ |
155 | exc.type = OVERFLOW; |
156 | exc.name = "hypot" ; |
157 | if (_LIB_VERSION == _SVID_) |
158 | exc.retval = HUGE; |
159 | else |
160 | exc.retval = HUGE_VAL; |
161 | if (_LIB_VERSION == _POSIX_) |
162 | errno = ERANGE; |
163 | else if (!matherr(&exc)) { |
164 | errno = ERANGE; |
165 | } |
166 | break; |
167 | case 5: |
168 | /* cosh(finite) overflow */ |
169 | exc.type = OVERFLOW; |
170 | exc.name = "cosh" ; |
171 | if (_LIB_VERSION == _SVID_) |
172 | exc.retval = HUGE; |
173 | else |
174 | exc.retval = HUGE_VAL; |
175 | if (_LIB_VERSION == _POSIX_) |
176 | errno = ERANGE; |
177 | else if (!matherr(&exc)) { |
178 | errno = ERANGE; |
179 | } |
180 | break; |
181 | case 6: |
182 | /* exp(finite) overflow */ |
183 | exc.type = OVERFLOW; |
184 | exc.name = "exp" ; |
185 | if (_LIB_VERSION == _SVID_) |
186 | exc.retval = HUGE; |
187 | else |
188 | exc.retval = HUGE_VAL; |
189 | if (_LIB_VERSION == _POSIX_) |
190 | errno = ERANGE; |
191 | else if (!matherr(&exc)) { |
192 | errno = ERANGE; |
193 | } |
194 | break; |
195 | case 7: |
196 | /* exp(finite) underflow */ |
197 | exc.type = UNDERFLOW; |
198 | exc.name = "exp" ; |
199 | exc.retval = zero; |
200 | if (_LIB_VERSION == _POSIX_) |
201 | errno = ERANGE; |
202 | else if (!matherr(&exc)) { |
203 | errno = ERANGE; |
204 | } |
205 | break; |
206 | case 8: |
207 | /* y0(0) = -inf */ |
208 | exc.type = DOMAIN; /* should be SING for IEEE */ |
209 | exc.name = "y0" ; |
210 | if (_LIB_VERSION == _SVID_) |
211 | exc.retval = -HUGE; |
212 | else |
213 | exc.retval = -HUGE_VAL; |
214 | if (_LIB_VERSION == _POSIX_) |
215 | errno = EDOM; |
216 | else if (!matherr(&exc)) { |
217 | if (_LIB_VERSION == _SVID_) { |
218 | (void) WRITE2("y0: DOMAIN error\n" , 17); |
219 | } |
220 | errno = EDOM; |
221 | } |
222 | break; |
223 | case 9: |
224 | /* y0(x<0) = NaN */ |
225 | exc.type = DOMAIN; |
226 | exc.name = "y0" ; |
227 | if (_LIB_VERSION == _SVID_) |
228 | exc.retval = -HUGE; |
229 | else |
230 | exc.retval = -HUGE_VAL; |
231 | if (_LIB_VERSION == _POSIX_) |
232 | errno = EDOM; |
233 | else if (!matherr(&exc)) { |
234 | if (_LIB_VERSION == _SVID_) { |
235 | (void) WRITE2("y0: DOMAIN error\n" , 17); |
236 | } |
237 | errno = EDOM; |
238 | } |
239 | break; |
240 | case 10: |
241 | /* y1(0) = -inf */ |
242 | exc.type = DOMAIN; /* should be SING for IEEE */ |
243 | exc.name = "y1" ; |
244 | if (_LIB_VERSION == _SVID_) |
245 | exc.retval = -HUGE; |
246 | else |
247 | exc.retval = -HUGE_VAL; |
248 | if (_LIB_VERSION == _POSIX_) |
249 | errno = EDOM; |
250 | else if (!matherr(&exc)) { |
251 | if (_LIB_VERSION == _SVID_) { |
252 | (void) WRITE2("y1: DOMAIN error\n" , 17); |
253 | } |
254 | errno = EDOM; |
255 | } |
256 | break; |
257 | case 11: |
258 | /* y1(x<0) = NaN */ |
259 | exc.type = DOMAIN; |
260 | exc.name = "y1" ; |
261 | if (_LIB_VERSION == _SVID_) |
262 | exc.retval = -HUGE; |
263 | else |
264 | exc.retval = -HUGE_VAL; |
265 | if (_LIB_VERSION == _POSIX_) |
266 | errno = EDOM; |
267 | else if (!matherr(&exc)) { |
268 | if (_LIB_VERSION == _SVID_) { |
269 | (void) WRITE2("y1: DOMAIN error\n" , 17); |
270 | } |
271 | errno = EDOM; |
272 | } |
273 | break; |
274 | case 12: |
275 | /* yn(n,0) = -inf */ |
276 | exc.type = DOMAIN; /* should be SING for IEEE */ |
277 | exc.name = "yn" ; |
278 | if (_LIB_VERSION == _SVID_) |
279 | exc.retval = -HUGE; |
280 | else |
281 | exc.retval = -HUGE_VAL; |
282 | if (_LIB_VERSION == _POSIX_) |
283 | errno = EDOM; |
284 | else if (!matherr(&exc)) { |
285 | if (_LIB_VERSION == _SVID_) { |
286 | (void) WRITE2("yn: DOMAIN error\n" , 17); |
287 | } |
288 | errno = EDOM; |
289 | } |
290 | break; |
291 | case 13: |
292 | /* yn(x<0) = NaN */ |
293 | exc.type = DOMAIN; |
294 | exc.name = "yn" ; |
295 | if (_LIB_VERSION == _SVID_) |
296 | exc.retval = -HUGE; |
297 | else |
298 | exc.retval = -HUGE_VAL; |
299 | if (_LIB_VERSION == _POSIX_) |
300 | errno = EDOM; |
301 | else if (!matherr(&exc)) { |
302 | if (_LIB_VERSION == _SVID_) { |
303 | (void) WRITE2("yn: DOMAIN error\n" , 17); |
304 | } |
305 | errno = EDOM; |
306 | } |
307 | break; |
308 | case 14: |
309 | /* lgamma(finite) overflow */ |
310 | exc.type = OVERFLOW; |
311 | exc.name = "lgamma" ; |
312 | if (_LIB_VERSION == _SVID_) |
313 | exc.retval = HUGE; |
314 | else |
315 | exc.retval = HUGE_VAL; |
316 | if (_LIB_VERSION == _POSIX_) |
317 | errno = ERANGE; |
318 | else if (!matherr(&exc)) { |
319 | errno = ERANGE; |
320 | } |
321 | break; |
322 | case 15: |
323 | /* lgamma(-integer) or lgamma(0) */ |
324 | exc.type = SING; |
325 | exc.name = "lgamma" ; |
326 | if (_LIB_VERSION == _SVID_) |
327 | exc.retval = HUGE; |
328 | else |
329 | exc.retval = HUGE_VAL; |
330 | if (_LIB_VERSION == _POSIX_) |
331 | errno = EDOM; |
332 | else if (!matherr(&exc)) { |
333 | if (_LIB_VERSION == _SVID_) { |
334 | (void) WRITE2("lgamma: SING error\n" , 19); |
335 | } |
336 | errno = EDOM; |
337 | } |
338 | break; |
339 | case 16: |
340 | /* log(0) */ |
341 | exc.type = SING; |
342 | exc.name = "log" ; |
343 | if (_LIB_VERSION == _SVID_) |
344 | exc.retval = -HUGE; |
345 | else |
346 | exc.retval = -HUGE_VAL; |
347 | if (_LIB_VERSION == _POSIX_) |
348 | errno = ERANGE; |
349 | else if (!matherr(&exc)) { |
350 | if (_LIB_VERSION == _SVID_) { |
351 | (void) WRITE2("log: SING error\n" , 16); |
352 | } |
353 | errno = EDOM; |
354 | } |
355 | break; |
356 | case 17: |
357 | /* log(x<0) */ |
358 | exc.type = DOMAIN; |
359 | exc.name = "log" ; |
360 | if (_LIB_VERSION == _SVID_) |
361 | exc.retval = -HUGE; |
362 | else |
363 | exc.retval = -HUGE_VAL; |
364 | if (_LIB_VERSION == _POSIX_) |
365 | errno = EDOM; |
366 | else if (!matherr(&exc)) { |
367 | if (_LIB_VERSION == _SVID_) { |
368 | (void) WRITE2("log: DOMAIN error\n" , 18); |
369 | } |
370 | errno = EDOM; |
371 | } |
372 | break; |
373 | case 18: |
374 | /* log10(0) */ |
375 | exc.type = SING; |
376 | exc.name = "log10" ; |
377 | if (_LIB_VERSION == _SVID_) |
378 | exc.retval = -HUGE; |
379 | else |
380 | exc.retval = -HUGE_VAL; |
381 | if (_LIB_VERSION == _POSIX_) |
382 | errno = ERANGE; |
383 | else if (!matherr(&exc)) { |
384 | if (_LIB_VERSION == _SVID_) { |
385 | (void) WRITE2("log10: SING error\n" , 18); |
386 | } |
387 | errno = EDOM; |
388 | } |
389 | break; |
390 | case 19: |
391 | /* log10(x<0) */ |
392 | exc.type = DOMAIN; |
393 | exc.name = "log10" ; |
394 | if (_LIB_VERSION == _SVID_) |
395 | exc.retval = -HUGE; |
396 | else |
397 | exc.retval = -HUGE_VAL; |
398 | if (_LIB_VERSION == _POSIX_) |
399 | errno = EDOM; |
400 | else if (!matherr(&exc)) { |
401 | if (_LIB_VERSION == _SVID_) { |
402 | (void) WRITE2("log10: DOMAIN error\n" , 20); |
403 | } |
404 | errno = EDOM; |
405 | } |
406 | break; |
407 | case 20: |
408 | /* pow(0.0,0.0) */ |
409 | /* error only if _LIB_VERSION == _SVID_ */ |
410 | exc.type = DOMAIN; |
411 | exc.name = "pow" ; |
412 | exc.retval = zero; |
413 | if (_LIB_VERSION != _SVID_) exc.retval = 1.0; |
414 | else if (!matherr(&exc)) { |
415 | (void) WRITE2("pow(0,0): DOMAIN error\n" , 23); |
416 | errno = EDOM; |
417 | } |
418 | break; |
419 | case 21: |
420 | /* pow(x,y) overflow */ |
421 | exc.type = OVERFLOW; |
422 | exc.name = "pow" ; |
423 | if (_LIB_VERSION == _SVID_) { |
424 | exc.retval = HUGE; |
425 | y *= 0.5; |
426 | if(x<zero&&rint(y)!=y) exc.retval = -HUGE; |
427 | } else { |
428 | exc.retval = HUGE_VAL; |
429 | y *= 0.5; |
430 | if(x<zero&&rint(y)!=y) exc.retval = -HUGE_VAL; |
431 | } |
432 | if (_LIB_VERSION == _POSIX_) |
433 | errno = ERANGE; |
434 | else if (!matherr(&exc)) { |
435 | errno = ERANGE; |
436 | } |
437 | break; |
438 | case 22: |
439 | /* pow(x,y) underflow */ |
440 | exc.type = UNDERFLOW; |
441 | exc.name = "pow" ; |
442 | exc.retval = zero; |
443 | if (_LIB_VERSION == _POSIX_) |
444 | errno = ERANGE; |
445 | else if (!matherr(&exc)) { |
446 | errno = ERANGE; |
447 | } |
448 | break; |
449 | case 23: |
450 | /* 0**neg */ |
451 | exc.type = DOMAIN; |
452 | exc.name = "pow" ; |
453 | if (_LIB_VERSION == _SVID_) |
454 | exc.retval = zero; |
455 | else |
456 | exc.retval = -HUGE_VAL; |
457 | if (_LIB_VERSION == _POSIX_) |
458 | errno = EDOM; |
459 | else if (!matherr(&exc)) { |
460 | if (_LIB_VERSION == _SVID_) { |
461 | (void) WRITE2("pow(0,neg): DOMAIN error\n" , 25); |
462 | } |
463 | errno = EDOM; |
464 | } |
465 | break; |
466 | case 24: |
467 | /* neg**non-integral */ |
468 | exc.type = DOMAIN; |
469 | exc.name = "pow" ; |
470 | if (_LIB_VERSION == _SVID_) |
471 | exc.retval = zero; |
472 | else |
473 | exc.retval = zero/zero; /* X/Open allow NaN */ |
474 | if (_LIB_VERSION == _POSIX_) |
475 | errno = EDOM; |
476 | else if (!matherr(&exc)) { |
477 | if (_LIB_VERSION == _SVID_) { |
478 | (void) WRITE2("neg**non-integral: DOMAIN error\n" , 32); |
479 | } |
480 | errno = EDOM; |
481 | } |
482 | break; |
483 | case 25: |
484 | /* sinh(finite) overflow */ |
485 | exc.type = OVERFLOW; |
486 | exc.name = "sinh" ; |
487 | if (_LIB_VERSION == _SVID_) |
488 | exc.retval = ( (x>zero) ? HUGE : -HUGE); |
489 | else |
490 | exc.retval = ( (x>zero) ? HUGE_VAL : -HUGE_VAL); |
491 | if (_LIB_VERSION == _POSIX_) |
492 | errno = ERANGE; |
493 | else if (!matherr(&exc)) { |
494 | errno = ERANGE; |
495 | } |
496 | break; |
497 | case 26: |
498 | /* sqrt(x<0) */ |
499 | exc.type = DOMAIN; |
500 | exc.name = "sqrt" ; |
501 | if (_LIB_VERSION == _SVID_) |
502 | exc.retval = zero; |
503 | else |
504 | exc.retval = zero/zero; |
505 | if (_LIB_VERSION == _POSIX_) |
506 | errno = EDOM; |
507 | else if (!matherr(&exc)) { |
508 | if (_LIB_VERSION == _SVID_) { |
509 | (void) WRITE2("sqrt: DOMAIN error\n" , 19); |
510 | } |
511 | errno = EDOM; |
512 | } |
513 | break; |
514 | case 27: |
515 | /* fmod(x,0) */ |
516 | exc.type = DOMAIN; |
517 | exc.name = "fmod" ; |
518 | if (_LIB_VERSION == _SVID_) |
519 | exc.retval = x; |
520 | else |
521 | exc.retval = zero/zero; |
522 | if (_LIB_VERSION == _POSIX_) |
523 | errno = EDOM; |
524 | else if (!matherr(&exc)) { |
525 | if (_LIB_VERSION == _SVID_) { |
526 | (void) WRITE2("fmod: DOMAIN error\n" , 20); |
527 | } |
528 | errno = EDOM; |
529 | } |
530 | break; |
531 | case 28: |
532 | /* remainder(x,0) */ |
533 | exc.type = DOMAIN; |
534 | exc.name = "remainder" ; |
535 | exc.retval = zero/zero; |
536 | if (_LIB_VERSION == _POSIX_) |
537 | errno = EDOM; |
538 | else if (!matherr(&exc)) { |
539 | if (_LIB_VERSION == _SVID_) { |
540 | (void) WRITE2("remainder: DOMAIN error\n" , 24); |
541 | } |
542 | errno = EDOM; |
543 | } |
544 | break; |
545 | case 29: |
546 | /* acosh(x<1) */ |
547 | exc.type = DOMAIN; |
548 | exc.name = "acosh" ; |
549 | exc.retval = zero/zero; |
550 | if (_LIB_VERSION == _POSIX_) |
551 | errno = EDOM; |
552 | else if (!matherr(&exc)) { |
553 | if (_LIB_VERSION == _SVID_) { |
554 | (void) WRITE2("acosh: DOMAIN error\n" , 20); |
555 | } |
556 | errno = EDOM; |
557 | } |
558 | break; |
559 | case 30: |
560 | /* atanh(|x|>1) */ |
561 | exc.type = DOMAIN; |
562 | exc.name = "atanh" ; |
563 | exc.retval = zero/zero; |
564 | if (_LIB_VERSION == _POSIX_) |
565 | errno = EDOM; |
566 | else if (!matherr(&exc)) { |
567 | if (_LIB_VERSION == _SVID_) { |
568 | (void) WRITE2("atanh: DOMAIN error\n" , 20); |
569 | } |
570 | errno = EDOM; |
571 | } |
572 | break; |
573 | case 31: |
574 | /* atanh(|x|=1) */ |
575 | exc.type = SING; |
576 | exc.name = "atanh" ; |
577 | exc.retval = x/zero; /* sign(x)*inf */ |
578 | if (_LIB_VERSION == _POSIX_) |
579 | errno = EDOM; |
580 | else if (!matherr(&exc)) { |
581 | if (_LIB_VERSION == _SVID_) { |
582 | (void) WRITE2("atanh: SING error\n" , 18); |
583 | } |
584 | errno = EDOM; |
585 | } |
586 | break; |
587 | case 32: |
588 | /* scalb overflow; SVID also returns +-HUGE_VAL */ |
589 | exc.type = OVERFLOW; |
590 | exc.name = "scalb" ; |
591 | exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL; |
592 | if (_LIB_VERSION == _POSIX_) |
593 | errno = ERANGE; |
594 | else if (!matherr(&exc)) { |
595 | errno = ERANGE; |
596 | } |
597 | break; |
598 | case 33: |
599 | /* scalb underflow */ |
600 | exc.type = UNDERFLOW; |
601 | exc.name = "scalb" ; |
602 | exc.retval = copysign(zero,x); |
603 | if (_LIB_VERSION == _POSIX_) |
604 | errno = ERANGE; |
605 | else if (!matherr(&exc)) { |
606 | errno = ERANGE; |
607 | } |
608 | break; |
609 | case 34: |
610 | /* j0(|x|>X_TLOSS) */ |
611 | exc.type = TLOSS; |
612 | exc.name = "j0" ; |
613 | exc.retval = zero; |
614 | if (_LIB_VERSION == _POSIX_) |
615 | errno = ERANGE; |
616 | else if (!matherr(&exc)) { |
617 | if (_LIB_VERSION == _SVID_) { |
618 | (void) WRITE2(exc.name, 2); |
619 | (void) WRITE2(": TLOSS error\n" , 14); |
620 | } |
621 | errno = ERANGE; |
622 | } |
623 | break; |
624 | case 35: |
625 | /* y0(x>X_TLOSS) */ |
626 | exc.type = TLOSS; |
627 | exc.name = "y0" ; |
628 | exc.retval = zero; |
629 | if (_LIB_VERSION == _POSIX_) |
630 | errno = ERANGE; |
631 | else if (!matherr(&exc)) { |
632 | if (_LIB_VERSION == _SVID_) { |
633 | (void) WRITE2(exc.name, 2); |
634 | (void) WRITE2(": TLOSS error\n" , 14); |
635 | } |
636 | errno = ERANGE; |
637 | } |
638 | break; |
639 | case 36: |
640 | /* j1(|x|>X_TLOSS) */ |
641 | exc.type = TLOSS; |
642 | exc.name = "j1" ; |
643 | exc.retval = zero; |
644 | if (_LIB_VERSION == _POSIX_) |
645 | errno = ERANGE; |
646 | else if (!matherr(&exc)) { |
647 | if (_LIB_VERSION == _SVID_) { |
648 | (void) WRITE2(exc.name, 2); |
649 | (void) WRITE2(": TLOSS error\n" , 14); |
650 | } |
651 | errno = ERANGE; |
652 | } |
653 | break; |
654 | case 37: |
655 | /* y1(x>X_TLOSS) */ |
656 | exc.type = TLOSS; |
657 | exc.name = "y1" ; |
658 | exc.retval = zero; |
659 | if (_LIB_VERSION == _POSIX_) |
660 | errno = ERANGE; |
661 | else if (!matherr(&exc)) { |
662 | if (_LIB_VERSION == _SVID_) { |
663 | (void) WRITE2(exc.name, 2); |
664 | (void) WRITE2(": TLOSS error\n" , 14); |
665 | } |
666 | errno = ERANGE; |
667 | } |
668 | break; |
669 | case 38: |
670 | /* jn(|x|>X_TLOSS) */ |
671 | exc.type = TLOSS; |
672 | exc.name = "jn" ; |
673 | exc.retval = zero; |
674 | if (_LIB_VERSION == _POSIX_) |
675 | errno = ERANGE; |
676 | else if (!matherr(&exc)) { |
677 | if (_LIB_VERSION == _SVID_) { |
678 | (void) WRITE2(exc.name, 2); |
679 | (void) WRITE2(": TLOSS error\n" , 14); |
680 | } |
681 | errno = ERANGE; |
682 | } |
683 | break; |
684 | case 39: |
685 | /* yn(x>X_TLOSS) */ |
686 | exc.type = TLOSS; |
687 | exc.name = "yn" ; |
688 | exc.retval = zero; |
689 | if (_LIB_VERSION == _POSIX_) |
690 | errno = ERANGE; |
691 | else if (!matherr(&exc)) { |
692 | if (_LIB_VERSION == _SVID_) { |
693 | (void) WRITE2(exc.name, 2); |
694 | (void) WRITE2(": TLOSS error\n" , 14); |
695 | } |
696 | errno = ERANGE; |
697 | } |
698 | break; |
699 | case 40: |
700 | /* gamma(finite) overflow */ |
701 | exc.type = OVERFLOW; |
702 | exc.name = "gamma" ; |
703 | if (_LIB_VERSION == _SVID_) |
704 | exc.retval = HUGE; |
705 | else |
706 | exc.retval = HUGE_VAL; |
707 | if (_LIB_VERSION == _POSIX_) |
708 | errno = ERANGE; |
709 | else if (!matherr(&exc)) { |
710 | errno = ERANGE; |
711 | } |
712 | break; |
713 | case 41: |
714 | /* gamma(-integer) or gamma(0) */ |
715 | exc.type = SING; |
716 | exc.name = "gamma" ; |
717 | if (_LIB_VERSION == _SVID_) |
718 | exc.retval = HUGE; |
719 | else |
720 | exc.retval = HUGE_VAL; |
721 | if (_LIB_VERSION == _POSIX_) |
722 | errno = EDOM; |
723 | else if (!matherr(&exc)) { |
724 | if (_LIB_VERSION == _SVID_) { |
725 | (void) WRITE2("gamma: SING error\n" , 18); |
726 | } |
727 | errno = EDOM; |
728 | } |
729 | break; |
730 | case 42: |
731 | /* pow(NaN,0.0) */ |
732 | /* error only if _LIB_VERSION == _SVID_ & _XOPEN_ */ |
733 | exc.type = DOMAIN; |
734 | exc.name = "pow" ; |
735 | exc.retval = x; |
736 | if (_LIB_VERSION == _IEEE_ || |
737 | _LIB_VERSION == _POSIX_) exc.retval = 1.0; |
738 | else if (!matherr(&exc)) { |
739 | errno = EDOM; |
740 | } |
741 | break; |
742 | } |
743 | return exc.retval; |
744 | } |
745 | |