📄 ptfuncs.c
字号:
/**********Copyright 1990 Regents of the University of California. All rights reserved.Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group **********//* * All the functions used in the parse tree. These functions return HUGE * if their argument is out of range. */#include <config.h>#include "ngspice.h"#include <stdio.h>#include "fteext.h"#include "ifsim.h"#include "inpptree.h"#include "inp.h"/* XXX These should be in math.h */#ifndef HAVE_ATANHextern double asinh(), acosh(), atanh();#endif double PTfudge_factor;#define MODULUS(NUM,LIMIT) ((NUM) - ((int) ((NUM) / (LIMIT))) * (LIMIT))doublePTabs(double arg){ return arg >= 0.0 ? arg : -arg;}doublePTsgn(double arg){ return arg > 0.0 ? 1.0 : arg < 0.0 ? -1.0 : 0.0;}doublePTplus(double arg1, double arg2){ return (arg1 + arg2);}doublePTminus(double arg1, double arg2){ return (arg1 - arg2);}doublePTtimes(double arg1, double arg2){ return (arg1 * arg2);}double PTdivide(double arg1, double arg2){ if (arg2 >= 0.0) arg2 += PTfudge_factor; else arg2 -= PTfudge_factor; if (arg2 == 0.0) return (HUGE); return (arg1 / arg2);}doublePTpower(double arg1, double arg2){ if (arg1 < 0.0) { if (fabs(arg2 - ((int) arg2)) / (arg2 + 0.001) < 0.000001) { arg2 = (int) arg2; } else { arg1 = -arg1; } } return (pow(arg1, arg2));}doublePTacos(double arg){ return (acos(arg));}doublePTacosh(double arg){#ifdef HAVE_ACOSH return (acosh(arg));#else if (arg < 1.0) arg = 1.0; return (log(arg + sqrt(arg*arg-1.0)));#endif }doublePTasin(double arg){ return (asin(arg));}doublePTasinh(double arg){#ifdef HAVE_ASINH return (asinh(arg));#else return log(arg + sqrt(arg * arg + 1.0));#endif }doublePTatan(double arg){ return (atan(arg));}doublePTatanh(double arg){#ifdef HAVE_ATANH return (atanh(arg));#else if (arg < -1.0) arg = -1.0 + PTfudge_factor + 1e-10; else if (arg > 1.0) arg = 1.0 - PTfudge_factor - 1e-10; return (log((1.0 + arg) / (1.0 - arg)) / 2.0);#endif }doublePTustep(double arg){ if (arg < 0.0) return 0.0; else if (arg > 0.0) return 1.0; else return 0.5; /* Ick! */}/* MW. PTcif is like "C" if - 0 for (arg<=0), 1 elsewhere */doublePTustep2(double arg){ if (arg <= 0.0) return 0.0; else if (arg <= 1.0) return arg; else //if (arg > 1.0) return 1.0;}doublePTuramp(double arg){ if (arg < 0.0) return 0.0; else return arg;}doublePTcos(double arg){ return (cos(MODULUS(arg, 2 * M_PI)));}doublePTcosh(double arg){ return (cosh(arg));}doublePTexp(double arg){ return (exp(arg));}doublePTln(double arg){ if (arg < 0.0) return (HUGE); return (log(arg));}doublePTlog(double arg){ if (arg <= 0.0) return (HUGE); return (log10(arg));}doublePTsin(double arg){ return (sin(MODULUS(arg, 2 * M_PI)));}doublePTsinh(double arg){ return (sinh(arg));}doublePTsqrt(double arg){ if (arg < 0.0) return (HUGE); return (sqrt(arg));}doublePTtan(double arg){ return (tan(MODULUS(arg, M_PI)));}doublePTtanh(double arg){ return (tanh(arg));}doublePTuminus(double arg){ return (- arg);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -