📄 mapm_sin.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 + -