.支持库 spec.子程序 _按钮1_被单击调试输出 (求反正弦 (0.5))
.子程序 求反正弦, 小数型
.参数 正弦值, 小数型
.局部变量 正切值, 小数型' tanθ=sinθ/cosθ
' tanθ=sinθ/根号(1-sinθ^2)
正切值 = 正弦值 ÷ 求平方根 (1 - 求次方 (正弦值, 2))
' 角度=弧度*180/π
返回 (求反正切 (正切值) × 180 ÷ #pi)
计算反正切函数(使用欧拉变换公式,精度很高),反正切函数的级数展开公式:f(x) = x - x^3/3 + x^5/5 +...+ (-1)^k * x^(2k+1)/(2k + 1)+...
当|x| > 1时,级数绝对值发散,无法直接使用欧拉公式计算。因此可以通过下面的公式
进行等价转换之后再进行计算。
等价转换公式:
a) ATan(1/x) = Pi/2 - ATan(x)
b) ATan(-x) = - ATan(x)
特殊情况
0 = ArcTan(0)
Pi/2 = ArcTan(无穷大)
//
// 欧拉公式
//
// sum是和,term是通项值,jterm初始为1,以后按1递增。wrksp是工作单元,视jterm的
// 最大值而定。
//
void eulsum(int& nterm,double *sum,double term,int jterm,double wrksp[])
{
double tmp,dum
if(jterm == 1)
{
nterm = 1
wrksp[1] = term
*sum = 0.5 * term
}
else
{
tmp = wrksp[1]
wrksp[1] = term
for(int j=1 j <= nterm j++)
{
dum = wrksp[j+1]
wrksp[j+1] = 0.5 * (wrksp[j] + tmp)
tmp = dum
}
if(fabs(wrksp[nterm + 1]) <= fabs(wrksp[nterm]))
{
*sum = *sum + 0.5 * wrksp[nterm + 1]
nterm = nterm + 1
}
else
{
*sum = *sum + wrksp[nterm + 1]
}
}
}
级数计算就不用我给代码了吧。
子程序:arcsine返回值类型:双精度小数型
参数:num 数据类型:双精度小数型
如果 (num > -1 且 num < 1)
返回 (求反正切 (num ÷ 求平方根 (1 - 求次方 (num, 2))))
否则
如果 (num = 1 或 num = -1)
判断 (num = 1)
返回 (#pi ÷ 2)
判断 (num = -1)
返回 (-(#pi ÷ 2))
默认
判断结束
否则
设置错误 (真)
返回 (0)
如果结束
如果结束
------------------------------
子程序:arccosine
返回值类型:双精度小数型
参数:num 数据类型:双精度小数型
如果 (num ≥ -1 且 num ≤ 1)
如果 (num = 0)
返回 (#pi ÷ 2)
否则
返回 (求反正切 (求平方根 (1 - 求次方 (num, 2)) ÷ num))
如果结束
否则
设置错误 (真)
返回 (0)
如果结束
------------------------------
子程序:arctangent
返回值类型:双精度小数型
参数:num 数据类型:双精度小数型
返回 (求反正切 (num))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)