【发布时间】:2010-02-08 00:21:01
【问题描述】:
我正在尝试编写一个名为 roundD 的函数,该函数根据其第二个参数指定的模式将其第一个参数四舍五入为整数值。
我将使用 gcc 的内联汇编器用汇编语言编写函数。我不想使用任何预定义的函数..
我想我需要根据第二个参数来设置 FPU 控制字的舍入控制字段?我也认为我需要在roundD返回之前恢复Rounding Control字段的原始值?
我正在尝试弄清楚我应该如何以正确的顺序完成此操作..
我应该使用 FPU 的控制字吗?
- 我是否将值加载到 FPU 中?
- 使用控制字 - BIT FIELDS 进行计算?
like:RC 字段(位 11 和 10)或舍入控制确定 FPU 如何舍入结果。
谁能给我一个如何使用 RC 字段的例子? 或者我离我需要做的事情还有很长的路要走?p>
我要离开这个页面.. http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm
这是一个不错的页面吗? 我还需要谷歌搜索什么信息? 任何帮助深表感谢.. 我想我只需要详细分析我需要采取的步骤来完成这个..
这就是我目前所拥有的......
#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;
}
【问题讨论】:
-
这里有另一个类似的问题有答案:stackoverflow.com/a/35518449/3857942