assembly - 向 -Inf : how does it work? 舍入的快速浮点到整数公式

标签 assembly x86 floating-point-conversion x87

我一直在玩 x87 FPU 编程,我刚刚遇到以下从 float(32 位)转换为 int(32 位)的魔法:

    flds    from             # number to convert from
    fadds   magic1           # add magic number 1 (???)
    fstps   to               # store in destination as single-precision binary32
    movl    to,%eax          # load float result as an int
    subl    $magic2,%eax     # subtract magic number 2 (???)
    sarl    $1,%eax          # divide by 2
    movl    %eax,to          # and look, here's the result!

 .section .rodata
magic1:  .float 6291456.0    # 3 * 2^21
.equ magic2, 0x4ac00000      # ???

   .data
from:    .float 31415.9265   # pick a number, any number...
to:      .long  0            # result ends up here

(带有 GAS 指令的 AT&T 语法)

我已经试过了,它似乎有效(四舍五入到 -infinity),但我完全不知道为什么!谁能解释一下它是如何工作的?

最佳答案

快速回答:

第一个神奇的数字强制重新缩放参数,以便整数部分的 LSbit 在小数部分变为最右边但只有一个。

然后添加第二个魔法将删除指数位。

关于最后除以 2 IDK 的必要性,必须有一个额外的技术问题(可能与添加 3.2^21 而不是 1.2^21 有关)。

关于assembly - 向 -Inf : how does it work? 舍入的快速浮点到整数公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69030824/

相关文章:

C - 通过 assembly 制作观察点

assembly - RaspberryPI/BCM2835 内存布局

assembly - 内存对齐检查机制检查的地址是有效地址、线性地址还是物理地址?

assembly - 在程序集问题中将大写字母转换为小写字母

assembly - 为什么编译器在子程序之间插入 INT3 指令?

c++ - 为什么 IEEE-754 float 不能在平台之间交换?

assembly - 为什么光标在真实硬件上不能垂直移动,而在虚拟机上却可以?

x86 - 汇编器如何将 x86 指令助记符映射到二进制机器指令?

c - 为什么 float 不起作用?

c - 读取 float 的行并转换为整数