Как выполнить нецелочисленное деление с помощью div?
Можно ли как-то поделить например 4 на 5 с помощью div и получить 0.8? Мне сказали что можно, если объединить eax и edx, но либо я делаю что-то не так, либо это не помогает. Я вообще не понимаю как это сделать, если используя div сохраняется только целая часть числа и остаток.Обращался к чатгпт, он не помогает
#include <stdio.h>
int main() {
unsigned int number = 4;
unsigned int result;
unsigned int remainder;
__asm {
mov eax, number
mov edx, eax
shr edx, 16
mov bx, 5
div bx
movzx eax, ax
mov result, eax
mov remainder, edx
}
printf("Result: %u\n", result);
printf("Remainder: %u\n", remainder);
return 0;
}
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
У меня нет подходящего компилятора, поэтому код будет на C.
Требуется вычислить n/m с точностью p знаков после запятой.
- Умножаем n на 10p - после этого деление выдаст нужное количество знаков.
- Добавляем к n половину m - после этого деление будет давать округлённый результат.
- Делим n на m. Получится число в котором нужно отсчитать p знаков справа и напечатать их в качестве дробной части.
#include <stdio.h>
int main() {
unsigned n, m, p;
scanf("%u%u%u", &n, &m, &p);
for (unsigned i = 0; i < p; ++i) {
n *= 10;
}
n += m >> 1;
unsigned q = n / m;
printf("%u\n", q);
}
$ gcc div.c $ echo 355 113 0 | ./a.out 3 $ echo 355 113 1 | ./a.out 31 $ echo 355 113 2 | ./a.out 314 $ echo 355 113 3 | ./a.out 3142 $ echo 355 113 4 | ./a.out 31416 $ echo 355 113 5 | ./a.out 314159 $ echo 355 113 6 | ./a.out 3141593 $ echo 355 113 7 | ./a.out 31415929
Это способ склонен к переполнениям, обычно десятичные дроби печатают по-другому. Зато его легко переложить на ассемблер без использования строк.