Я пытаюсь написать функцию с именем roundD, которая округляет свой первый аргумент до целочисленного значения в соответствии с режимом, указанным во втором аргументе.
Я буду писать функцию на языке ассемблера, используя встроенный ассемблер gcc. Я не хочу использовать какие-либо предопределенные функции ..
Я думаю, мне нужно установить поле управления округлением управляющего слова FPU в соответствии со вторым аргументом ?. Я также думаю, что мне нужно восстановить исходное значение поля управления округлением, прежде чем RoundD вернется?
Я пытаюсь понять, как мне сделать это в правильном порядке ..
Должен ли я использовать управляющее слово FPU?
- Загружаю ли я значение в FPU?
- Использовать контрольное слово - БИТОВЫЕ ПОЛЯ для выполнения расчетов?
like: поле RC (биты 11 и 10) или Rounding Control определяет, как FPU будет округлять результаты.
Может кто-нибудь дать мне пример того, как я бы использовал поля RC?
Или я далеко от базы, что мне нужно сделать?
Я ухожу с этой страницы ..
http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm
это хорошая страница для перехода?
Что еще мне нужно Google для информации?
Любая помощь высоко ценится..
Я думаю, что мне просто нужен подробный анализ шагов, которые мне нужно предпринять, чтобы выполнить это ..
Это то, что я имею до сих пор ..
#include <stdio.h>
#include <stdlib.h>
#define PRECISION 3
#define RND_CTL_BIT_SHIFT 10
// floating point rounding modes: IA-32 Manual, Vol. 1, p. 4-20
typedef enum {
ROUND_NEAREST_EVEN = 0 << RND_CTL_BIT_SHIFT,
ROUND_MINUS_INF = 1 << RND_CTL_BIT_SHIFT,
ROUND_PLUS_INF = 2 << RND_CTL_BIT_SHIFT,
ROUND_TOWARD_ZERO = 3 << RND_CTL_BIT_SHIFT
} RoundingMode;
double roundD (double n, RoundingMode roundingMode)
{
return n;
}
int main (int argc, char **argv)
{
double n = 0.0;
printf("Rounding - Assembly");
if (argc > 1)
n = atof(argv[1]);
printf("roundD even %.*f = %.*f\n",
PRECISION, n, PRECISION, roundD(n, ROUND_NEAREST_EVEN));
printf("roundD down %.*f = %.*f\n",
PRECISION, n, PRECISION, roundD(n, ROUND_MINUS_INF));
printf("roundD up %.*f = %.*f\n",
PRECISION, n, PRECISION, roundD(n, ROUND_PLUS_INF));
printf("roundD zero %.*f = %.*f\n",
PRECISION, n, PRECISION, roundD(n, ROUND_TOWARD_ZERO));
return 0;
}