Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Научите правильно переводить Float в Hex |
Посл.ответ | Сообщение |
|
Создано: 01 января 2007 06:09 · Личное сообщение · #1 |
|
Создано: 01 января 2007 06:16 · Личное сообщение · #2 |
|
Создано: 01 января 2007 06:36 · Личное сообщение · #3 |
|
Создано: 02 января 2007 14:56 · Личное сообщение · #4 |
|
Создано: 02 января 2007 18:36 · Личное сообщение · #5 |
|
Создано: 02 января 2007 20:03 · Личное сообщение · #6 |
|
Создано: 02 января 2007 22:20 · Личное сообщение · #7 sliderZ пишет: Так что сначала в бинари переводить а потом ужо в hex? Может где лежит готовая функция под C++? Зачем переводить? В статье я перевёл только, чтобы было более наглядно. Составные части можно получить простыми действиями, типа:
Что-то вроде этого. Хотя, если тебя устройство неинтересует, то можно положи это число в регистр сопроцессора, а потом считай его представление в память, команды сейчас не вспомню, но если тебе именно это нужно, то могу глянуть. Кстати в OLLYDasm есть функции: Printfloat10 Printfloat8 Printfloat4 Их тоже следует посмотреть. ![]() |
|
Создано: 02 января 2007 22:37 · Личное сообщение · #8 |
|
Создано: 02 января 2007 22:52 · Личное сообщение · #9 Вот самая общая формула для перевода в любую систему счисления: A(p) = a_(n-1)*p^(n-1) + a_(n-2)*p^(n-2)+...+a_1*p^1 +a_0*p^0 p - основание, а - цифра, n - номер старшего разряда Т.е. мы складываем произведения количественных значений цифр на степени основания, показатели которых равны номерам разрядов, нумерация разрядов идет от нуля. В прошлом посте я очипся, зеркально отображается дробная часть отрицательного числа, нам это не надо. С дробными числами лучше работать каким-нибудь циклом управляющим значением степени, а для дробной части ничего не измениться, обрабатываться все будет также, но с отрицательной степенью. На эту тему очень много литературы написано, думаю, стоит поискать. ![]() |
|
Создано: 03 января 2007 03:04 · Личное сообщение · #10 |
|
Создано: 03 января 2007 04:44 · Личное сообщение · #11 sliderZтогда объясняй точнее, чего хочешь. "перевести float в HEX" можно понять как угодно, потому что эта фраза типа "перевести круглое в красное". например можно так переводить 0.05(значение переменной типа float) -> "0.0ССССС..." (HEX строка) или так "0.05"(строка десятичного числа)-> sscanf в переменную типа float -> прочесть переменную как unsigned int -> "3D4CCCCD" (HEX строка) я так понял, что скорее всего, нужно что-то похожее на то, что делает sscanf? а то может быть у тебя три переменных int a,b,c; // a-целые=0, b-десятые=0, с-сотые=5 нужно представить эквивалент числа abc в float d; ![]() |
|
Создано: 03 января 2007 06:31 · Личное сообщение · #12 sliderZ пишет: У меня без перевода в бинари массив пока не получается. Ну, Nitrogen сказал же, - посмотри справочник команд FPU: http://exelab.ru/f/action=vthread&forum=6&topic=7230 ----- Всем привет, я вернулся ![]() |
|
Создано: 03 января 2007 06:32 · Личное сообщение · #13 sliderZ пишет: Где-то прочитал что надо последовательно умножать на 16 и каждая целая часть будет цифрой hex'a Это правильно для перевода мантиссы. В каждой приличной книжке по программированию в конце описывается формат плавающего числа. Боюсь соврать, но что-то вроде такого. Любое положительное плавающее число представляется в виде m*2**n, где m - мантисса - число в диапазоне 1-1/2, а n - показатель. Далее мантисса переводится именно так, как ты написал. Т.к. первый бит мантиссы равен 1, то он не пишется. Показатель записывается в виде 127+n, т.е. занимает ровно 8 бит. Мантисса 23-бита + бит знака. Где он точно пишется не помню. Для двойной точности - 6 байт мантисса и 2 -порядок И еще - в самом сопроцессоре 80 бит и там что-то похожее на двойную точность. ![]() |
|
Создано: 03 января 2007 07:28 · Поправил: sliderZ · Личное сообщение · #14 ant_manant_man пишет: sliderZтогда объясняй точнее, чего хочешь. "перевести float в HEX" можно понять как угодно, потому что эта фраза типа "перевести круглое в красное". Есть число "0.05", нужна функция переводящая его в "0x3D4CCCCD". Что тут не понятного? Нужно что-то типа W[4Fh]LF пишет: HexFloat = 0x3D4CCCCD; If (HexFloat & 0x80000000) sign = True; Else sign = False; Exp = ((HexFloat & 0x7F800000) >> 23) - 127; Mantissa = HexFloat & 0xFFFFFF; только наоборот. Bitfry Bitfry пишет: Ну, Nitrogen сказал же, - посмотри справочник команд FPU: Так что без __asm вставки никак? tundra37 tundra37 пишет: В каждой приличной книжке по программированию в конце описывается формат плавающего числа Я уже все это прочитал и понял просто не хватает опыта написать на c++ небольшую функцию, которая автоматом переводит float в integer. ![]() |
|
Создано: 03 января 2007 07:34 · Поправил: W[4Fh]LF · Личное сообщение · #15 sliderZ пишет: Так это Hex->Float , а нужно Float->Hex.. В первом сообщении дал тебе ссылку: [url=http://basicproduction.nm.ru/articles/bpdblvb.htm ]http://basicproduction.nm.ru/articles/bpdblvb.htm [/url] Bitfry пишет: Ну, Nitrogen сказал же, - посмотри справочник команд FPU: FPU тут вряд ли поможет, ибо те команды, которые в той теме давали они сохраняют или BCD(команда fbstp), т.е. фактически только целую часть, или округлённое до целого значение из ST(0), команда fistp, такой команды, чтобы взять и выгрузить в память значение с плавающей точкой нет. ![]() |
|
Создано: 03 января 2007 07:45 · Личное сообщение · #16 sliderZ пишет: Я уже все это прочитал и понял просто не хватает опыта написать на c++ небольшую функцию, которая автоматом переводит float в integer. Чё ж ты раньше молчал? Это тебе смекалки нехватает ![]() #include <stdio.h>
>> E:TempСИ>prog.exe Float Value = 0.050000 Hex Value = 0x3d4ccccd E:TempСИ> ![]() |
|
Создано: 03 января 2007 08:31 · Поправил: sliderZ · Личное сообщение · #17 |
|
Создано: 03 января 2007 08:44 · Личное сообщение · #18 |
|
Создано: 03 января 2007 09:22 · Личное сообщение · #19 |
|
Создано: 03 января 2007 10:02 · Личное сообщение · #20 |
|
Создано: 03 января 2007 11:39 · Поправил: sliderZ · Личное сообщение · #21 |
|
Создано: 05 января 2007 13:53 · Личное сообщение · #22 |
|
Создано: 05 января 2007 14:08 · Личное сообщение · #23 cvttsd2si - Convert Scalar Double-Precision Floating-Point Value to Signed Doubleword Integer with Truncation - только с семьи Pentium 4, на ранних процах работать не будет... Напридумывали бл.... Кто видел новую инструкцию, говорят есть уже в пятых пентах: ssbrfidwoeietqbdtbgifag #X - SetSexthBitRegisterFlagIfDoubleWordOfEaxIsEqualToQuadroBufferDueToBill GatesIsFuckenAmericanGuy... ![]() |
![]() |
eXeL@B —› Программирование —› Научите правильно переводить Float в Hex |