Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразования


Автор: Евгенний 9.11.2004, 06:44
Как преобразовать из строки (шестнадцатеричная запись) в число одинарной точности.
48 - E1 - 19 - 87 преобразовать в 76,94.
85 - EB - 7B - 86 преобразовать в 62,98.
AE - 47 - 2C - 87 преобразовать в 86,14.
52 - B8 - OA – 87 преобразовать в 69,36.
Заранее благодарю.

Автор: shedon 9.11.2004, 09:08
А что такое
Цитата
48 - E1 - 19 - 87
число с плавающей точкой в формате IEEE Single-precision Floating-point Data Format Standart 754/854 ???
если да, то переводишь число в дес. вид и делаешь, что-то наподобие след. кода
Код

char s[] = "1222711687";
DWORD dw =atoi(s);
float f=0;
memcpy(&f, &dw, 4);

Автор: Евгенний 9.11.2004, 12:44
Переделываю программу, написанную на японском языке программирования BASIC(86), там есть такая функция MKS - преобразовывает числа одинарной точности (76,94; 62,98; 86,14; 69,36) в строку.
Как называется данный формат чисел не знаю. Хотя именно это и требуется узнать. Понять технологию преобразования из шестнадцатеричной записи(двоичной) в обычное число с плавающей точкой (где храниться экспонента, а где мантисса).

Искренне надеюсь на помощь.
Добавлено @ 12:47
Предложенный вариант не срабатывает

Автор: shedon 9.11.2004, 13:22
да вроде должно работать, попробуй тогда так 3,14 в формате IEEE выглядит так 1078523331dec или 40 48 F5 C3 в hex, вот на выходе f будет равно 3.14
Код

   char s[] = "1078523331";
   DWORD dw =atoi(s);
   float f=0;
__asm
{
 lea edx, dw
 lea eax, f
 mov ecx, dword ptr[edx]
 mov dword ptr[eax], ecx
}

а что именно не работает, неправильно преобразовывает ?

Автор: Евгенний 10.11.2004, 12:56
C 3.14 все работает, а с 86,14(AE - 47 - 2C - 87 в десятеричной системе “174 71 44 135”), не получается( другой формат).
В QBasice есть функция CVSMBF она преобразует верно, но я не знаю как её сделать средствами С++ или Delphi.

Автор: shedon 10.11.2004, 13:46
Цитата
86,14(AE - 47 - 2C - 87 в десятеричной системе “174 71 44 135”)

А это от того, что 86,14 = { ae 47 ac 42 }, т.е. 0x42ac47ae;
и если написать след. код:
Код

   DWORD dw = 0x42ac47ae;
   float f=0;
   __asm
   {
          lea edx, dw
          lea eax, f
          mov ecx, dword ptr[edx]
          mov dword ptr[eax], ecx
   }

то как раз и получим в f=86.14

Автор: Adil' 10.11.2004, 15:48
shedon, а зачем ты memcpy и _asm используешь? можно же так :
Код
DWORD dw = 0x42ac47ae;
  float f=*(float*)&dw;


Автор: shedon 10.11.2004, 16:34
Adil' , можно не спорю, просто как-то не подумал... smile

Автор: Евгенний 11.11.2004, 05:44
Наверное, я неправильно объяснил нужно именно из AE - 47 - 2C – 87 получить 86,14. Т. е. имеем файл с числами 48 - E1 - 19 - 87 ; 85 - EB - 7B - 86 ; AE - 47 - 2C - 87 ; 52 - B8 - OA – 87 их нужно преобразовать в 76,94; 62,98; 86,14; 69,36 соответственно.
Из формата MS BINARY в IEE.
Добавлено @ 05:53
А то что на счет _asm, то это только лучше (можно только на нем)

Автор: shedon 11.11.2004, 08:40
http://community.borland.com/article/0,1410,16431,00.html

Автор: Евгенний 11.11.2004, 12:31
Спасибо Shedon.
Почерпнул много нового.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)