ST语言浮点数四舍五入函数

        在PLC中对浮点数进行四舍五入的处理。

首先是变量声明:

FUNCTION round : LREAL
VAR_INPUT
	a1:LREAL;
	a2:INT;
END_VAR
VAR	
x1,x2,x3,x4,d:LREAL;
c : LINT;
i:INT;
END_VAR

然后是程序逻辑部分:

c:=1;
FOR i:=1 TO a2 DO
	c:=c*10;
END_FOR

d:=LINT_TO_REAL(c);
x1 := LTRUNC(a1*d)*10;
x2 := LTRUNC(a1*d*10);
x3:=x2-x1;
IF a1 = 0 THEN
	round:=0;
ELSE
	IF ABS(x3) > 4 THEN
		IF a1 >0 THEN
			round := x1/d/10+1/d;
		ELSE
			round := x1/d/10-1/d;
		END_IF
	ELSE
		round := x1/d/10;
	END_IF
END_IF

注意函数名称和返回值的名称一样为round。最后贴上完整的图片。

### 使用汇编语言实现浮点数和三角函数运算 #### 浮点单元 (FPU) 的作用 浮点单元(FPU)是CPU内部负责执行浮点数的数学运算的专门模块,在硬件层包含专门的电路来高速执行浮点运算,与处理整数运算的电路分离,允许同时进行整数和浮点运算。FPU遵循如IEEE 754标准[^1]。 #### 汇编中的浮点指令集 大多数现代处理器支持特定的浮点指令集用于高效地完成这些操作。例如,在x86架构下,存在一组专为浮点运算设计的操作码,比如`FLD`, `FADD`, `FSUB`, `FMUL`, 和 `FDIV`等,它们分别对应着加载、加法、减法、乘法以及除法功能。 下面是一个简单的例子展示如何用AT&T语法编写一段汇编代码来进行两个单精度浮点数相加: ```assembly .data num1: .float 3.14 # 定义第一个浮点数变量num1=3.14 num2: .float 2.71 # 定义第二个浮点数变量num2=2.71 .text .global _start # 入口标签定义 _start: flds num1 # 将num1压栈 fadds num2 # 把num2加入堆栈顶部并弹出 fstps result # 存储结果到result位置,并从栈顶移除它 movl $1, %eax # syscall number for sys_exit xorl %ebx, %ebx # exit code 0 int $0x80 # make kernel call ``` 这段代码展示了基本的浮点数加法过程;然而对于更加复杂的运算像三角函数,则可能涉及到更多的工作因为这类函数往往不是由单一机器指令构成而是通过一系列近似方法构建而成。 #### 实现三角函数(以正弦为例) 由于直接在汇编层面实现高效的三角函数较为复杂,通常的做法是在高级编程语言中调用已有的库函数或者采用查表法配合多项式逼近的方式简化计算流程。不过这里给出一种基于泰勒级数展开式的简单实现思路作为参考: 假设要计算sin(x),其中|x|<π/2: \[ \text{sin}(x)= x-\frac{x^{3}}{3!}+\frac{x^{5}}{5!}-\cdots (-1)^n\cdot\frac{x^{(2n+1)}}{(2n+1)!}\] 可以通过循环累加每一项直到满足所需精度为止。考虑到性能因素,实际应用时常会结合查找表减少迭代次数从而加快速度。 下面是伪代码形式的大致框架: ```assembly # 假设已经初始化好输入参数x存放在寄存器st(0) movw $(N), %cx # 设置最大迭代次数N xorpd %xmm0,%xmm0 # 清零累积求和暂存区 movsd factorials+%rax*8, %rbp # 初始化阶乘分母因子 movsd powers_of_x+%rax*8, %rdi # 初始化幂次方分子因子 negq %rax # 记录当前奇偶状态(-1)^k loop_begin: addsd (%rdi),%xmm0 # 当前项加上去 mulsd power_increment,(%rdi) # 更新下一个x^(2k+1) imulq factorial_increment, (%rbp) # 更新下一个(2k+1)! incq %rax # 改变符号位 decw %cx jnz loop_begin # 如果还没达到设定的最大迭代次数则继续 fstps final_result # 输出最终的结果 ``` 请注意这只是一个概念性的说明而不是可以直接使用的完整解决方案。真正的优化版本可能会涉及更多技巧和技术细节以便更好地适应具体平台特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值