汇编语言计算Sin,Cos,Pow函数
填了一下之前的坑。首先是一个题外话,在VS2015中默认汇编代码会使用SSE生成,如果想用FPU编译出FLD,FSTP这些指令,需要设置一下。
项目 >> 属性 >> C/C++ >> Code Generation
Enable Enhanced Instruction Set默认是是Not Set,但是会被开启,设置成IA32就行了。
方便生成浮点计算代码时使用。
然后进入正题,Sin,Cos,Pow计算,先上代码
.data ;0.52359877 = 30度 fval1 real4 0.52359877 x real4 3.14 power real4 1.1 ;3.14^1.1 = 3.5206480575123685712125842405755 .code SomeFunction proc fld fval1 fsin ;sin(30度) = 0.5,结果放到st0 fld fval1 fcos ;cos(30度) = 0.86602540378443864676372317075294,结果放到st0 fld fval1 fsincos ;st0 = sin,st1 = cos ;dividend被除数 LabelMyPower: ;x^power = 2^(y*log2(x)) ;3.14^1.1 fld power fld x fyl2x ;fyl2x = y * log2(x) = power * log2(x) = st1 * log2(st0),结果放到st0 = 1.8158411074047422 fld1 fld st(1) ;fyl2x的结果 fprem ;相当于fmod(1.0, fyl2x的结果) = fmod(st0, st1),得到余数部分,结果放到st0 = 0.81584110740474229 f2xm1 ;2^x - 1,st0[-1.0, +1.0],操作数值域为[-1.0, +1.0],所以才有上面的fld1,结果st0 = 0.76032414147020678 fadd ;st0 = 0.76032414147020678,st1 = 1.0,加上上一指令减去的1.0,结果st0 = 1.7603241414702068 fscale ;st0 * 2^(st1取整为1, st1 = 1.8158411074047422) = 1.7603241414702068 * 2^1 = 3.5206482829404137 ;st0 = 2^小数次方 * 2^整数次方 ;fxch st(1) ;fstp st ;st0 = x^power ret SomeFunction endp end
注释都写好了,应该没问题,Sin,Cos不用说了。
Pow函数主要用到了指数和对数的性质,说实话指数对数咋用早忘光了,还好有笔记,下辈子真得考虑做个学霸了,这辈子的数学能力应该没救了。
简单来说,x^y可以化成2^(y*log2(x))这种方法计算。
汇编代码就是先计算y*log2(x)小数部分,求2的指数,再计算整数部分2的指数,再相乘
写汇编Intel手册果然少不了,10年前就听大牛说过这玩意,10年后终于有幸接触了Hello World级汇编编程,可喜可贺,也就比大牛晚个10年而已。
pow汇编代码来自
http://www.madwizard.org/programming/snippets?id=36
汇编语言计算Sin,Cos,Pow函数的更多相关文章
- C语言pow()函数的计算精度问题
编程计算 a+aa+aaa+-+aa-a(n个a)的值,n和a的值由键盘输入.例如,当n=4,a=2,表示计算2+22+222+2222的值. 程序运行结果示例: Input a,n: 2,4↙ su ...
- pow函数(数学次方)在c语言的用法,两种编写方法实例( 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值)
关于c语言里面pow函数,下面借鉴了某位博主的一篇文章: 头文件:#include <math.h> pow() 函数用来求 x 的 y 次幂(次方),x.y及函数值都是double型 , ...
- pow()函数结果强制转化为int造成误差的分析
开发环境:codeblocks,编译器gcc 在计算102时调用pow(10, 2),再强制类型转换为int类型后输出: printf(,)); 得到的结果却是:99 这是因为 double pow( ...
- Python3 pow() 函数
Python3 pow() 函数 Python3 数字 描述 pow() 方法返回 xy(x的y次方) 的值. 语法 以下是 math 模块 pow() 方法的语法: import math mat ...
- pow函数
pow函数如果直接强制类型转换成int,会导致精度的损失.如果是int的幂计算,建议重写函数.或者用double型进行计算.
- (函数分治法)实现pow函数(x的y次方幂)
题目:实现pow函数. 题目分析:因为一个一个乘,循环太大,参考矩阵连乘问题:对于n=4的话,可以得出x的平方,然后平方与平方相乘.节省计算次数.对于偶数的幂,只要x的平方多次递归调用即可:对于奇数的 ...
- c++ pow函数
函数名称: pow 函数原型: double pow( double x, double y ); 函数功能: 计算x的y次幂 例:z=pow(x,y); x=9,y=8 z就是9 ...
- python实现pow函数(求n次幂,求n次方)
目录 类型一:求n次幂 类型二:求n开方 类型一:求n次幂 实现 pow(x, n),即计算 x 的 n 次幂函数.其中n为整数.pow函数的实现--leetcode 解法1:暴力法 不是常规意义上的 ...
- 初中知识回顾tan,sin,cos关系
如果K=tan, sin 是X x=k/power(1+k*k,0.5) 开平方 cos是y y=1.0/power(1+k*k,0.5) 开平方 gisoracle总结 ============= ...
随机推荐
- Alsa aplay S8 U8 S16_LE S16_BE U16_LE U16_BE格式
举个例子 aplay -r 16000 -f S16_LE -D hw:0,0 -c 2 -d 3 ~/Private/Private_Tools/02_ALSA_Learning/left_1k_r ...
- debian系统的另一个包管理器aptitude
最近在玩OPI的时候遇到了一个包因为各种依赖问题死活装不上.苦搜很久找到这个aptitude包管理器. 基于debain衍生的各种操作系统比较常用包管理器是apt,不过apt在遇到依赖问题的时候处理得 ...
- 几种将上一个请求的cookies带入下一个请求中的方法
*** 此次练习不包含使用requests.session()方法实现: 练习环境:本地安装禅道 格式: 1.头部传Cookie:xxx2.加参数cookies=字典格式3.直接传RequestsCo ...
- Entity Frame Code First 简易教程
简介 什么是ORM 搭建Entity FrameWork CodeFirst应用 数据库迁移 表属性常见配置 Entity FrameWork 一对多.多对多 一.简介 Entity Framewor ...
- 设置了error_reporting(E_ALL)还是不显示错误
原因就是在php.ini里面将display_errors关闭了.可以在php.ini里面将display_errors配置为On,然后重启php-fpm ini_set('display_error ...
- Eclipse 安装中文简体语言包
Installing the language packs Open the install wizard with 'Help' > 'Install new software...' Add ...
- eclipse的Git忽略某些不需要提交的文件
Eclipse切换到Navigator视图,找到.gitignore文件(如果是maven项目,一般找作为modules的项目的.gitignore文件),添加内容: .settings .proje ...
- Linux网络编程学习(一) ----- 概论和Linux模型(第一章第二章)
1.什么是计算机网络,通信方式是什么? 计算机网络就是通过通信线路相互连接的计算机的集合,主要通过双绞线.同轴电缆.电话线或者光缆等有形传输介质通信,还有就是通过激光.微波.卫星等实现无线通信 2.W ...
- FP数据库配置文件
- 《CSAPP》地址翻译
本节所使用的符号: 地址翻译 地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射. 映射实现: MMU利用页表来实现这种映射.CPU中的一个控制寄 ...