Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2011, 02:09   #1
TRIZER
Студент
Пользователь
 
Аватар для TRIZER
 
Регистрация: 13.11.2009
Сообщений: 65
Сообщение Разбить число вещественного расширенного формата на целую и дробную часть

Здравствуйте,
Необходимо получить целую и дробную часть вещественного числа (из FPU)

Подскажите пожалуйста алгоритм для решения этой задачки (лучше всего конечно код)
Пока мои идеи вот такие:

Получить целую часть я так понимаю можно командой fisttp.
А как можно получить дробную часть? у меня идея вроде:

0) выделить целую часть
1) вычесть из вещественного числа целую часть
2) сохранить вещественное число в памяти
3) установить нулевой порядок для этого числа (тут первая трудность, там вроде первый бит вещественного числа это знак +/-)
4) обратно в FPU
5) сохранить целую часть того что получилось как дробную


Может можно как то проверять вещественное число в FPU на наличие дробной части? или узнать сколько знаков идет после запятой и до запятой?
TRIZER вне форума Ответить с цитированием
Старый 14.07.2011, 09:52   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

http://forum.vingrad.ru/faq/topic-15...%BB%D0%B0.html

В этой теме есть вывод вещественного числа. Сначала выводится целая часть, затем дробная.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 14.07.2011, 13:32   #3
TRIZER
Студент
Пользователь
 
Аватар для TRIZER
 
Регистрация: 13.11.2009
Сообщений: 65
По умолчанию

alexcoder, не нашел полного ответа на указанной вами странице, если он та есть то процетируйте пожалуйста.
Может есть еще варианты?
TRIZER вне форума Ответить с цитированием
Старый 15.07.2011, 06:14   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Код:
	finit
	fld1
	fld	tbyte ptr [ValA]
	fprem
	fstp	tbyte ptr [ValC]

	fld	tbyte ptr [ValA]
	fld	tbyte ptr [ValC]
	fsub
	fstp	tbyte ptr [ValB]
[ValA] - исходная
[ValB] - целая
[ValС] - дробная
все 80-ти битные.

аттач (для masm32):
Вложения
Тип файла: rar floatjob.rar (2.6 Кб, 16 просмотров)
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 15.07.2011, 10:12   #5
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Вывод вещественного числа
Код:
; Требуется директива .286C или выше.
outfloat proc   near
        push    ax
        push    cx
        push    dx
; Формируем кадр стэка, чтобы хранить в нём десятку
; и ещё какую-нибудь цифру.
        push    bp
        mov     bp, sp
        push    10
        push    0
; Проверяем число на знак, и если оно отрицательное,
        ftst
        fstsw   ax
        sahf
        jnc     @of1
; то выводим минус
        mov     ah, 02h
        mov     dl, '-'
        int     21h
; и оставляем модуль числа.
        fchs
; Пояснение далее пойдёт на примере.   ; ST(0) ST(1) ST(2) ST(3) ...
; Отделим целую часть от дробной.      ; 73.25 ... что-то не наше
@of1:   fld1                           ;  1    73.25 ...
        fld     st(1)                  ; 73.25  1    73.25 ...
; Остаток от деления на единицу даст дробную часть.
        fprem                          ;  0.25  1    73.25 ...
; Если вычесть её из исходного числа, получится целая часть.
        fsub    st(2), st              ;  0.25  1    73    ...
        fxch    st(2)                  ; 73     1     0.25 ...
; Сначала поработаем с целой частью. Считать количество цифр будем в CX.
        xor     cx, cx
; Поделим целую часть на десять,
@of2:   fidiv   word ptr [bp - 2]      ;  7.3   1     0.25 ...
        fxch    st(1)                  ;  1     7.3   0.25 ...
        fld     st(1)                  ;  7.3   1     7.3   0.25 ...
; отделим дробную часть - очередную справа цифру целой части исходного числа,-
        fprem                          ;  0.3   1     7.3   0.25 ...
; от чатсного оставим только целую часть
        fsub    st(2), st              ;  0.3   1     7     0.25 ...
; и сохраним цифру
        fimul   word ptr [bp - 2]      ;  3     1     7     0.25 ...
        fistp   word ptr [bp - 4]      ;  1     7     0.25 ...
        inc     cx
; в стэке.
        push    word ptr [bp - 4]
        fxch    st(1)                  ;  7     1     0.25 ...
; Так будем повторять, пока от целой части не останется ноль.
        ftst
        fstsw   ax
        sahf
        jnz     short @of2
; Теперь выведем её.
        mov     ah, 02h
@of3:   pop     dx
; Вытаскиваем очередную цифру, переводим её в символ и выводим.
        add     dl, 30h
        int     21h
; И так, пока не выведем все цифры.
        loop    @of3                   ;  0     1     0.25 ...
; Итак, теперь возьмёмся за дробную часть, для начала проверив её существование.
        fstp    st(0)                  ;  1     0.25 ...
        fxch    st(1)                  ;  0.25  1    ...
        ftst
        fstsw   ax
        sahf
        jz      short @of5
; Если она всё-таки ненулевая, выведем точку
        mov     ah, 02h
        mov     dl, '.'
        int     21h
; и не более шести цифр дробной части.
        mov     cx, 6
; Помножим дрообную часть на десять,
@of4:   fimul   word ptr [bp - 2]      ;  2.5   1    ...
        fxch    st(1)                  ;  1     2.5  ...
        fld     st(1)                  ;  2.5   1     2.5  ...
; отделим целую часть - очередную слева цифру дробной части исходного числа,-
        fprem                          ;  0.5   1     2.5  ...
; оставим от произведения лишь дробную часть,
        fsub    st(2), st              ;  0.5   1     2    ...
        fxch    st(2)                  ;  2     1     0.5  ...
; сохраним полученную цифру во временной ячейке
        fistp   word ptr [bp - 4]      ;  1     0.5  ...
; и сразу выведем.
        mov     ah, 02h
        mov     dl, [bp - 4]
        add     dl, 30h
        int     21h
; Теперь, если остаток дробной части ненулевой
        fxch    st(1)                  ;  0.5   1    ...
        ftst
        fstsw   ax
        sahf
; и мы вывели менее шести цифр, продолжим.
        loopnz  @of4                   ;  0     1    ...
; Итак, число выведено. Осталось убрать мусор из стэка.
@of5:   fstp    st(0)                  ;  1     ...
        fstp    st(0)                  ;  ...
; Точнее, стэков.
        leave
        pop     dx
        pop     cx
        pop     ax
        ret
outfloat endp
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 16.07.2011, 01:29   #6
TRIZER
Студент
Пользователь
 
Аватар для TRIZER
 
Регистрация: 13.11.2009
Сообщений: 65
По умолчанию

Ulex, я об этом думал но, fprem по идее должен дать остаток что то вроде 0.xxxxx
а нужно что бы число было целое. Я точно не знаю, но по логике так ибо как тогда получается что при вычитании получившегося остатка из исходного числа получается целая часть исходного числа? (я буду рад если неправ ).
P.S. Наверное я недостаточно уточнил задание.

alexcoder, да я видел этот код но мне изначально требовалось не совсем это мне нужно бвыло в результате получить что то вроде того что предложил Ulex, но в принципе предложенный вами вариант мне пригодится.

А вообще дело в том, что я пишу программу для колибри ос и есть системная функция для вывода числа в трех системах счисления на экран, но выводить в виде десятичной дроби шестнадцатеричное число у меня планов нет , так что мне будет достаточно получения целой части из выводимого числа. А в десятичной системе счисления буду использовать код предложенный alexcoder'ом. Так что всем спасибо, проблема вроде бы решена.
TRIZER вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать дробную часть prod87 Общие вопросы Delphi 6 15.06.2010 06:57
Как разбить число на цифрыКак разбить число на цифры: 3241 => 3,2,4,1 (Pascal) Banderas123 Помощь студентам 3 07.12.2009 18:26
как отбросить целую часть оставив дробную Alex26RusLink Паскаль, Turbo Pascal, PascalABC.NET 1 24.10.2009 11:36
вывести на печать целую часть от деления Alex61 Помощь студентам 1 10.06.2009 11:33
Как выделить целую часть из числа? Slash Общие вопросы Delphi 3 11.05.2007 00:53