assembly - 如何将浮点舍入到最接近的偶数汇编

标签 assembly rounding masm fpu irvine32

我有一个号码 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获取当前值进行验证。更多关于指令和单词格式请参见Intel Basic Architecture的8.1.5手册。

但是,请注意,控制字应该仅由操作系统软件控制,而不是由应用程序本身控制。如果您选择更改控制字,请确保在退出程序之前恢复它。

FRNDINT 用于将当前位于堆栈顶部的浮点值舍入为最接近的整数值。舍入为偶数时,1.010101101 舍入的结果将为 1。但是,如果打开向正无穷大舍入,则结果将为 2。

关于assembly - 如何将浮点舍入到最接近的偶数汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23327893/

相关文章:

c# - C# 中的 float / double Math.Round

algorithm - 币密集软处理舍入误差的常用策略?

assembly - 如何在 MASM 中编写远绝对 JMP/CALL 指令?

c - C如何跨平台?

组装:有人可以解释一下带有 leaq 指令的这一行的作用吗?

python--表达式的舍入值--意外的 EOF

visual-studio - 是否可以使用 Visual Studio 编写 intel 程序集?

c++ - 使用 SIMD 指令执行任意 128/256/512 位排列的最快方法是什么?

assembly - 使用 NASM 在 64 位模式下不支持 pop 指令?

windows - masm FPU 到 fasm FPU 无​​法转换并且不起作用