1.请教各位大神有无需要改正的错误
2.数据溢出的范围有没有更好的处理方法?
以下是我的程序,欢迎指正
SUBROUTINE_BLOCK LREAL2REAL:SBR0
TITLE=//64位浮点数转32位浮点数
VAR_INPUT
LREAL_8Byte:DWORD; // LREAL_8Byte
END_VAR
VAR_OUTPUT
REAL_4Byte:DWORD; // REAL_4Byte
ERROR:BOOL;
END_VAR
VAR
temp1:WORD;
temp2:WORD;
temp3:BYTE;
temp4:DWORD;
temp5:DWORD;
END_VAR
BEGIN
Network 1
// //1.把双精度浮点数的高16位读取出来;左移1位,右移5位之后取到双精度浮点数的指数部分;
// //2.双精度浮点数指数减去1023,再加上127得到单精度浮点数的指数部分。
// //1023=0000001111111111(16位)-1023=1111110000000001(16位)
// // 127=0000000001111111(16位) -127=1111111110000001(16位)
LD SM0.0
LPS
MOVW *LD0, LW9
AENO
SLW LW9, 1
AENO
MOVW LW9, LW11
SRW LW11, 5
LRD
-I 1023, LW11
LRD
AW< LW11, -127
MOVW -127, LW11
AENO
MOVD 0, LD4
LPP
AW> LW11, 128
MOVD 0, LD4
= L8.0
CRET
NOT
+I 127, LW11
Network 2
// //取出双精度浮点数的高8位,用于取正负符号位。
LD SM0.0
MOVB *LD0, LB13
Network 3
// //1.双精度浮点数指针后移一个字节。
// //2.左移4位,右移8位。
// //3.把单精度浮点数的指数部分加上,再右移1位,得到单精度浮点数的小数部分,空出符号位。
// //4.传送正负符号位
LD SM0.0
LPS
+D 1, LD0
MOVD *LD0, LD14
AENO
SLD LD14, 4
AENO
MOVD LD14, LD18
SRD LD18, 8
LRD
MOVB LB12, LB18
AENO
SRD LD18, 1
LPP
A L13.7
= L18.7
Network 4
// //输出结果。
LD SM0.0
MOVD LD18, LD4
END_SUBROUTINE_BLOCK