performance improved about power.
[scilab.git] / scilab / modules / elementary_functions / includes / elem_common.h
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
4 *
5 *  This file must be used under the terms of the CeCILL.
6 *  This source file is licensed as described in the file COPYING, which
7 *  you should have received as part of this distribution.  The terms
8 *  are also available at
9 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12
13 #ifndef __COMMON_H__
14 #define __COMMON_H__
15
16 #include "core_math.h"
17
18 #include "abs.h"
19 #include "cos.h"
20 #include "exp.h"
21 #include "log.h"
22 #include "pythag.h"
23 #include "sin.h"
24 #include "tan.h"
25 #include "sqrt.h"
26 #include "sign.h"
27
28 /*
29 'E' or 'e',   DLAMCH := eps ( relative machine precision )
30 'S' or 's ,   DLAMCH := sfmin ( safe minimum, such that 1/sfmin does not overflow )
31 'B' or 'b',   DLAMCH := base ( base of the machine )
32 'P' or 'p',   DLAMCH := eps*base ( eps*base )
33 'N' or 'n',   DLAMCH := t ( number of (base) digits in the mantissa )
34 'R' or 'r',   DLAMCH := rnd ( 1.0 when rounding occurs in addition, 0.0 otherwis )
35 'M' or 'm',   DLAMCH := emin ( minimum exponent before (gradual) underflow )
36 'U' or 'u',   DLAMCH := rmin ( underflow threshold - base**(emin-1) )
37 'L' or 'l',   DLAMCH := emax ( largest exponent before overflow )
38 'O' or 'o',   DLAMCH := rmax ( overflow threshold  - (base**emax)*(1-eps) )
39 */
40
41 #include <stdlib.h>
42 #include "machine.h"
43
44 #include "doublecomplex.h"
45 #include "numericconstants_interface.h"
46
47 #ifdef __cplusplus
48 #define isRealZero(x)                                           (fabs(static_cast<double>(x)) <= nc_eps())
49 #define ZeroIsZero(x)                                           (fabs(static_cast<double>(x)) <= nc_eps() ? 0 : static_cast<double>(x))
50 #else
51 #define isZero(x)                                                       (fabs((double)x) <= nc_eps())
52 #define ZeroIsZero(x)                                           (fabs((double)x) <= nc_eps() ? 0 : (double)x)
53 #endif
54
55 #define getUnderflowThreshold()                         nc_double_min()
56 #define getOverflowThreshold()                          nc_double_max()
57 #define isEqual(x,y)                                            fabs((double)x - (double)y) <= nc_eps()
58
59 extern double C2F(dlamch) (const char *_pszCommand, unsigned long int);
60 extern double C2F(logp1) (double *_pdblVal);
61 extern int C2F(dgemm) (char *_pstTransA, char *_pstTransB, int *_piN, int *_piM, int *_piK, double *_pdblAlpha, double *_pdblA, int *_piLdA,
62                        double *_pdblB, int *_piLdB, double *_pdblBeta, double *_pdblC, int *_piLdC);
63 extern int C2F(zgemm) (char *_pstTransA, char *_pstTransB, int *_piN, int *_piM, int *_piK, double *_pdblAlpha, double *_pdblA, int *_piLdA,
64                        double *_pdblB, int *_piLdB, double *_pdblBeta, double *_pdblC, int *_piLdC);
65 extern int C2F(dswap) (int *_piSize, double *_pdblX, int *_piIncX, double *_pdblY, int *_piIncY);
66 extern double C2F(dasum) (int *_iSize, double *_pdbl, int *_iInc);
67 extern int C2F(dcopy) (int *_iSize, double *_pdblSrc, int *_piIncSrc, double *_pdblDest, int *_piDest);
68 extern int C2F(dscal) (int *_iSize, double *_pdblVal, double *_pdblDest, int *_iInc);
69 extern int C2F(zscal) (int *_iSize, doublecomplex * _pdblVal, doublecomplex * _pdblDest, int *_iInc);
70 extern int C2F(dset) (int *_iSize, double *_pdblVal, double *_pdblDest, int *_iInc);
71 extern double C2F(dlange) (char *_pstNorm, int *_piM, int *_piN, double *_pdblA, int *_piLdA, double *_pdblWork);
72 extern int C2F(dlacpy) (char *_pstUplo, int *piM, int *_piN, double *_pdblA, int *_piLdA, double *_pdblB, int *_piLdB);
73 extern int C2F(dgecon) (char *_pstNORM, int *_piN, double *_pdblA, int *_piLDA, double *_pdblANORM, double *_pdblRCOND, double *_pdblWORK,
74                         int *_piIWORK, int *_piINFO);
75 extern int C2F(dgelsy1) (int *_piM, int *_piN, int *_piNRHS, double *_pdblA, int *_piLDA, double *_pdblB, int *_piLDB, int *_piJPVT,
76                          double *_pdblRCOND, int *_piRANK, double *_pdblWORK, int *_piLWORK, int *_piINFO);
77 extern double C2F(zlange) (char *_pstNORM, int *_piM, int *_piN, double *_pdblA, int *_piLDA, double *_pdblWORK);
78 extern int C2F(zlacpy) (char *_pstUPLO, int *_piM, int *_piN, double *_pdblA, int *_piLDA, double *_pdblB, int *_piLDB);
79 extern void C2F(zgecon) (char *_pstNORM, int *_piN, doublecomplex * _pdblA, int *_piLDA, double *_pdblANORM, double *_pdblRNORM,
80                          doublecomplex * _pdblWORK, double *_pdblRWORD, int *_piINFO);
81 extern int C2F(zgelsy1) (int *_piM, int *_piN, int *_piNRHS, doublecomplex * pdblA, int *_piLDA, doublecomplex * _pdblB, int *_piLDB, int *_piJPVT,
82                          double *_pdblRCOND, int *_piRANK, doublecomplex * _pdblWORK, int *_piLWORK, double *_pdblRWORK, int *_piINFO);
83 extern double C2F(ddot) (int *_ipSize, double *_pdblVal1, int *_piInc1, double *_pdblVal2, int *_piInc2);
84 extern void C2F(wmul) (double *ar, double *ai, double *br, double *bi, double *cr, double *ci);
85 extern void C2F(wdiv) (double *ar, double *ai, double *br, double *bi, double *cr, double *ci);
86 extern void C2F(dad) (double *a, int *na, int *i1, int *i2, int *j1, int *j2, double *r, int *isw);
87 extern int C2F(entier) (int *_iSize, double *_pdbl, int *_pi);
88 extern int C2F(simple) (int *_iSize, double *_pdbl, float *_pf);
89 extern double C2F(nearfloat) (double*, double*);
90 extern int C2F(daxpy)(int* N, double* DA, double* DX, int* INCX, double* DY, int* INCY);
91 extern int C2F(zaxpy)(int* N, doublecomplex* ZA, doublecomplex* ZX, int* INCX, doublecomplex* ZY, int* INCY);
92 extern int C2F(dsymv)(char* UPLO, int* N, double* ALPHA, double* A, int* LDA, double* X, int* INCX, double* BETA, double* Y, int* INCY);
93
94 // dgemv performs matrix-vector operations
95 extern int C2F(dgemv) (char* trans, int* m, int* n, double* alpha, double* A, int* lda,
96                        double* x, int* incx, double* beta, double* y, int* incy);
97 extern int C2F(zgemv) (char* trans, int* m, int* n, doublecomplex* alpha, doublecomplex* A,
98                        int* lda, doublecomplex* x, int* incx, doublecomplex* beta, doublecomplex* y, int* incy);
99
100 // dgetrf computes an LU factorization of a general M by N matrix A (double) using partial pivoting with row interchanges
101 extern int C2F(dgetrf)(int* m, int* n, double* A, int* lda, int* ipiv, int* info);
102
103 // dgetrs solves a linear system using the factors computed by dgetrf
104 extern int C2F(dgetrs) (char* trans, int* n, int* nrhs, double* A, int *lda, int* ipiv, double* B, int* ldb, int* info);
105
106 // dpotrf computes the cholesky factorization of a real symmetric positive definite matrix A
107 extern int C2F(dpotrf)(char* uplo, int* n, double* A, int* lda, int* info);
108
109 // zpotrf computes the cholesky factorization of a real hermitian positive definite matrix A
110 extern int C2F(zpotrf)(char* uplo, int* n, doublecomplex* A, int* lda, int* info);
111
112 // dtrsm solves a triangular linear system
113 extern int C2F(dtrsm) (char* side, char* uplo, char* trans, char* diag, int* m, int* n, double* alpha, double* A, int* lda, double* B, int* ldb);
114 // ztrsm solve a triangular linear system
115 extern int C2F(ztrsm) (char* side, char* uplo, char* trans, char* diag, int* m, int* n, doublecomplex* alpha, doublecomplex* A, int* lda, doublecomplex* B, int* ldb);
116 // dsyrk does a rank k symmetric update
117 extern int C2F(dsyrk) (char* uplo, char* trans, int* n, int* k, double* alpha,
118                        double* A, int* lda, double* beta, double* B, int* ldb);
119 // ztrmm multiply by a triangular matrix
120 extern int C2F(ztrmm) (char* side, char* uplo, char* trans, char* diag, int* m, int* n, doublecomplex* alphac,
121                        doublecomplex* A, int* lda, doublecomplex* B, int* ldb);
122 // ztrmv multiply a vector by a triangular matrix
123 extern int C2F(ztrmv) (char* uplo, char* trans, char* diag, int* n, doublecomplex* A, int* lda, doublecomplex* x, int* incx);
124 // dtrmv multiply a vector by a triangular matrix
125 extern int C2F(dtrmv) (char* uplo, char* trans, char* diag, int* n, double* A, int* lda, double* x, int* incx);
126 // zgetrs solves a linear system using the factors computed by zgetrf
127 extern int C2F(zgetrs) (char *_pstTRANS, int *_piN, int *_piNRHS, doublecomplex *_pdblA, int *_piLDA, int *_piIPIV, doublecomplex *_pdblB, int *_piLDB,
128                         int *_piINFO);
129 // zgetrf computes an LU factorization of a general M by N matrix A (complex*16) using partial pivoting with row interchanges
130 extern int C2F(zgetrf) (int *_piM, int *_piN, doublecomplex *_pdblA, int *_piLDA, int *_piIPIV, int *_piINFO);
131
132 #endif /* __COMMON_H__ */