Assembly 如何将浮点舍入到最近的偶数程序集

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

我有我的号码1.010101101,号码的类型是REAL8,我尝试使用默认值 舍入法“四舍五入到最接近的偶数”,我看到了很多例子,都是关于舍入和使用frndint的,但是经过很多讨论,我意识到这不是默认的 我是对的还是错的

如果它是错误的,你能给我解释一下如何使用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

x87 FPU在硬件上实现了四种舍入方法。这些是:

  • 四舍五入到最近(偶数)
  • 向下取整,朝向负无穷大
  • 向上取整,朝向正无穷大
  • 向零进发
FPU默认使用“舍入到最近(偶数)”方法,因此很有可能您已经在使用它。当FPU进行计算和不同浮点格式(本例中为32、64和80位)之间的转换时,将考虑舍入模式

舍入模式由x87控制字控制。您可以使用
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