Assembly 如何将浮点舍入到最近的偶数程序集
我有我的号码1.010101101,号码的类型是REAL8,我尝试使用默认值 舍入法“四舍五入到最接近的偶数”,我看到了很多例子,都是关于舍入和使用frndint的,但是经过很多讨论,我意识到这不是默认的 我是对的还是错的 如果它是错误的,你能给我解释一下如何使用MASM组装吗 这是我的代码:Assembly 如何将浮点舍入到最近的偶数程序集,assembly,rounding,masm,fpu,irvine32,Assembly,Rounding,Masm,Fpu,Irvine32,我有我的号码1.010101101,号码的类型是REAL8,我尝试使用默认值 舍入法“四舍五入到最接近的偶数”,我看到了很多例子,都是关于舍入和使用frndint的,但是经过很多讨论,我意识到这不是默认的 我是对的还是错的 如果它是错误的,你能给我解释一下如何使用MASM组装吗 这是我的代码: .686 .model flat,stdcall .stack 4096 include irvine32.inc include macros.inc include floatio.in
.686
.model flat,stdcall
.stack 4096
include irvine32.inc
include macros.inc
include floatio.inc
.data
R REAL8 1.010101101
.code
main proc
finit
call ShowFPUStack
fld R
call ShowFPUStack
frndint
call ShowFPUStack
exit
main endp
end main
这是我的FPU堆栈
------ FPU Stack ------
------ FPU Stack ------
ST(0): +1.0101011E+000
------ FPU Stack ------
ST(0): +1.0000000E+000
x87 FPU在硬件上实现了四种舍入方法。这些是:
- 四舍五入到最近(偶数)
- 向下取整,朝向负无穷大
- 向上取整,朝向正无穷大
- 向零进发
FLDCW
指令设置新值,或通过FSTCW
获取当前值进行验证。有关说明和word格式的更多信息,请参阅手册的8.1.5
但是,请注意,控制字应该仅由操作系统软件控制,而不是由应用程序本身控制。如果选择更改控制字,请确保在退出程序之前将其还原
FRNDINT
用于将当前位于堆栈顶部的浮点值舍入为最接近的整数。四舍五入为偶数时,四舍五入1.010101101
的结果为1。但是,如果您启用向正无穷大舍入,则结果将为2。正如Daniel Kamil Kozar所说:
FPU默认使用“舍入到最近(偶数)”方法,因此很有可能您已经在使用它。当FPU进行计算和不同浮点格式(本例中为32、64和80位)之间的转换时,将考虑舍入模式
因此,这是一种简单的方法来植入到最近的(甚至)
因此,我从您那里了解到,没有关于默认舍入的具体说明?但是,如果我需要查看舍入后的值,我该怎么做?执行
frnind
后的值已经舍入。我真的不知道你的意思。“frnind:用于将当前堆栈顶部的浮点值舍入为最接近的整数值”,如果frnind不是我可以使用它进行默认舍入的指令,那么如何将我的数字舍入为默认舍入?我应该使用什么?正如我所说,四舍五入是在计算和转换过程中完成的。没有一条指令只执行舍入。例如,你可以给你的操作数加一个零,但我认为这不是你真正想要的。我对十进制数的二进制表示形式的精确“银行家舍入”不太信任。有关示例,请参见中的“呼叫者注意事项”部分
.686
.model flat,stdcall
.stack 4096
include irvine32.inc
include macros.inc
include floatio.inc
.data
R REAL8 1.010101101b
l REAL4 0.0
.code
main proc
finit
call ShowFPUStack
fld R
call ShowFPUStack
fst l
fld l
call ShowFPUStack
exit
main endp
end main