我正在MIPS汇编(使用MARS)中编写一个程序,该程序从.txt文件中读取数字并将其加载到向量中。其中一些数字是双倍的。该程序及其逻辑通常可以工作,但我对一些计算不正确的数字有问题。例如,.txt文件中为0.672的数字存储为0.6719999999999999。故障偶尔会在添加中发生。有什么方法可以解决这个问题?
如果你好奇,这里是我的代码(评论是葡萄牙语):
.data
fim: .double -1.0
zero: .double 0.0
dez: .double 10.0
filename: .asciiz "xtrain.txt"
quebra_linha: .asciiz "\n"
espaco: .asciiz " "
buffer: .space 17408
.align 3
vetor: .space 4000
.text
ler_arq:
la $a0, filename
li $a1, 0
li $a2, 0
li $v0, 13
syscall
load:
move $a0, $v0
la $a1, buffer
li $a2, 17408
li $v0, 14
syscall
ler_nums:
la $s0, vetor
move $s1, $s0
la $t0, buffer
l.d $f10, dez
copy_num:
lb $t1, 0($t0)
bne $t1, '.', cont
li $t3, 1
addiu $t0, $t0, 1
lb $t1, 0($t0)
cont:
beq $t1, ',', num_end
beq $t1, '\r', num_end
beq $t1, '\n', fim_copia
beq $t1, 0, end
subu $t1, $t1, 48
beq $t3, 1, le_double
le_int:
mul $t2, $t2, 10
add $t2, $t2, $t1
j fim_copia
le_double:
mtc1 $t1, $f0
cvt.d.w $f0, $f0
addiu $t4, $t4, 1
loop_double:
div.d $f0, $f0, $f10
addiu $t5, $t5, 1
blt $t5, $t4, loop_double
add.d $f2, $f2, $f0
li $t5, 0
j fim_copia
num_end:
mtc1 $t2, $f4
cvt.d.w $f4, $f4
add.d $f4, $f4, $f2
s.d $f4, 0($s1)
li $t2, 0
li $t3, 0
li $t4, 0
l.d, $f0, zero
l.d, $f2, zero
addiu $s1, $s1, 8
j fim_copia
fim_copia:
addiu $t0, $t0, 1
j copy_num
end:
mtc1 $t2, $f0
cvt.d.w $f0, $f0
s.d $f0, 0($s1)
addiu $s1, $s1, 8
l.d $f0, fim
s.d $f0, 0($s1)
l.d $f12, 0($s0)
loop:
addiu $t9, $t9, 1
li $v0, 3
syscall
la $a0, espaco
li $v0, 4
syscall
addi $s0, $s0, 8
l.d $f12, 0($s0)
bne $t9, 8, cont_fq
la $a0, quebra_linha
li $v0, 4
syscall
li $t9, 0
cont_fq:
c.eq.d $f12, $f0
bc1f loop
我试过从双精度变为单精度,老实说,我不确定还能尝试什么。