【FLOOR函数的标量实现】
cmath
文章目录
- 一、FLOOR简介
- 二、算法
- 1.标量源码
- 代码解读(大致实现原理):
- 向量化
一、FLOOR简介
floor函数,其功能是“向下取整”,或者说“向下舍入”、“向零取舍”,即取不大于x的最大整数,与“四舍五入”不同,下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个整数值。
二、算法
1.标量源码
#include "math.h"
#include "math_private.h"
static const float huge = 1.0e30;
float
floorf(float x)
{int32_t i0,j0;u_int32_t i;GET_FLOAT_WORD(i0,x);j0 = ((i0>>23)&0xff)-0x7f;if(j0<23) {if(j0<0) { /* raise inexact if x != 0 */if(huge+x>(float)0.0) {/* return 0*sign(x) if |x|<1 */if(i0>=0) {i0=0;}else if((i0&0x7fffffff)!=0){ i0=0xbf800000;}}} else {i = (0x007fffff)>>j0;if((i0&i)==0) return x; /* x is integral */if(huge+x>(float)0.0) { /* raise inexact flag */if(i0<0) i0 += (0x00800000)>>j0;i0 &= (~i);}}} else {if(j0==0x80) return x+x; /* inf or NaN */else return x; /* x is integral */}SET_FLOAT_WORD(x,i0);return x;
}
代码解读(大致实现原理):
首先我们需要对传入的浮点数x做一个取阶码exp运算,这里需要了解IEEE754浮点数标准,即第一位符号位,接8位指数位,接23位尾数位,那么取阶码就是右移23位后,和0xff做一个&运算,再减掉偏置值就可以得到真值j0了。
然后对真值进行范围判断,先看最简单的两种情况,x在(0,1)区间内都返回0;在(-1,0)区间内返回-1。此时j0 是小于0的。
然后在j0在(0,23)内时,做一个对0x007fffff右移j0位的运算,这里之前我不太明白,发现这个数字是符号位和指数位全为0,尾数位全为1。如果x是整数(integer),那么0x007fffff右移j0位后,再与x的浮点数形式做&运算,结果必然是0(这里要知道前面符号位和指数位肯定是0,因为你和0做的&),那也就是说尾数位全0,为什么?因为整数啊,如果移完后尾数不为0那么结果肯定就不为0,那说明小数点后有非零数存在那就不是整数了。
在x<0时,x先加一下对0x00800000右移j0位后的结果,再与~i(就是尾数全0,符号位和指数位全1)做&运算。这个自己可以举个例子就搞明白了,比如-1.5,即为1011 1111 1100 0000 0000……
加完后得到1100 0000 0100 0000 0000…… 再和~i做个&运算,得到1100 0000 0100 0000……就是-2,没问题。
NAN和INF比较容易看出,真值为128那说明指数位全1了,返回x本身就行。
向量化
【FLOOR函数的标量实现】相关推荐
- [20180602]函数与标量子查询3.txt
[20180602]函数与标量子查询3.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查询 ...
- sql server表值函数与标量值函数实际应用
sql中的表值函数与标量值函数区别与用法 一 .表值函数又分为内联函数与多语句函数 (1)内联函数就是没有函数主体表是单个 SELECT. 下面是一个不带输入参数的表值函数 create functi ...
- Sass函数-数字函数-floor()函数
floor() 函数刚好与 ceil() 函数功能相反,其主要将一个数去除其小数部分,并且不做任何的进位.也就是只做舍,不做入的计算: >> floor(2.1) 2 >> f ...
- 20180601]函数与标量子查询2.txt
[20180601]函数与标量子查询2.txt --//昨天看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查询 ...
- [20180626]函数与标量子查询14.txt
[20180626]函数与标量子查询14.txt --//前面看http://www.cnblogs.com/kerrycode/p/9099507.html链接,里面提到: 通俗来将,当使用标量子查 ...
- mysql中floor函数的作用是什么?
需求描述: 最近写mysql程序的时候,使用了floor函数,在此记录下该函数的作用 操作过程: 1.使用floor函数的测试 mysql> select floor(1.23),floor(- ...
- matlab2c使用c++实现matlab函数系列教程-floor函数
全栈工程师开发手册 (作者:栾鹏) matlab2c动态链接库下载 matlab库函数大全 matlab2c基础教程 matlab2c开发全解教程 matlab2c调用方法: 1.下载动态链接库 2. ...
- c++ floor 赋值_C++之floor函数
今天在清华大学出版社出版的<c++程序设计基础教程>中,看到一个简单的小程序.它是一个关于银行账户管理的小程序.先不急看代码,首先需要弄清银行是如何结算利息的.如果给定的条件是按照年利率的 ...
- python中floor的用法_Python floor() 函数 - Python 教程 - 自强学堂
Python floor() 函数 描述 floor() 返回数字的下舍整数. 语法 以下是 floor() 方法的语法:import math math.floor( x ) 注意:floor()是 ...
最新文章
- mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...
- “智慧血联网平台”亮相军民融合技术装备博览会
- 视觉SLAM如何基于深度学习闭环检测?
- 99%高精度、毫秒级延迟,AI便携式神经假肢让截肢14年患者运动自如
- BCH区块链上启动新应用程序Chainfeed
- Python标准库01 正则表达式 (re包)
- 图解net use 命令使用示例
- ajax 微信code获取_获取链接的参数,判断是否是微信打开,ajax获取数据
- java反射回调函数_java回调函数
- 在线2-36进制转文本工具
- 数据挖掘第三版课后习题
- 一元线性回归(R语言)
- 如何压缩tiff图片?tif图片太大了怎么压缩?
- php7.4 ffi,PHP7.4中FFI的介绍(代码示例)
- 【迁移学习】STL(Stratified Transfer Learning)小结
- Jenkins未授权访问
- Cisco Packet Tracer 网络系统工程实训大作业【附网络拓扑图】
- jmeter--参数化--详解
- 问题 G: 流连人间的苏苏
- 单片机c语言中tbb,STM32学习之路入门篇之指令集及cortex——m3的存储系统