c - 舍入为整数 - 舍入控制字段?

标签 c assembly

我正在尝试编写一个名为 roundD 的函数,它根据第二个参数指定的模式将其第一个参数四舍五入为整数值。

我将使用 gcc 的内联汇编器以汇编语言编写函数。我不想使用任何预定义的功能..

我想我需要根据第二个参数设置 FPU 控制字的舍入控制字段?我还认为我需要在 roundD 返回之前恢复舍入控制字段的原始值?

我想弄清楚我应该如何以正确的顺序完成它..

我应该使用 FPU 的控制字吗?

  1. 我是否将值加载到 FPU 中?
  2. 使用控制字 - BIT FIELDS 进行计算?

例如:RC 字段(位 11 和 10)或舍入控制决定 FPU 如何舍入结果。

有人可以举例说明我将如何使用 RC 字段吗? 还是我偏离了我需要做的事情?

我要离开这个页面.. http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm

这是一个好的页面吗? 我还需要谷歌什么信息吗? 任何帮助深表感谢.. 我想我只需要详 segmentation 析实现此目标所需采取的步骤..

这是我目前所拥有的..

#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;
}

最佳答案

您是否检查过您的环境是否包含改进的 C99 浮点支持? C99 定义了函数fegetround()fesetround() 来获取和设置当前的 float 舍入模式。然后可以使用 rint() 函数根据当前舍入模式进行舍入。

关于c - 舍入为整数 - 舍入控制字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218954/

相关文章:

assembly - ARM中的CMP和TST指令有什么区别?

c++ - 在当前机器上使用主机名

assembly - Tasm 找不到包含文件

assembly - MASM 代码的 NASM 等效项

assembly - 将 ARMv8 Crypto 加速的 SHA256 集成到现有的 C 实现函数中

c++ - 与C++和汇编相关,什么是ebp+8?

c - 获取结构深处的数据 C

C - 单引号与双引号

c:使用 PCG 实现生成随机数

c++ - 从大文件中读取格式化数据的最有效方法是什么?