我有一个号码 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/