我的号码为1.010101101,号码类型为REAL8,我尝试默认 舍入方法"舍入到最近的偶数",我看到很多例子,它全部关于四舍五入和使用frndint但是经过很多serch我意识到它不是默认的 四舍五入是对还是错?
如果它错了,你可以向我解释如何使用MASM汇编吗?
这是我的代码:
.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
答案 0 :(得分:3)
x87 FPU在硬件中实现了四种舍入方法。那些是:
FPU默认使用“Round to nearest(even)”方法,因此您很可能已经在使用它。 FPU进行计算时会考虑舍入模式,并且在不同的浮点格式(本例中为32,64和80位)之间进行转换。
舍入模式由x87控制字控制。您可以使用FLDCW
指令设置新值,或通过FSTCW
获取当前值以进行验证。有关说明和单词格式的更多信息,请参阅Intel Basic Architecture手册的8.1.5。
但请注意,控制字应仅由操作系统软件控制,而不是由应用程序本身控制。如果您选择更改控制字,请确保在退出程序之前将其恢复。
FRNDINT
用于将当前位于堆栈顶部的浮点值舍入为最接近的积分值。舍入到偶数时,舍入1.010101101
的结果将为1.但是,如果打开向正无穷大舍入,则结果将为2.
答案 1 :(得分:0)
Daniel Kamil Kozar说:
"回合最近(偶数)" FPU默认使用方法,因此您很可能已经使用它。 FPU进行计算时会考虑舍入模式,并且在不同的浮点格式(本例中为32,64和80位)之间进行转换。
这样可以轻松地将Round植入到最近(偶数)
.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