汇编编程求一弧度的正弦或余弦?

作者&投稿:燕茅 (若有异议请与网页底部的电邮联系)
汇编编程求一角度的正弦或余弦?要能够在msk运行的~

8月9日,是第29届北京奥运会的第一天,也是本届奥运会首块金牌诞生的日子。一早起床,我便打开电视准备收看第29届奥运会女子10米气步枪比赛上的首金争夺赛。比赛开始,我们举国上下都把希望寄托在参加比赛的杜丽姐姐身上。也许是背负着主场的巨大压力的杜丽姐姐十枪中没有一次上过10.5环,有时还打出了8环的成绩,最后还被捷克选手卡特里娜-埃蒙斯以503.5环的成绩打破了奥运会记录获得了冠军。杜丽姐姐只获第五名,没有拿到奖牌。比赛完了,你走出场外哭了,哭得很伤心!当记者采访时,你说:“我真的想让国旗升起来,可是我没有做到。”
当我看见杜丽姐姐伤心的泣不成声时,我也跟着哭起来……这时,爸爸笑着对我说:“傻丫头,你应该安慰安慰杜丽姐姐,虽说拿不到冠军无疑是一个打击,实际上没有一个人会去责怪她.因为射击比赛本来就是一个让人无法预测的比赛,选手的成绩不仅仅是靠实力来决定的,而且还有临场发挥、心理素质、身体状况、外界影响等等多方面的因素。更何况杜丽姐姐8月14日还有机会夺冠呢?我相信6天后她定能成为世界冠军的!”,听了爸爸的话,我半信半疑。
我盼星星,盼月亮,终于等来了8月14日的今天,杜丽姐姐又代表中国队参加女子步枪三姿决赛。我看到的你仍旧那般从容、镇定。在第一轮射出不理想的成绩后,杜丽姐姐能够适时调整自己,在紧张的角逐中能够顶住这份重压,坚强而耐心地一枪一枪追回环数,妈妈说:“也许杜丽过去的失利反而已经让她习惯了一种心情,尤其在这次大赛中,她获得了一份更无价的比赛经验,你瞧,她那平静的脸上,从她后三枪发挥出10.6、10.8、10.7环的好成绩时,我就知道你的信心回来了。”爸爸说:“只要杜丽姐姐在这一刻能够顶住,金牌这一次再也不会飞走了”。当杜丽姐姐最后一枪打出,总环数达到690.3环时,我看见杜丽姐姐笑了,知道她是胜利了,我们全家也笑了……
当我看见您再次站上最高领奖台时,您却哭了,但我知道这泪水是甜甜的。此时,我真想对您说:“杜丽姐,你真棒!你不但战胜自己,也战胜对手。更准确地说,你不是英雄,而是中国人,因为只有中国人才能把挫折的泪水化为感动的笑脸。我要向您学习!”

在初等数学,没有计算三角函数值的方法。
在高等数学,也没有有效的三角函数计算的解析法。
只有数值计算的方法,楼主可参考《计算数学》。
一般来说,只能是记住特殊角的三角函数值,然后再考虑三角函数的周期性。
特殊角之外,只能借助于计算器或是查表。

你好,三角函数运算指令为:

SIN指令
sin double sin(double x); 计算x弧度的正弦值
asin double asin(double x); 计算绝对值不大于1的浮点数的反正弦值
该指令从运算栈中弹出一个操作数,计算它(弧度)的三角正弦值,并将结果压入运算栈。

CON指令
cos double cos(double x); 计算x弧度的余弦值
acos double acos(double x); 计算绝对值不大于1的浮点数的反余弦值
该指令从运算栈中弹出一个操作数,计算它(弧度)的三角余弦值,并将结果压入运算栈。

举例,可以模仿以下例子来计算即可~

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
using namespace std;

const char Tab=0x9;
const int DIGIT=1;

double fun(double x,char op[],int *iop)
{
while(op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号
// 如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>
switch(op[*iop-1])
{
case 7: x=sin(x); (*iop)--;break;
case 8: x=cos(x); (*iop)--;break;
case 9: x=tan(x); (*iop)--;break;
case 10: x=sqrt(x); (*iop)--;break;
case 11: x=asin(x); (*iop)--;break;
case 12: x=acos(x); (*iop)--;break;
case 13: x=atan(x); (*iop)--;break;
case 14: x=log10(x);(*iop)--;break;
case 15: x=log(x); (*iop)--;break;
case 16: x=exp(x); (*iop)--;break;
}
return x;
}

double calc(char *expr,char **addr)
{
static deep; //递归深度
static char *fname[]={ "sin","cos","tan","sqrt",
"arcsin","arccos","arctan","lg","ln","exp",NULL};
double ST[10]={0.0}; //数字栈
char op[10]={'+'}; //运算符栈
char c,*rexp,*pp,*pf;
int ist=1,iop=1,last;
if(!deep)
{
pp=pf=expr;
do
{
c = *pp++;
if(c!=' '&& c!=Tab)
*pf++ = c;
}
while(c!='\0');
}
pp=expr;
if((c=*pp)=='-'||c=='+')
{
op[0] = c;
pp++;
}
last = !DIGIT;
while((c=*pp)!='\0')
{
if(c=='(')//左圆括弧
{
deep++;
ST[ist++]=calc(++pp,addr);
deep--;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp = *addr;
last = DIGIT;
if(*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2))
{ ////目的是:当右圆括弧的
op[iop++]='*'; ////右恻为左圆括弧或函数
last = !DIGIT; ////名字时,默认其为乘法
c = op[--iop]; /////////////////////////////
goto operate ; /////////////////////////////
}
}
else if(c==')')//右圆括弧
{
pp++;
break;
}
else if(isalpha(c))
{
if(!strnicmp(pp,"Pi",2))
{
if(last==DIGIT){cout<< "π左侧遇)" <<endl;exit(1);}
ST[ist++]=3.14159265358979323846;
ST[ist-1]=fun(ST[ist-1],op,&iop);
pp += 2;
last = DIGIT;
if(!strnicmp(pp,"Pi",2)){cout<< "两个π相连" <<endl;exit(2);}
if(*pp=='('){cout<< "π右侧遇(" <<endl;exit(3);}
}
else
{
for(int i=0; (pf=fname[i])!=NULL; i++)
if(!strnicmp(pp,pf,strlen(pf)))break;
if(pf!=NULL)
{
op[iop++] = 07+i;
pp += strlen(pf);
}
else {cout<< "陌生函数名" <<endl;exit(4);}
}
}
else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='^')
{
char cc;
if(last != DIGIT){cout<< "运算符粘连" <<endl;exit(5);}
pp++;
if(c=='+'||c=='-')
{
do
{
cc = op[--iop];
--ist;
switch(cc)
{
case '+': ST[ist-1] += ST[ist];break;
case '-': ST[ist-1] -= ST[ist];break;
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
while(iop);
op[iop++] = c;
}
else if(c=='*'||c=='/')
{
operate: cc = op[iop-1];
if(cc=='+'||cc=='-')
{
op[iop++] = c;
}
else
{
--ist;
op[iop-1] = c;
switch(cc)
{
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
}
else
{
cc = op[iop-1];
if(cc=='^'){cout<< "乘幂符连用" <<endl;exit(6);}
op[iop++] = c;
}
last = !DIGIT;
}
else
{
if(last == DIGIT){cout<< "两数字粘连" <<endl;exit(7);}
ST[ist++]=strtod(pp,&rexp);
ST[ist-1]=fun(ST[ist-1],op,&iop);
if(pp == rexp){cout<< "非法字符" <<endl;exit(8);}
pp = rexp;
last = DIGIT;
if(*pp == '('||isalpha(*pp))
{
op[iop++]='*';
last = !DIGIT;
c = op[--iop]; /////////////////////////////
goto operate ; /////////////////////////////
}
}
}
*addr=pp;
if(iop>=ist){cout<< "表达式有误" <<endl;exit(9);}
while(iop)
{
--ist;
switch(op[--iop])
{
case '+': ST[ist-1] += ST[ist];break;
case '-': ST[ist-1] -= ST[ist];break;
case '*': ST[ist-1] *= ST[ist];break;
case '/': ST[ist-1] /= ST[ist];break;
case '^': ST[ist-1] = pow(ST[ist-1],ST[ist]);break;
}
}
return ST[0];
}

int main()
{
char s[128],*end;
system("chcp 936"); //中文代码页
while(1)
{
cout << "请输入表达式:";
cin.getline(s,128);
cout << setprecision(17) << calc(s,&end) << endl;
}
return 0;
}

首先,只考虑x在[0,Pi/2]的范围,其他范围很用以用这个范围的替换.
然后用sin(x)的泰勒展开式,取前几项就可以了.
12位是10进制位还是2进制位
(Pi/2)^17/17!=6*10^(-12),
(Pi/2)^19/19!=4.4*10^(-14)
所以计算到第17次方这一项足够了.
这样
sin(x)=x-x^3/3!+x^5/5!-....+x^17/17!
总共9项,每项需要一次浮点乘法,一次定点乘法(还可以预先计算),一次浮点除法.
sum=cur=x;
sqrx=x*x;
cur*=sqrx;
cur/=(2*3);
sum-=cur;
cur*=sqrx;
cur/=(4*5);
sum+=cur;
...
cur*=sqrx;
cur/=(16*17);
sum+=cur;

您好,如果对时间密集度要求比较高,即会频繁使用sin,cos函数,不肯花费大量指令,建议采用查表法:

建议起一个已知数据的映射关系(最简单的,数组就可以了),直接查表,精度差一点也没关系。只需要建立从0~45度的表就可以了知道全部了,利用三角函数代换可以知道余弦和其他任何角度的正弦。

//
如果对指令的时间要求比较宽松,但对数据精度要求很高,建议使用“dmal - 高级经理 七级 ”的taylor展开法。这样虽然麻烦,但可以达到你所需要的精度。

cos double cos(double x); 计算x弧度的余弦值
acos double acos(double x); 计算绝对值不大于1的浮点数的反余弦值
该指令从运算栈中弹出一个操作数,计算它(弧度)的三角余弦值,并将结果压入运算栈。

java.lang.math.sin(double a);
java.lang.math.cos(double a);
java.lang.math.tan(double a);

a 为弧度,角度自己转一下就好了。


汇编编程求一弧度的正弦或余弦?
sin double sin(double x); 计算x弧度的正弦值 asin double asin(double x); 计算绝对值不大于1的浮点数的反正弦值 该指令从运算栈中弹出一个操作数,计算它(弧度)的三角正弦值,并将结果压入运算栈。CON指令 cos double cos(double x); 计算x弧度的余弦值 acos double acos(double x); 计...

c++编程求一弧度的正弦近似值直到最后一项绝对值小于10的-5次方
include <stdio.h> int main () {double sx,x,a,b;int n,f=1;printf ("Please input x:");scanf ("%lf",&x);sx=a=x;b=1;for (n=1;n<=20;++n){a*=x*x;b*=2*n*(2*n+1);f=-f;sx+=a\/b*f;}printf ("sin(%lg)=%.5lf\\n",x,sx);return 0;} ...

c语言编程 输入弧度(正数)求正弦值、余弦值。
这个程序是比较简单的。只要包含头文件math.h,然后定义double型的变量x。再以%lf格式读入x,最后输出%lf的sin(x)和cos(x)就可以了。

编程求30°的弧度值
float a = pi * 30 \/ 180;公式就是这样,看你要用什么语言,可以使用语言提供的常数。

怎么用c语言编程求任意角的弧度值
\/\/希望我的回答对你的学习有帮助#include <stdio.h>#include <stdlib.h>#define PI 3.14159int main(){double degree;printf("输入一个角度:\\n");while(~scanf("%lf",°ree)){printf("弧度值为%lg\\n",degree*PI\/180); printf("继续输入角度,q退出\\n"); }system("pause");return...

C语言把弧度转换为角度精确到秒
角度转弧度 π\/180×角度 弧度变角度 180\/π×弧度 第一步180\/π*0.7831=44.83257然后44.83257-int 44.83257再然后再重复就出现了分,再重复就出现秒了。这事我用vb的一种思维方式,你也可以这样用c写吧。

如何求任意角对应的正切值呢?
首先,可以通过 arctan 函数求出一个数的反正切值,从而求出该数对应的角度。具体地,假设有一个数x,可通过 arctan 函数求出它的反正切函数值y=arctan(x),则y就代表了x对应的角度,通常以弧度制为单位。例如,arctan(1) 的值为 π\/4 弧度,即45度。进一步地,我们也可以使用计算器或编程...

编程:Visual Basic编一个弧度值转换为角度值的程序?
x = Val(Text1) \/ 3.1415926 * 180 '把弧度文本转换为实数几度 X1 = Int(x) '取出度数的整数部分 x = (x - X1) * 60 '度数的小数部分转换为分数 X2 = Int(x) '取出分数的整数部分 x = Round((x - X2) * 60000) \/ 1000 '分数的小数部分转换为秒数,并四舍五入到...

用C语言编程求60度的弧度
include int main(){ float a,b;printf("请输入角度数:");scanf("%f",&a);b=a\/3.1415926;printf("换算成弧度为:%f\\n",b);return 0;} 你输入60和回车就行。

求一个弧度的值,数学 物理问题!
回答:大哥,这种图要求弧线长度必须知道解析式,然后对弧长进行积分。否则很难,如果你非要求则有以下几种方法: 1.去做个模型,用尺子量 2.在excel中,拟合出弧线的大致方程,用积分求出

泌阳县15985625307: 输入一弧度值x,输出正弦sin(x),余弦cos(x),用c++编译 -
邰飞藿香: #include#include using namespace std; void main() { double x; cin >> x; cout << "cos(x)=" << cos(x) << endl << "sin(x)=" << sin(x) << endl; }

泌阳县15985625307: c语言求正弦与余弦.代码如下 -
邰飞藿香: 测试结果: 30 0.500000 0.866026 参数改成弧度 就是 角度乘以 π/180 #include "stdio.h" #include "conio.h" #include "math.h"main() {float x;float y;scanf("%f",&x);printf("%f\n",y=sin(x*3.14159/180));printf("%f\n",y=cos(x*3.14159/180)); getch(); }楼主好运

泌阳县15985625307: 编写一个程序,计算用户输入的一个角度的正弦值和余弦值 -
邰飞藿香: 这个 在EXCEL有现成的 公式..正弦的SIN,余弦的事COS 例: 求45度的正弦值 在单元格里输入=SIN(45) 回车就OK了 .

泌阳县15985625307: 如何用C语言实现正弦或余弦函数 -
邰飞藿香: 如果只是需要值,那么调用math中的sin和cos函数即可. 参数为弧度, 如果要使用的参数是角度,需要自行转换一下. 如果想自己写,可以参考泰勒展开, 计算近似值.一般计算到最后一项小于1e-6即可.

泌阳县15985625307: 编写程序,从0度到180度每隔5度输出该角度的正弦和余弦函数值 -
邰飞藿香: cosx = 1 - (χ^ 2)/ 2 +(χ^ 4)/ 24 + ... +(-1)^ n的*χ^2π/(2n)的! 注意:其中x是弧度而不是角度 这是余弦函数的麦克劳林级数的,非常精确,足够远,那么我们就必须增加N比数计算,以提高精度接近x = 0 例如,计算只有3 1 - (χ^ 2)/ 2 +(χ^ 4)/ 24,当x...

泌阳县15985625307: 如何用C语言中专门的数学算法实现正弦,余弦函数的计算 -
邰飞藿香: 头文件包含.math.h cos :余弦函数 函数原型:double cos(double x);头文件:#include<math.h>是否是标准函数:是函数功能:求x的余弦值,这里,x为弧度.返回值:计算结果的双精度值.例程如下: 求cosx.#include <stdio.h>#...

泌阳县15985625307: 求三角函数的C语言算法! -
邰飞藿香: 从键盘输入一个角度值,求出该角度的正弦值、余弦值和正切值.#include<iostream>#include<cmath> using namespace std; const double pi(3.14159265); void main() { double a,b; cin>>a; b=a*pi/180; cout<<"sin("<<a<<")="<<sin(b)<<endl; ...

泌阳县15985625307: 单片机编程:汇编语言编写一个查表子程序,气功能为利用DPTR及PC做基址,查表求出0 - 90度间隔5度的正弦值. -
邰飞藿香: mov a @a+dptr mov a @a +pc tab db ** ** ** ***其他的lz自己来了

泌阳县15985625307: 求弧度计算方法.编程方面 -
邰飞藿香: cos double cos(double x); 计算x弧度的余弦值 acos double acos(double x); 计算绝对值不大于1的浮点数的反余弦值 其他的类推

泌阳县15985625307: 请教各位如何在单片机内计算正弦反正弦余弦程序 -
邰飞藿香: 用库函数,头文件是math.h,里面有sin,cos等函数.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网