听说因特尔的CPU好像支持三角函数的硬件指令,好像是FSIN.
我不是学汇编的(学C++的),sin的软件算法比较慢,我想内联汇编,请教一下具体代码是怎样,谢谢?
FSIN怎么用?
答案:3 悬赏:0 手机版
解决时间 2021-01-02 15:52
- 提问者网友:焚苦与心
- 2021-01-01 20:59
最佳答案
- 五星知识达人网友:一袍清酒付
- 2021-01-22 05:38
C++的sin用的就是FSIN指令
下面的指令是通过反汇编一个含有sin的程序得到的:
00401084 > $ 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4]
00401088 . E8 48050000 CALL FSIN.__fload_withFB
0040108D $ 52 PUSH EDX
0040108E . 9B WAIT
0040108F . D93C24 FSTCW WORD PTR SS:[ESP]
00401092 . 74 50 JE SHORT FSIN.004010E4
00401094 . 66:813C24 7F02 CMP WORD PTR SS:[ESP],27F
0040109A . 74 06 JE SHORT FSIN.004010A2
0040109C . D92D 28114300 FLDCW WORD PTR DS:[__DEFAULT_CW_in_mem]
004010A2 > D9FE FSIN
004010A4 . 9B WAIT
004010A5 . DFE0 FSTSW AX
004010A7 . 9E SAHF
004010A8 . 7A 1D JPE SHORT FSIN.004010C7
004010AA > 833D 808F4300 00 CMP DWORD PTR DS:[___fastflag],0
004010B1 . 0F85 77050000 JNZ FSIN.__fast_exit
004010B7 . BA 1E000000 MOV EDX,1E
004010BC . 8D0D 304A4300 LEA ECX,DWORD PTR DS:[434A30]
004010C2 . E9 74050000 JMP FSIN.__math_exit
004010C7 > DB2D 2A114300 FLD TBYTE PTR DS:[__pi_by_2_to_61]
004010CD . D9C9 FXCH ST(1)
004010CF > D9F5 FPREM1
004010D1 . 9B WAIT
004010D2 . DFE0 FSTSW AX
基本上已经很精简了,你实在想内联汇编的话试试我写的这个函数吧:
#include
double WdsySin (double _InputRad)
{
double _ResultTemp;
_asm
{
fld _InputRad
fsin
fstp _ResultTemp
}
return _ResultTemp;
}
int main ()
{
double Num1=3.141592653589793/6;
double SinNum1;
SinNum1=WdsySin(Num1);
printf ("%f\n",SinNum1);
return 0;
}
下面的指令是通过反汇编一个含有sin的程序得到的:
00401084 > $ 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4]
00401088 . E8 48050000 CALL FSIN.__fload_withFB
0040108D $ 52 PUSH EDX
0040108E . 9B WAIT
0040108F . D93C24 FSTCW WORD PTR SS:[ESP]
00401092 . 74 50 JE SHORT FSIN.004010E4
00401094 . 66:813C24 7F02 CMP WORD PTR SS:[ESP],27F
0040109A . 74 06 JE SHORT FSIN.004010A2
0040109C . D92D 28114300 FLDCW WORD PTR DS:[__DEFAULT_CW_in_mem]
004010A2 > D9FE FSIN
004010A4 . 9B WAIT
004010A5 . DFE0 FSTSW AX
004010A7 . 9E SAHF
004010A8 . 7A 1D JPE SHORT FSIN.004010C7
004010AA > 833D 808F4300 00 CMP DWORD PTR DS:[___fastflag],0
004010B1 . 0F85 77050000 JNZ FSIN.__fast_exit
004010B7 . BA 1E000000 MOV EDX,1E
004010BC . 8D0D 304A4300 LEA ECX,DWORD PTR DS:[434A30]
004010C2 . E9 74050000 JMP FSIN.__math_exit
004010C7 > DB2D 2A114300 FLD TBYTE PTR DS:[__pi_by_2_to_61]
004010CD . D9C9 FXCH ST(1)
004010CF > D9F5 FPREM1
004010D1 . 9B WAIT
004010D2 . DFE0 FSTSW AX
基本上已经很精简了,你实在想内联汇编的话试试我写的这个函数吧:
#include
double WdsySin (double _InputRad)
{
double _ResultTemp;
_asm
{
fld _InputRad
fsin
fstp _ResultTemp
}
return _ResultTemp;
}
int main ()
{
double Num1=3.141592653589793/6;
double SinNum1;
SinNum1=WdsySin(Num1);
printf ("%f\n",SinNum1);
return 0;
}
全部回答
- 1楼网友:千夜
- 2021-01-22 07:26
你以为C库的sin不是用fsin么... sin是个intrinsic,编译器直接生成代码,根本不当函数编译
而且实际处理除非精度要求高到bt,sin都是查表的,没有现算的
- 2楼网友:西风乍起
- 2021-01-22 06:45
fcos45°=μ(mg-fsin45°)
右边展开
fcos45°=μmg-fμsin45°
移项:
fcos45°+fμsin45°=μmg
提取f
f(cos45°+μsin45°)=μmg
两边同时除以cos45°+μsin45°
f=μmg/(cos45°+μsin45° )
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯