📄 math.c
字号:
/* * ============================================================================= * ALADDIN Version 1.0 : * math.c : Math Functions * * Copyright (C) 1995 by Mark Austin, Xiaoguang Chen, and Wane-Jang Lin * Institute for Systems Research, * University of Maryland, College Park, MD 20742 * * This software is provided "as is" without express or implied warranty. * Permission is granted to use this software for any on any computer system * and to redistribute it freely, subject to the following restrictions: * * 1. The authors are not responsible for the consequences of use of * this software, even if they arise from defects in the software. * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. * 4. This notice is to remain intact. * * Written by: Mark Austin, and Wane-Jang Lin December 1995 * ============================================================================= */#include <stdio.h>#include <math.h>#include <errno.h>#include <stddef.h>#include "units.h"#include "miscellaneous.h"#include "defs.h"/*#define DEBUG*/extern int errno;double errcheck();QUANTITY *QuantityUnitsLess(q)QUANTITY *q;{ if(CheckUnits() == OFF) { printf("***** You should set units on to use this function \n"); printf(" **** Check QDimenLess() in input file \n"); printf(" **** Fail to set units on in QuantityUnitsLess() "); exit(1); } ZeroUnits(q->dimen); return (q);}/* --------------------------------------------------------- *//* Random() : Generate Uniformly Distributed Random Numbers. *//* --------------------------------------------------------- */static int flag = 0;QUANTITY *Random(){static long int seed;long int a = 16807;long int m = 2147483647;long int n = 127773;long int r = 2836;long int tmp_seed;QUANTITY *q; if( flag == 0 ) seed = time(NULL); flag = 1; tmp_seed = a*( seed%n ) - r*( seed/n ); if( tmp_seed >= 0 ) seed = tmp_seed; else seed = tmp_seed + m; q = (QUANTITY *) MyMalloc(sizeof(QUANTITY)); q->value = errcheck( ((double) seed)/m, "random"); if(CheckUnits() == ON) { q->dimen = (DIMENSIONS *) MyMalloc(sizeof(DIMENSIONS)); ZeroUnits(q->dimen); } else q->dimen = (DIMENSIONS *)NULL; return(q);}QUANTITY *Log(q)QUANTITY *q;{ q->value = errcheck(log(q->value), "log"); if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Log10(q)QUANTITY *q;{ q->value = errcheck(log10(q->value), "log10"); if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Exp(q)QUANTITY *q;{ q->value = errcheck(exp(q->value), "exp"); if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Sin(q)QUANTITY *q;{ q->value = errcheck(sin(q->value), "sin"); if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Cos(q)QUANTITY *q;{ q->value = errcheck(cos(q->value), "cos"); if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Tan(q)QUANTITY *q;{ q->value = errcheck(tan(q->value), "tan"); if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Atan(q)QUANTITY *q;{ q->value = errcheck(atan(q->value), "atan"); if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Integer(q)QUANTITY *q;{ q->value = (double) (long) q->value; if(CheckUnits() == ON) ZeroUnits(q->dimen); return(q);}QUANTITY *Fabs(q)QUANTITY *q;{ q->value = fabs(q->value); return(q);}QUANTITY *Sqrt(q)QUANTITY *q;{#ifdef DEBUG printf(" enter Sqrt()\n"); #endif q->value = errcheck(sqrt(q->value), "sqrt"); switch(CheckUnits()) { case ON: UnitsPowerRep( q->dimen, q->dimen, 0.5, YES ); break; case OFF: break; } #ifdef DEBUG printf(" Leaving Sqrt()\n"); #endif return(q);}QUANTITY *Pow(q, value)QUANTITY *q;double value;{#ifdef DEBUG printf(" Enter Pow()\n"); printf("x = %lf \n", q1->value); printf("y = %lf \n", value);#endif if(value > 0) q->value = errcheck(pow(q->value, value), "exponentiation"); else { if(value == 0) q->value = 1.0; else q->value = 1.0/errcheck(pow(q->value, value), "exponentiation"); } switch(CheckUnits()) { case ON: UnitsPowerRep( q->dimen, q->dimen, value, YES ); break; case OFF: break; } #ifdef DEBUG printf(" Leaving Pow()\n"); #endif return(q);}double errcheck(d, s)double d;char *s;{#ifdef DEBUG printf(" enter errcheck() \n"); printf(" d = %lf \n", d);#endif if(errno == EDOM) { errno = 0; EXECUTION_ERROR(s, "argument out of domain"); } else if (errno == ERANGE) { errno = 0; EXECUTION_ERROR(s, "result out of range"); }#ifdef DEBUG printf(" d = %lf \n", d); printf(" leaving errcheck() \n");#endif return d;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -