打印
[技术相关]

floor函数是如何实现的,你不知道吧?

[复制链接]
638|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
floor() 函数是向下取整的函数,它返回小于或等于参数 x 的最大整数值。在 C 语言的头文件 math.h 中,floor() 函数通常是使用 CPU 指令实现的,因此其具体实现方式会因编译器和计算机体系结构的不同而有所不同。

在 x86 架构的计算机上,floor() 函数通常使用 FPU(浮点处理器)的指令实现。例如,可以使用 FLD 指令将 x 的值压入浮点栈,然后使用 FSTCW 指令保存浮点控制字,再使用 FLDCW 指令将浮点控制字中的控制位设为向下舍入,并使用 FRNDINT 指令将栈顶的浮点数转换为整数值并将其存储在内存中。具体的汇编代码如下:
fld x        ; 将 x 压入浮点栈
fstcw temp   ; 保存浮点控制字
mov ah, temp ; 复制控制字到 ah 寄存器
and ah, 0xF3 ; 将控制字中的 Rounding Control 字段设为向下舍入
mov temp, ah ; 将修改后的控制字写回 temp 变量
fldcw temp   ; 装载新的浮点控制字
frndint      ; 将栈顶浮点数转换为整数并存储
需要注意的是,由于 FPU 的指令是针对浮点数进行优化的,因此使用 FPU 指令实现 floor() 函数的效率通常很高。但是在一些嵌入式系统中,可能没有 FPU 或者 FPU 的性能比较低,此时可以考虑使用其他的实现方式,例如将浮点数转换为整数后再进行操作。
在 51 单片机上,由于其没有 FPU,因此无法使用 FPU 指令实现 floor() 函数。一种常见的方法是将浮点数转换为整数,然后再进行操作。

以下是一种基于这种方法的 floor() 函数实现示例:
double floor(double x) {
    int i = (int)x;  // 将 x 转换为整数
    return (double)i;  // 返回整数值
}
这种实现方式会将浮点数转换为整数,直接舍去小数部分,得到最接近小于等于原数的整数。需要注意的是,这种实现方式并不能保证对所有输入值都能得到正确的结果,因为在将浮点数转换为整数的过程中可能会出现精度误差。因此,在实际使用时需要根据具体情况进行测试和验证。





使用特权

评论回复

相关帖子

沙发
天灵灵地灵灵|  楼主 | 2023-4-24 14:04 | 只看该作者
在 ARM 单片机上,可以使用硬件浮点单元(FPU)来实现 floor() 函数,这样可以大大提高运算速度。ARM Cortex-M 系列处理器通常都内置了 FPU,因此可以直接使用。

以下是一种使用 FPU 指令实现 floor() 函数的示例:
#include <math.h>

float floor(float x) {
    float result;
    asm volatile (
        "vcvtas.f32.f32 %0, %1 \n"  // FPU 指令,将浮点数舍入为整数
        : "=t" (result)            // 输出操作数
        : "t" (x)                  // 输入操作数
    );
    return result;
}
在上述代码中,使用了 ARM 的内联汇编语法来嵌入 FPU 指令。vcvtas.f32.f32 指令将浮点数舍入为整数,并将结果保存在输出操作数 %0 中。输入操作数 %1 是原始浮点数 x。

需要注意的是,由于 FPU 的指令是针对浮点数进行优化的,因此使用 FPU 指令实现 floor() 函数的效率通常很高。但是在一些嵌入式系统中,可能没有 FPU 或者 FPU 的性能比较低,此时可以考虑使用其他的实现方式,例如将浮点数转换为整数后再进行操作。

使用特权

评论回复
板凳
tpgf| | 2023-5-10 16:47 | 只看该作者
floor() 方法执行的是向下取整计算,它返回的是小于或等于函数参数,并且与之最接近的整数。

使用特权

评论回复
地板
qcliu| | 2023-5-10 17:20 | 只看该作者
在C语言的库函数中,floor函数的语法如下 :

#include <math.h>

double floor( double arg );

功能: 函数返回参数不大于arg的最大整数。

使用特权

评论回复
5
caigang13| | 2023-5-10 18:09 | 只看该作者
确实容易疏忽,可能大多数都是简单粗暴的调用强制转换类型。

使用特权

评论回复
6
drer| | 2023-5-11 08:06 | 只看该作者
FLOOR(Number,Significance)参数:Number为要舍入的某一数值,Significance为该数值的倍数

使用特权

评论回复
7
coshi| | 2023-5-11 08:26 | 只看该作者
不光是单片机,很多工具上都有这个floor函数,比如excel

使用特权

评论回复
8
kxsi| | 2023-5-11 10:57 | 只看该作者
>> x = [3+4i 6-7i 9+11i 1-4i 3.4-4.5i 90.67-123i]

x =

   1.0e+02 *

  Columns 1 through 5

   0.0300 + 0.0400i   0.0600 - 0.0700i   0.0900 + 0.1100i   0.0100 - 0.0400i   0.0340 - 0.0450i

  Column 6

   0.9067 - 1.2300i

>> y = floor(x)

y =

   1.0e+02 *

  Columns 1 through 5

   0.0300 + 0.0400i   0.0600 - 0.0700i   0.0900 + 0.1100i   0.0100 - 0.0400i   0.0300 - 0.0500i

  Column 6

   0.9000 - 1.2300i

使用特权

评论回复
9
wiba| | 2023-5-11 11:11 | 只看该作者
y = floor(x) 函数将x中元素取整,值y为不大于本身的最大整数。对于复数,分别对实部和虚部取整

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

3392

帖子

13

粉丝