| Line 1... |
Line 1... |
| 1 |
/*
|
1 |
/*
|
| 2 |
* R : A Computer Language for Statistical Data Analysis
|
2 |
* R : A Computer Language for Statistical Data Analysis
|
| 3 |
* Copyright (C) 1995, 1996, 1997 Robert Gentleman and Ross Ihaka
|
3 |
* Copyright (C) 2000-2019 The R Core Team
|
| 4 |
* Copyright (C) 2000-2016 The R Core Team
|
4 |
* Copyright (C) 2005 The R Foundation
|
| 5 |
* Copyright (C) 2005 The R Foundation
|
5 |
* Copyright (C) 1995-1997 Robert Gentleman and Ross Ihaka
|
| 6 |
*
|
6 |
*
|
| 7 |
* This program is free software; you can redistribute it and/or modify
|
7 |
* This program is free software; you can redistribute it and/or modify
|
| 8 |
* it under the terms of the GNU General Public License as published by
|
8 |
* it under the terms of the GNU General Public License as published by
|
| 9 |
* the Free Software Foundation; either version 2 of the License, or
|
9 |
* the Free Software Foundation; either version 2 of the License, or
|
| 10 |
* (at your option) any later version.
|
10 |
* (at your option) any later version.
|
| Line 21... |
Line 21... |
| 21 |
|
21 |
|
| 22 |
#ifdef HAVE_CONFIG_H
|
22 |
#ifdef HAVE_CONFIG_H
|
| 23 |
#include <config.h>
|
23 |
#include <config.h>
|
| 24 |
#endif
|
24 |
#endif
|
| 25 |
|
25 |
|
| 26 |
/* Note: gcc -peantic may warn in several places about C99 features
|
26 |
/* Note: gcc -pedantic may warn in several places about C99 features
|
| 27 |
as extensions.
|
27 |
as extensions.
|
| 28 |
This was a very-long-standing GCC bug, http://gcc.gnu.org/PR7263
|
28 |
This was a very-long-standing GCC bug, http://gcc.gnu.org/PR7263
|
| 29 |
The system <complex.h> header can work around it: some do.
|
29 |
The system <complex.h> header can work around it: some do.
|
| 30 |
It should have been resolved (after a decade) in 2012.
|
30 |
It should have been resolved (after a decade) in 2012.
|
| 31 |
*/
|
31 |
*/
|
| Line 353... |
Line 353... |
| 353 |
UNPROTECT(2);
|
353 |
UNPROTECT(2);
|
| 354 |
}
|
354 |
}
|
| 355 |
return y;
|
355 |
return y;
|
| 356 |
}
|
356 |
}
|
| 357 |
|
357 |
|
| 358 |
/* used in format.c and printutils.c */
|
358 |
/* Implementing signif(<complex>) *and* used in format.c and printutils.c */
|
| 359 |
#define MAX_DIGITS 22
|
359 |
#define MAX_DIGITS 22
|
| 360 |
void attribute_hidden z_prec_r(Rcomplex *r, const Rcomplex *x, double digits)
|
360 |
void attribute_hidden z_prec_r(Rcomplex *r, const Rcomplex *x, double digits)
|
| 361 |
{
|
361 |
{
|
| 362 |
double m = 0.0, m1, m2;
|
362 |
// Implement r <- signif(x, digits)
|
| 363 |
int dig, mag;
|
- |
|
| 364 |
|
363 |
|
| 365 |
r->r = x->r; r->i = x->i;
|
364 |
r->r = x->r; r->i = x->i;
|
| - |
|
365 |
double m = 0.0,
|
| - |
|
366 |
m1 = fabs(x->r),
|
| 366 |
m1 = fabs(x->r); m2 = fabs(x->i);
|
367 |
m2 = fabs(x->i);
|
| 367 |
if(R_FINITE(m1)) m = m1;
|
368 |
if(R_FINITE(m1)) m = m1;
|
| 368 |
if(R_FINITE(m2) && m2 > m) m = m2;
|
369 |
if(R_FINITE(m2) && m2 > m) m = m2;
|
| 369 |
if (m == 0.0) return;
|
370 |
if (m == 0.0) return;
|
| 370 |
if (!R_FINITE(digits)) {
|
371 |
if (!R_FINITE(digits)) {
|
| 371 |
if(digits > 0) return; else {r->r = r->i = 0.0; return ;}
|
372 |
if(digits > 0) return; else {r->r = r->i = 0.0; return ;}
|
| 372 |
}
|
373 |
}
|
| 373 |
dig = (int)floor(digits+0.5);
|
374 |
int dig = (int)floor(digits+0.5);
|
| 374 |
if (dig > MAX_DIGITS) return; else if (dig < 1) dig = 1;
|
375 |
if (dig > MAX_DIGITS) return; else if (dig < 1) dig = 1;
|
| 375 |
mag = (int)floor(log10(m));
|
376 |
int mag = (int)floor(log10(m));
|
| 376 |
dig = dig - mag - 1;
|
377 |
dig = dig - mag - 1;
|
| 377 |
if (dig > 306) {
|
378 |
if (dig > 306) {
|
| 378 |
double pow10 = 1.0e4;
|
379 |
double pow10 = 1.0e4;
|
| 379 |
digits = (double)(dig - 4);
|
380 |
digits = (double)(dig - 4);
|
| 380 |
r->r = fround(pow10 * x->r, digits)/pow10;
|
381 |
r->r = fround(pow10 * x->r, digits)/pow10;
|
| Line 614... |
Line 615... |
| 614 |
const Rcomplex *px = COMPLEX_RO(x);
|
615 |
const Rcomplex *px = COMPLEX_RO(x);
|
| 615 |
Rcomplex *py = COMPLEX(y);
|
616 |
Rcomplex *py = COMPLEX(y);
|
| 616 |
|
617 |
|
| 617 |
switch (PRIMVAL(op)) {
|
618 |
switch (PRIMVAL(op)) {
|
| 618 |
case 10003: naflag = cmath1(clog, px, py, n); break;
|
619 |
case 10003: naflag = cmath1(clog, px, py, n); break;
|
| - |
|
620 |
// 1: floor
|
| - |
|
621 |
// 2: ceil[ing]
|
| 619 |
case 3: naflag = cmath1(csqrt, px, py, n); break;
|
622 |
case 3: naflag = cmath1(csqrt, px, py, n); break;
|
| - |
|
623 |
// 4: sign
|
| 620 |
case 10: naflag = cmath1(cexp, px, py, n); break;
|
624 |
case 10: naflag = cmath1(cexp, px, py, n); break;
|
| - |
|
625 |
// 11: expm1
|
| - |
|
626 |
// 12: log1p
|
| 621 |
case 20: naflag = cmath1(ccos, px, py, n); break;
|
627 |
case 20: naflag = cmath1(ccos, px, py, n); break;
|
| 622 |
case 21: naflag = cmath1(csin, px, py, n); break;
|
628 |
case 21: naflag = cmath1(csin, px, py, n); break;
|
| 623 |
case 22: naflag = cmath1(z_tan, px, py, n); break;
|
629 |
case 22: naflag = cmath1(z_tan, px, py, n); break;
|
| 624 |
case 23: naflag = cmath1(z_acos, px, py, n); break;
|
630 |
case 23: naflag = cmath1(z_acos, px, py, n); break;
|
| 625 |
case 24: naflag = cmath1(z_asin, px, py, n); break;
|
631 |
case 24: naflag = cmath1(z_asin, px, py, n); break;
|
| 626 |
case 25: naflag = cmath1(z_atan, px, py, n); break;
|
632 |
case 25: naflag = cmath1(z_atan, px, py, n); break;
|
| - |
|
633 |
|
| 627 |
case 30: naflag = cmath1(ccosh, px, py, n); break;
|
634 |
case 30: naflag = cmath1(ccosh, px, py, n); break;
|
| 628 |
case 31: naflag = cmath1(csinh, px, py, n); break;
|
635 |
case 31: naflag = cmath1(csinh, px, py, n); break;
|
| 629 |
case 32: naflag = cmath1(ctanh, px, py, n); break;
|
636 |
case 32: naflag = cmath1(ctanh, px, py, n); break;
|
| 630 |
case 33: naflag = cmath1(z_acosh, px, py, n); break;
|
637 |
case 33: naflag = cmath1(z_acosh, px, py, n); break;
|
| 631 |
case 34: naflag = cmath1(z_asinh, px, py, n); break;
|
638 |
case 34: naflag = cmath1(z_asinh, px, py, n); break;
|