如何将浮点舍入到最近的偶数组件

时间:2014-04-27 19:23:41

标签: assembly rounding masm fpu irvine32

我的号码为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

2 个答案:

答案 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