С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108

Преобразовать целое число в формат с плавающей запятой

18.08.2018, 16:57. Показов 5921. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С помощью какой команды (или набором команд) сопроцессора
можно представить обычное число как число с плавающей точкой
например просто число - 436 (436)
программно представить как число с плавающей точкой - 436.0 (1138360320)

например это можно сделать вот так


Assembler
1
2
3
4
5
6
7
8
9
10
11
.data
Real qword 0
.data?
Temp dword ?
.code
 
mov edx,436
cvtsi2sd xmm0,edx
addsd xmm0,Real[edx*8]
cvtsd2ss xmm0,xmm0
movss Temp,xmm0

в переменной (Temp) будет число - 1138360320 (436.0)

А можно например тоже самое сделать как нибудь попроще

Кто в теме подскажите пожалуйста
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2018, 16:57
Ответы с готовыми решениями:

Каким образом число с плавающей запятой разделить на целое?
Не могу разобраться, как мне число с плавающей запятой, которое записано в строковую переменную. Перевести в дробное значение и затем...

Как разделить целое число Int64 на целое 1024 и получить double с 2 знаками после запятой
Int64 chislo=1234567890; double chislo2=chislo/1024; label1->Text=Convert::ToString(Math::Round(chislo2,2)) chislo2 всегда...

Число с плавающей запятой
Число 0,084 в десятичной системе представить в двоичной системе счисления с плавающей запятой . Np=5 это порядок, а Nm=16 это мантисса....

11
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
18.08.2018, 17:36
Лучший ответ Сообщение было отмечено assch1 как решение

Решение

Извини, assch1, почему-то показалось, что требуется перевести вещественное число в строку, но потом перечитал задание
С помощью какой команды (или набором команд) сопроцессора можно представить обычное число как число с плавающей точкой например просто число - 436 (436) программно представить как число с плавающей точкой - 436.0
, тут две команды
Assembler
1
2
fild [integer]; 436
fstp [float]; 436.0
или так
Assembler
1
2
3
4
push 436
fild dword ptr [esp]
fstp dword ptr [esp]
pop eax; eax=436.0
3
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
18.08.2018, 18:47  [ТС]
Большое спасибо Mikl

Добавлено через 21 минуту
Ради интереса Mikl что можно сказать по поводу скорости
Верхний многоходовый алгоритм я обнаружил когда смотрел один дизасемблированный код программы на C++
Интересно почему компилятор C++ сделал эту многоходовку вместо fild и fstp
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
18.08.2018, 19:00
assch1,
не знаю, наверное, создатели компиляторов при наличии SSE, SSE-2 считают FPU анахронизмом
0
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
18.08.2018, 19:14  [ТС]
Еще раз большое спасибо Mikl
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
19.08.2018, 13:42
assch1,
то же целочисленными командами, на скорую руку, с проверкой знака и нуля
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
    xor ebx,ebx
    mov eax,-436
    or eax,eax
    jz Zerro
    jns @f
    neg eax
    mov ebx,128
@@: bsr ecx,eax
    ror eax,cl
    add eax,ebx
    lea eax,[eax+ecx+126]
    rol eax,23;eax=83DA0000h=-436.0
Zerro:
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
19.08.2018, 14:48
Цитата Сообщение от Mikl___ Посмотреть сообщение
Zerro
Лучше Zorro

Цитата Сообщение от assch1 Посмотреть сообщение
mov edx,436
cvtsi2sd xmm0,edx
addsd xmm0,Real[edx*8]
cvtsd2ss xmm0,xmm0
movss Temp,xmm0
Тут много лишнего, достаточно так.
Для float (dword), SSE:
Assembler
1
2
    cvtsi2ss xmm0,eax
    movd eax,xmm0  ; или movd [float],xmm0
Для double (qword), SSE2:
Assembler
1
2
    cvtsi2sd xmm0,eax
    movq rax,xmm0  ; или movq [double],xmm0
По идее, это должно быть быстрее, чем fild и fstp (особенно учитывая то, что там нужно ещё и предварительно в память писать).
Даже специально в таблицы посмотрел.
Но я сейчас прогнал по тесту скорости, у меня получилось почему-то медленнее аж в 2 раза.

Добавлено через 10 минут
Но это в цикле. Одинокие – примерно так же. С push/pop немного медленнее.
2
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
19.08.2018, 17:23
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
   mov eax,-436
   or eax,eax
   jz Zero
   cdq
   xor eax,edx
   sub eax,edx
   and edx,128
   bsr ecx,eax
   ror eax,cl
   add eax,edx
   lea eax,[eax+ecx+126]
   rol eax,23;eax=83DA0000h=-436.0
Zero: . . .
2
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
19.08.2018, 19:26  [ТС]
Спасибо всем за участие
Если кому интересно то меня интересовал один алгоритм на C++

C++
1
2
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * ( 2.0f * D3DX_PI ) / 1000.0f;
в этом алгоритме меня заинтересовало как перевести
получившиеся число (timeGetTime() % 1000) в число с плавающей точкой
с вашей помощью оказалось что это можно сделать например так:

Assembler
1
2
3
4
5
6
7
8
9
10
11
call timeGetTime
xor edx,edx
mov ecx,1000
div ecx
cvtsi2ss xmm0,edx
movd fAngle,xmm0
movss xmm0,r1         ; 2.0
mulss xmm0,r2         ; 3.141592653   -   D3DX_PI
mulss xmm0,fAngle
divss xmm0,r3         ; 1000.0
movss fAngle,xmm0
или так:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
call timeGetTime
xor edx,edx
mov ecx,1000
div ecx
mov fAngle,edx
fild fAngle
fstp fAngle
movss xmm0,r1          ; 2.0
mulss xmm0,r2          ; 3.141592653   =   D3DX_PI
mulss xmm0,fAngle
divss xmm0,r3          ; 1000.0
movss fAngle,xmm0
ради интереса протестировал оба кода на скорость исполнения
то есть зациклил код определённое количество раз - (0FFFFFFFh)
первый код показал результат - 4711 (в милисекундах)
второй код показал результат - 5226 (в милисекундах)
оказалось что с (fild и fstp) код работает чуть чуть помедленнее
но этот алгоритм выстроен чисто в лоб
то есть строго соблюден порядок исполнения арифметических действий
если сделать оптимизацию например вместо
последнего деления - divss xmm0,r3 (1000.0)
сделать умножение - mulss xmm0,r3 (0.001)
что как выясняется для данного случая даёт один и тот же результат

Assembler
1
2
3
4
5
6
7
8
9
10
11
call timeGetTime
xor edx,edx
mov ecx,1000
div ecx
cvtsi2ss xmm0,edx
movd fAngle,xmm0
movss xmm0,r1         ; 2.0
mulss xmm0,r2         ; 3.141592653   -   D3DX_PI
mulss xmm0,fAngle
mulss xmm0,r3         ; 0.001
movss fAngle,xmm0
при тестировании на скорость исполнения
этот код показал результат - 4056 (в милисекундах)

не исключаю что можно и ещё по оптимизировать
но впадать в Перфекционизм это уже каждый решает сам
в зависимости от поставленной задачи
2
2622 / 1633 / 266
Регистрация: 19.02.2010
Сообщений: 4,338
19.08.2018, 22:09
assch1, всё равно неэкономично. Без одного сохранения в память будет короче:
Assembler
1
2
3
4
5
6
7
8
9
10
call timeGetTime
xor edx,edx
mov ecx,1000
div ecx
cvtsi2ss xmm0,edx
movss xmm1,r1         ; 2.0
mulss xmm1,r2         ; 3.141592653   -   D3DX_PI
mulss xmm0,xmm1
mulss xmm0,r3         ; 0.001
movss fAngle,xmm0
И произведение констант тоже не надо вычислять - надо взять уже вычисленный вручную результат. Т.е. вместо строки mulss xmm0,xmm1 будет mulss xmm0,r, а две строки перед этой строкой (movss xmm1,r1 и mulss xmm1,r2) исчезнут и не потребуют задействования дополнительного xmm-регистра (xmm1 в моём тутошнем коде).
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6808 / 2048 / 238
Регистрация: 14.12.2014
Сообщений: 4,299
Записей в блоге: 12
19.08.2018, 22:56
А зачем умножать на 2, затем на Пи и делить на 1000, тогда можно просто умножить на 0.00628318530717959 (2*pi/1000) и всё ???
Это же константа!
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
20.08.2018, 05:36
нашел ошибку
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
   mov eax,-436
   or eax,eax
   jz @f
   cdq ; if eax < 0 then edx := -1 else edx := 0
   xor eax,edx
   sub eax,edx; eax := |eax|
   and edx,256; create sign bit
   bsr ecx,eax
   ror eax,cl
   add eax,edx
   lea eax,[eax+ecx+126]
   rol eax,23;eax=0C3DA0000h=-436.0
@@: . . .
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2018, 05:36
Помогаю со студенческими работами здесь

Число с плавающей запятой в строках
Задание - из строки выделить подстроку, задающую число с плавающей точкой.

двоичное число с плавающей запятой
Здравствуйте,дорогие форумчанины! Когда я столкнулся с двоичными числами с плавающей запятой,сначала все шло нормально... Например я...

Не выводит число с плавающей запятой
Добрый день! Испробовал и дабл и флоат, бесполезно, должно по идее выдать 0.5, а выводит 0, что делать? #include &lt;math.h&gt; ...

Дана строка S, изображающая вещественное число в формате с плавающей точкой, и целое число N (N>0)
2. Дана строка S, изображающая вещественное число в формате с плавающей точкой, и целое число N (N&gt;0). Вывести набор символов,...

Целое число вывести, как число с плавающей точкой
Вот код. Нужно вывести значение переменной х не более чем 5 символами. Т.е. надо округлить его до первых 2 цифр и записать, как число с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru