- 注册时间
- 2010-10-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2292
- 在线时间
- 小时
|
楼主 |
发表于 2011-2-22 12:15:11
|
显示全部楼层
试了下fsincos指令,用在fft中应该可以。- .386
- .model flat,stdcall
- option casemap:none
-
- ;-----------------------------------------------------------
- .data
- ConsPi_180 real8 0.017453292519943295769
- ;***********************************************************
- .code
- ;-----------------------------------------------------------
- _Degree2SinCos proc deg:real4,lpsin:dword,lpcos:dword
- mov esi,lpcos
- mov edi,lpsin
- finit
- fld real4 ptr[deg]
- fld qword ptr [ConsPi_180]
- fmul st(0),st(1)
- fsincos
- fstp QWORD ptr[esi]
- fst QWORD ptr[edi]
- ret
-
- _Degree2SinCos endp
-
- _Rad2SinCos proc rad:real8,lpsin:dword,lpcos:dword
- mov esi,lpcos
- mov edi,lpsin
- finit
- fld real8 ptr[rad]
- fsincos
- fstp QWORD ptr[esi]
- fst QWORD ptr[edi]
- ret
-
- _Rad2SinCos endp
-
- end
复制代码 c中调用一下:- #include <stdio.h>
- #define PI 3.1415926535897932
-
- #ifdef __cplusplus
- #include <windows.h>
- extern "C" {
- #endif
- void _stdcall _Degree2SinCos(float degree,double *sin,double *cos);
- void _stdcall _Rad2SinCos(double Rad,double *sin,double *cos);
-
- #ifdef __cplusplus
- }
- #endif
-
- int main()
- {
- float deg=30.0;
- double rad=30.0*PI/180.0;
- double sin,cos;
-
- _Degree2SinCos(deg,&sin,&cos);
- printf("_Degree2SinCos:\ncos(%.4f)=%18.16lf\nsin(%.4f)=%18.16lf\n",deg,cos,deg,sin);
-
- _Rad2SinCos(rad,&sin,&cos);
- printf("_Rad2SinCos:\ncos(%.4f)=%18.16lf\nsin(%.4f)=%18.16lf\n",rad,cos,rad,sin);
- //system("PAUSE");
- getch();
- return 0;
- }
复制代码 _Degree2SinCos:
cos(30.0000)=0.8660254037844386
sin(30.0000)=0.5000000000000000
_Rad2SinCos:
cos(0.5236)=0.8660254037844387
sin(0.5236)=0.4999999999999999
唯一不爽的是上面代码生成的可执行文件,360竟然报毒,没法蛋定了,你懂的。
test_src.zip
(22.79 KB, 下载次数: 0)
|
|