Judul; Saya telah menemukan banyak contoh 32-bit tetapi tidak ada yang lengkap 64-bit. Menggunakan postingan ini sebagai panduan , saya menemukan implementasi Log10 berikut tetapi saya tidak sepenuhnya yakin apakah terjemahannya akurat atau efisien...

Edit: Seharusnya, ini dentang contoh menangani kasus MAX_VALUE tanpa dua instruksi terakhir tetapi, jika dihapus, saya mendapatkan hasil 20 bukannya yang diharapkan 19.

...
mov rcx, 0FFFFFFFFFFFFFFFFh               ; put the integer to be tested into rcx

lea r10, qword ptr powersOfTen            ; put pointer to powersOfTen array into r10
lea r9, qword ptr maxDigits               ; put pointer to maxDigits array into r9
bsr rax, rcx                              ; put log2 of rcx into rax
cmovz rax, rcx                            ; if rcx is zero, put zero into rax
mov al, byte ptr [(r9 + rax)]             ; index into maxDigits array using rax; put the result into al
cmp rcx, qword ptr [(r10 + (rax * 8))]    ; index into powersOfTen array using (rax * 8); compare rcx with the result
sbb al, 0h                                ; if the previous operation resulted in a carry, subtract 1 from al
add rcx, 1h                               ; add one to rcx
sbb al, 0h                                ; if the previous operation resulted in a carry, subtract 1 from al
...

align 2

maxDigits:
    byte 00h
    byte 00h
    byte 00h
    byte 01h
    byte 01h
    byte 01h
    byte 02h
    byte 02h
    byte 02h
    byte 03h
    byte 03h
    byte 03h
    byte 03h
    byte 04h
    byte 04h
    byte 04h
    byte 05h
    byte 05h
    byte 05h
    byte 06h
    byte 06h
    byte 06h
    byte 06h
    byte 07h
    byte 07h
    byte 07h
    byte 08h
    byte 08h
    byte 08h
    byte 09h
    byte 09h
    byte 09h
    byte 09h
    byte 0Ah
    byte 0Ah
    byte 0Ah
    byte 0Bh
    byte 0Bh
    byte 0Bh
    byte 0Ch
    byte 0Ch
    byte 0Ch
    byte 0Ch
    byte 0Dh
    byte 0Dh
    byte 0Dh
    byte 0Eh
    byte 0Eh
    byte 0Eh
    byte 0Fh
    byte 0Fh
    byte 0Fh
    byte 0Fh
    byte 11h
    byte 11h
    byte 11h
    byte 12h
    byte 12h
    byte 12h
    byte 13h
    byte 13h
    byte 13h
    byte 13h
    byte 14h

align 2

powersOfTen:
    qword 00000000000000001h
    qword 0000000000000000Ah
    qword 00000000000000064h
    qword 000000000000003E8h
    qword 00000000000002710h
    qword 000000000000186A0h
    qword 000000000000F4240h
    qword 00000000000989680h
    qword 00000000005F5E100h
    qword 0000000003B9ACA00h
    qword 000000002540BE400h
    qword 0000000174876E800h
    qword 0000000E8D4A51000h
    qword 0000009184E72A000h
    qword 000005AF3107A4000h
    qword 000038D7EA4C68000h
    qword 0002386F26FC10000h
    qword 0016345785D8A0000h
    qword 00DE0B6B3A7640000h
    qword 08AC7230489E80000h
    qword 0FFFFFFFFFFFFFFFFh
2
Kittoes0124 7 Maret 2019, 01:10

1 menjawab

Jawaban Terbaik

Metode penghitungan log10 tercepat untuk input arbitrer, akan menjadi pencarian tabel berdasarkan penghitungan nol di depan (perkiraan log2), diikuti dengan kemungkinan penyesuaian satu tergantung pada tabel kedua yang mencatat pangkat 10 yang berada dalam kisaran pendekatan log2.

Itulah yang Anda temukan di sini, jadi saya pikir Anda baik untuk pergi. Ekstensi ke 64-bit sangat mudah jika Anda memahami versi 32-bit, cukup gandakan semua ukuran tabel dan isi dengan nilai yang tepat dan ubah beberapa instruksi untuk menggunakan register 64-bit dan beban 64-bit.

6
BeeOnRope 7 Maret 2019, 15:04