Сейчас на форуме: zds, tyns777, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› FpuFLtoA
Посл.ответ Сообщение


Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 26 декабря 2008 03:12 · Поправил: mak
· Личное сообщение · #1

Опять ночь и опять я Немогу разобратся с функцией FpuFLtoA.

Код такой
Code:
  1. Nums     dword 0FFh dup(?)
  2. ;Nums tbyte 0FFh dup (?)
  3. ;Nums REAL10 0
  4. ;Nums tbyte ?
  5. Probs         tbyte 0FFh dup (?)
  6. Entrops   tbyte 0FFh dup (?)
  7. ------------------------------
  8. lea esi,Probs
  9. lea edi,Nums
  10. lea edx,Entrops
  11. invoke FpuFLtoA,edi,17,addr Buf,SRC1_REAL or SRC2_DIMM
  12. PrintString Buf


как видно , все варианты обозначения буферов обозначал. Всеравно ошибка. В буфере возврат ERROR либо 0. Заране Сэнкс

Правка
FpuFLtoA (
lpSrc1 //pointer to an 80-bit REAL number
lpSrc2 //pointer to, or value of, number of decimal digits to return

lpszDest //pointer to destination of result
uID //ID flags for sources and format
)


uID
One of the SRC1_? flags must be OR'ed with only one of the SRC2_? flags and OR’ed with one of the STR_? flags. (The STR_REG flag does not need to be OR’ed if the string must be returned in decimal format; that is the default.)

uID Flag Meaning

SRC1_FPU Src is already on the FPU
SRC1_REAL Src is a pointer to an 80-bit REAL number

SRC2_DMEM Src2 is a pointer to a 32-bit unsigned integer
SRC2_DIMM Src2 is a 32-bit unsigned integer

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 26 декабря 2008 05:51
· Личное сообщение · #2

www.winasm.net/forum/showtopic=702




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 26 декабря 2008 14:16
· Личное сообщение · #3

Сэнкю , я таких топов переворотил много . и всеравно

Фиг с ним , я убрал лишние движения и оставил основные , но опять подвела функция FpuFLtoA. Это засада какаято.

Код
Code:
  1.          fld tbyte ptr[edx+ecx] 
  2.          faddp st(1),st
  3.          add ecx,10
  4. .endw
  5. invoke FpuFLtoA,0,17,addr Buf,SRC1_FPU or SRC2_DIMM
  6. invoke SetDlgItemText,hDlg,IDC_ENT,addr Buf
  7.          
  8. invoke SetDlgItemText,hDlg,IDC_RES,addr szDone

Здесь в параметрах указано что число уже в сопроцессоре, команда FpuFLtoA возвращает 1 , то есть удачное выполнение , а не 0 , но в буфере появляется не число последнее в регистре СТ0 а нули. А должно быть значение типа 1.3466858585955 примерно. Вывести не получается результат работы

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 24.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 декабря 2008 14:58 · Поправил: GoldFinch
· Личное сообщение · #4

для простого вывода вещественного числа есть
fld [xxx]
fimul [_EightZeros] ;_EightZeros dd 100000000 ;8digits=32/4
fbstp tword [gRealBuf] ; gRealBuf dt ?
wsprintfA(gMsgBuf,"%x.%08x",[gRealBuf+4],[gRealBuf])
SetDlgItemText([hDlg],IDC_ENT,gMsgBuf)
(синтаксис фасма)



Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 26 декабря 2008 16:43
· Личное сообщение · #5

mak
Там главное было:
I found the solution of this problem and found the reason of my problem.
This function converts only normal (simple) float format.
It's bad function.
My advice is to use FloatToStr funcion from masmlib - its much better, as it works with any kind of float.

;)




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 26 декабря 2008 17:30
· Личное сообщение · #6

пепец какой геморой, FloatToStr не понимает переменную с которой нужно перевести число. А эта функция не может забирать сразу с сопроцессора. Пробовал ...всеравно спасибо.

GoldFinch пишет:
для простого вывода вещественного числа есть
fld [xxx]
fimul [_EightZeros] ;_EightZeros dd 100000000 ;8digits=32/4
fbstp tword [gRealBuf] ; gRealBuf dt ?
wsprintfA(gMsgBuf,"%x.%08x",[gRealBuf+4],[gRealBuf])
SetDlgItemText([hDlg],IDC_ENT,gMsgBuf)
(синтаксис фасма)


Если всетаки не добью мой вариант , то попробую так. Принципиально не могу отступить.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 62.5 (постоянный), 2thx
Активность: 0.050
Статус: Участник

Создано: 26 декабря 2008 21:06
· Личное сообщение · #7

Code:
  1. Вот когда-то прогу делал
  2. array_b  db 20 dup (0)
  3. ...
  4. fldz
  5. invoke FpuFLtoA, 0, 4, ADDR array_b, SRC1_FPU or SRC2_DIMM
  6. fstp st(0)
  7. ...
  8.          invoke Half_of_bk,u2,t2
  9.                  invoke Half_of_bk,u1,t1;значение остается в ППЗ
  10.                  fsub
  11.                  fld two
  12.                  fmul
  13.                  fild Period
  14.                  invoke FpuAtoFL, ADDR thousand, 0, DEST_FPU ; ввод тысячи (делителя)
  15.                  fdiv
  16.                  fdiv
  17.                  invoke FpuAtoFL, ADDR array_b, 0, DEST_FPU 
  18.                  fadd
  19.                  invoke FpuFLtoA, 0, 4, ADDR array_b, SRC1_FPU or SRC2_DIMM 
  20.                  ;invoke SetWindowText,hwndEdit1,addr array_b
  21.         fstp st(0); не забыть главное вычистить ППЗ (FPU)





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 26 декабря 2008 21:58
· Личное сообщение · #8

спасибо ... но всеравно , анличане мне тут написали , что да действительно уменьшив значение степени можно выполнить функу FpuFLtoA , тогда числа выводятся отлично , но когда 3.3850714925051991040e-46 .. то тогда нужно что то поменять , сказали типо буфер , но я сказал что число уже в сопроцессоре , и FpuFLtoA берет ооттуда ...

Поидее можно просто урезать ... и это не должно повлиять на степень Энтропии существенно , но хотелось бы точнее. Проблема ясна , как решить не понятно.

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube



 eXeL@B —› Программирование —› FpuFLtoA
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати