⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapm_sin.c

📁 任意精度的数学库
💻 C
字号:
/*  *  M_APM  -  mapm_sin.c * *  Copyright (C) 1999   Michael C. Ring * *  Permission to use, copy, and distribute this software and its *  documentation for any purpose with or without fee is hereby granted,  *  provided that the above copyright notice appear in all copies and  *  that both that copyright notice and this permission notice appear  *  in supporting documentation. * *  Permission to modify the software is granted, but not the right to *  distribute the modified code.  Modifications are to be distributed  *  as patches to released version. *   *  This software is provided "as is" without express or implied warranty. *//* *      $Id: mapm_sin.c,v 1.8 1999/09/21 21:03:06 mike Exp $ * *      This file contains the top level (user callable) SIN / COS / TAN *	functions. * *      $Log: mapm_sin.c,v $ *      Revision 1.8  1999/09/21 21:03:06  mike *      make sure the sign of 'sin' from M_cos_to_sin is non-zero *      before assigning it from the original angle. * *      Revision 1.7  1999/09/18 03:27:27  mike *      added m_apm_sin_cos * *      Revision 1.6  1999/07/09 22:50:33  mike *      skip limit to PI when not needed * *      Revision 1.5  1999/06/20 23:42:29  mike *      use new function for COS function * *      Revision 1.4  1999/06/20 19:27:12  mike *      changed local static variables to MAPM stack variables * *      Revision 1.3  1999/05/17 03:54:56  mike *      init globals in TAN function also * *      Revision 1.2  1999/05/15 02:18:31  mike *      add check for number of decimal places * *      Revision 1.1  1999/05/10 20:56:31  mike *      Initial revision */#include "m_apm_lc.h"/****************************************************************************/void	m_apm_sin(r,places,a)M_APM	r, a;int	places;{M_APM	tmp3;tmp3 = M_get_stack_var();M_limit_angle_to_pi(tmp3, (places + 6), a);M_5x_sin(r, places, tmp3);M_restore_stack(1);}/****************************************************************************/void	m_apm_cos(r,places,a)M_APM	r, a;int	places;{M_APM	tmp3;tmp3 = M_get_stack_var();M_limit_angle_to_pi(tmp3, (places + 6), a);M_4x_cos(r, places, tmp3);M_restore_stack(1);}/****************************************************************************/void	m_apm_sin_cos(sinv,cosv,places,aa)M_APM	sinv, cosv, aa;int	places;{M_APM	tmp5, tmp6, tmp7;tmp5 = M_get_stack_var();tmp6 = M_get_stack_var();tmp7 = M_get_stack_var();M_limit_angle_to_pi(tmp5, (places + 6), aa);MM_skip_limit_PI_check = TRUE;m_apm_cos(tmp7, (places + 4), tmp5);MM_skip_limit_PI_check = FALSE;/* *   compute sin(x) = sqrt(1 - cos(x) ^ 2). * *   note that the sign of 'sin' will always be positive after the *   sqrt call. we need to adjust the sign based on what quadrant *   the original angle is in. */M_cos_to_sin(tmp6, (places + 4), tmp7);if (tmp6->m_apm_sign != 0)  tmp6->m_apm_sign = tmp5->m_apm_sign; m_apm_round(sinv, places, tmp6);m_apm_round(cosv, places, tmp7);M_restore_stack(3);}/****************************************************************************/void	m_apm_tan(r,places,a)M_APM	r, a;int	places;{M_APM	tmp5, tmp6, tmp7;tmp5 = M_get_stack_var();tmp6 = M_get_stack_var();tmp7 = M_get_stack_var();M_limit_angle_to_pi(tmp5, (places + 6), a);MM_skip_limit_PI_check = TRUE;m_apm_cos(tmp7, (places + 4), tmp5);MM_skip_limit_PI_check = FALSE;/* *   compute sin(x) = sqrt(1 - cos(x) ^ 2). * *   note that the sign of 'sin' will always be positive after the *   sqrt call. we need to adjust the sign based on what quadrant *   the original angle is in. */M_cos_to_sin(tmp6, (places + 4), tmp7);if (tmp6->m_apm_sign != 0)  tmp6->m_apm_sign = tmp5->m_apm_sign; /* tan(x) = sin(x) / cos(x) */m_apm_divide(tmp5, (places + 4), tmp6, tmp7);m_apm_round(r, places, tmp5);M_restore_stack(3);}/****************************************************************************/void	M_limit_angle_to_pi(rr, places, aa)M_APM	rr, aa;int	places;{M_APM	tmp7, tmp8, tmp9;if (MM_skip_limit_PI_check)  {   m_apm_copy(rr, aa);   return;  }tmp9 = M_get_stack_var();m_apm_copy(tmp9, MM_PI);if (m_apm_compare(aa, tmp9) == 1)       /*  > PI  */  {   tmp7 = M_get_stack_var();   tmp8 = M_get_stack_var();   M_check_dec_places(M_LIMIT, places);   m_apm_add(tmp7, aa, tmp9);   m_apm_integer_divide(tmp9, tmp7, MM_2_PI);   m_apm_multiply(tmp8, tmp9, MM_2_PI);   m_apm_subtract(tmp9, aa, tmp8);   m_apm_round(rr, places, tmp9);   M_restore_stack(3);   return;  }tmp9->m_apm_sign = -1;if (m_apm_compare(aa, tmp9) == -1)       /*  < -PI  */  {   tmp7 = M_get_stack_var();   tmp8 = M_get_stack_var();   M_check_dec_places(M_LIMIT, places);   m_apm_add(tmp7, aa, tmp9);   m_apm_integer_divide(tmp9, tmp7, MM_2_PI);   m_apm_multiply(tmp8, tmp9, MM_2_PI);   m_apm_subtract(tmp9, aa, tmp8);   m_apm_round(rr, places, tmp9);   M_restore_stack(3);   return;  }m_apm_copy(rr, aa);M_restore_stack(1);}/****************************************************************************//* *   compute  r = sqrt(1 - a ^ 2). */void	M_cos_to_sin(r,places,a)M_APM	r, a;int	places;{M_APM	tmp1, tmp2;tmp1 = M_get_stack_var();tmp2 = M_get_stack_var();m_apm_multiply(tmp1, a, a);m_apm_subtract(tmp2, MM_One, tmp1);m_apm_sqrt(r, places, tmp2);M_restore_stack(2);}/****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -