Преобразование чисел с плавающей точкой

Последнее обновление: 20.01.2023

При работе с числами с плавающей точкой может потребоваться преобразование, например, сделать из числа single число double и наоборот, либо выполнить преобразование между числами с плавающей точкой и целыми числами. Для этого применяется ряд инструкций.

Инструкция FCVT выполняет преобразование из single в double и обратно и имеет следующие формы:

FCVT Dn, Sm    // преобразование из single (в регистре Sm) в double, результат в регистре Dn
FCVT Sn, Dm     // преобразование из double в single, результат в регистре Sn
FCVT Sn, Hm     // преобразование из half в single, результат в регистре Sn
FCVT Hn, Sm     // преобразование из single в half, результат в регистре Hn

Для преобразования целых чисел в числа с плавающей точкой имеются инструкции

  • SCVTF: для преобразования целых чисел со знаком

    SCVTF Dn, Xm    // в регистр Dn помещается результат преобразования в double числа из Xm
    
  • UCVTF: для преобразования целых чисел без знака

    UCVTF Dn, Xm    // в регистр Dn помещается результат преобразования в double числа из Xm
    

Для преобразования чисел с плавающей точкой в целое число есть ряд инструкций:

  • FCVTAS: для преобразования чисел со знаком c округлением в ближайшего целого

    FCVTAS Wd, Hn
    
  • FCVTAU: для преобразования чисел без знака c округлением в ближайшего целого

    FCVTAU Wd, Sn
    
  • FCVTMS: для преобразования чисел со знаком c округлением до отрицательной бесконечности (Например, число 3.5 округляется до 3, а число -3.5 - до -4)

    FCVTMS Xd, Dn
    
  • FCVTMU: для преобразования чисел без знака c округлением до отрицательной бесконечности

    FCVTMU Xd, Dn
    
  • FCVTPS: для преобразования чисел со знаком c округлением до положительной бесконечности (Например, число 3.1 округляется до 4, а число -3.1 - до -3)

    FCVTPS Xd, Dn
    
  • FCVTPU: для преобразования чисел без знака c округлением до положительной бесконечности

    FCVTPU Xd, Dn
    
  • FCVTZS: для преобразования чисел со знаком c округлением в сторону нуля (Например, число 3.5 округляется до 3, а число -3.5 - до -3)

    FCVTZS Xd, Dn
    
  • FCVTZU: для преобразования чисел без знака c округлением в сторону нуля

    FCVTZU Xd, Dn
    

Например, мы хотим вывести на консоль значение одного числа типа single с помощью функции printf языка C. Но эта функция принимает только 64-разрядные числа с плавающей точкой.

.global main
main:
    STR LR, [SP, #-16]!
    LDR X0, =number             // загружаем указатель на число number
    LDR S1, [X0]                // загружаем данные по адресу из X0 в регистр S0
    FMOV W1, S1                 // помещаем число single в W1 (X1) для форматированного вывода в printf
    LDR X0, =prtstr             // загружаем строку форматирования
    BL printf                   // вызываем функцию printf

    MOV X0, #0      // код возврата
    LDR LR, [SP], #16
    RET
.data
    number: .single 12.3456
    prtstr: .asciz "number: %f\n"

В данном случае помещаем в регистр S1 число number (12.3456), и для вывода с помощью функции printf далее передаем данные из S1 в W1, но при выполнении программа выведет нам следующее

number: 0.000000

Теперь применим преобразование из single в double:

.global main
main:
    STR LR, [SP, #-16]!
    LDR X0, =number             // загружаем указатель на число number
    LDR S1, [X0]                // загружаем данные по адресу из X0 в регистр S0

    FCVT D0, S1                 // преобразуем число single из S1 в число double в D0

    FMOV X1, D0                 // помещаем число X1 для форматированного вывода в printf
    LDR X0, =prtstr             // загружаем строку форматирования
    BL printf                   // вызываем функцию printf

    MOV X0, #0      // код возврата
    LDR LR, [SP], #16
    RET
.data
    number: .single 12.3456
    prtstr: .asciz "number: %f\n"

Консольный вывод в данном случае

number: 12.345600
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850