assembly 程序集添加双精度值不再使它们相等

mhd8tkvw  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(75)

出于某种原因,当我在汇编中比较两个双精度浮点数时,它们是相等的,直到它们参与了几次加法运算,它们才相等。

global _start

section .data
                a: dq 1.0
                b: dq 0.5
                c: dq 0.1
                msg: db "Equal!", 10, 0
                msg_len equ $-msg

section .text
_start:
.loop:
                movsd xmm0, qword [b]
                addsd xmm0, qword [c]
                movsd qword [b], xmm0

                movsd xmm0, qword [b]
                ucomisd xmm0, qword [a]
                jb .loop

                movsd xmm0, qword [b]
                ucomisd xmm0, qword [a]
                je .equal
                jmp .exit

.equal:
                mov rax, 1
                mov rdi, 1
                mov rsi, msg
                mov rdx, msg_len
                syscall

.exit:
                mov rax, 60
                xor rdi, rdi
                syscall
hujrc8aj

hujrc8aj1#

我一直知道双精度值并不精确,但我从未想过对它们进行四舍五入,然后比较它们,这很有效。

global _start

section .data
                a: dq 1.0
                b: dq 0.5
                c: dq 0.1
                msg: db "Equal!", 10, 0
                msg_len equ $-msg

section .text
_start:
.loop:
                movsd xmm0, qword [b]
                addsd xmm0, qword [c]
                movsd qword [b], xmm0

                movsd xmm0, qword [b]
                ucomisd xmm0, qword [a]
                jb .loop

                movsd xmm0, qword [b]
                roundsd xmm0, xmm0, 5

                movsd xmm1, qword [a]
                roundsd xmm1, xmm1, 5

                ucomisd xmm0, xmm1
                je .equal
                jmp .exit

.equal:
                mov rax, 1
                mov rdi, 1
                mov rsi, msg
                mov rdx, msg_len
                syscall

.exit:
                mov rax, 60
                xor rdi, rdi
                syscall

相关问题