我开发了一种非常快速的截断功能:

double ftrunc( double d )

{

static_assert(sizeof(double) == sizeof(uint64_t), "sizeof(double) not equal to sizeof(uint64_t)");

static_assert(numeric_limits::is_iec559, "double must be IEEE-754");

// assume size_t is our CPU's native register-width

static_assert(sizeof(size_t) == sizeof(uint64_t) || sizeof(size_t) == sizeof(uint32_t), "register-width must be 32 or 64 bit");

if constexpr( sizeof(size_t) == sizeof(uint64_t) )

// we have 64 bit registers

{

unsigned const MANTISSA_BITS = 52,

EXP_BIAS = 0x3FF,

INF_NAN_BASE = 0x7FF;

uint64_t const EXP_MASK = (uint64_t)0x7FF << MANTISSA_BITS,

SIGN_MASK = (uint64_t)0x800 << MANTISSA_BITS ,

MIN_INTEGRAL_DIGITS_EXP = (uint64_t) EXP_BIAS << MANTISSA_BITS,

MIN_INTEGRAL_ONLY_EXP = (uint64_t)(EXP_BIAS + MANTISSA_BITS) << MANTISSA_BITS,

INF_NAN_EXP = (uint64_t)INF_NAN_BASE << MANTISSA_BITS,

NEG_MANTISSA_MASK = 0x000FFFFFFFFFFFFFu;

union

{

double du;

uint64_t dx;

};

du = d;

uint64_t exp = dx & EXP_MASK;

if( exp >= MIN_INTEGRAL_DIGITS_EXP )

// value has integral digits

if( exp < MIN_INTEGRAL_ONLY_EXP )

{

// there are fraction-digits to mask out, mask them

unsigned shift = (unsigned)(exp >> MANTISSA_BITS) - EXP_BIAS;

dx &= ~(NEG_MANTISSA_MASK >> shift);

return du;

}

else

if( exp < INF_NAN_EXP )

// value is integral

return du;

else

// infinite, NaN, SNaN

// raise exception on SNaN if necessary

return du + du;

else

{

// below +/-1.0

// return +/-0.0

dx &= SIGN_MASK;

return du;

}

}

else if constexpr( sizeof(size_t) == sizeof(uint32_t) )

// we have 32 bit registers

{

unsigned const MANTISSA_BITS = 52,

HI_MANTISSA_BITS = 20,

EXP_BIAS = 0x3FF,

INF_NAN_BASE = 0x7FF;

uint32_t const EXP_MASK = (uint32_t)0x7FFu << HI_MANTISSA_BITS,

SIGN_MASK = (uint32_t)0x800u << HI_MANTISSA_BITS,

MIN_INTEGRAL_DIGITS_EXP = (uint32_t) EXP_BIAS << HI_MANTISSA_BITS,

MAX_INTEGRAL32_EXP = (uint32_t)(EXP_BIAS + HI_MANTISSA_BITS) << HI_MANTISSA_BITS,

MIN_INTEGRAL_ONLY_EXP = (uint32_t)(EXP_BIAS + MANTISSA_BITS) << HI_MANTISSA_BITS,

INF_NAN_EXP = (uint32_t)INF_NAN_BASE << HI_MANTISSA_BITS,

NEG_HI_MANTISSA_MASK = 0x000FFFFFu,

NEG_LO_MANTISSA_MASK = 0xFFFFFFFFu;

union

{

double du;

struct

{

uint32_t dxLo;

uint32_t dxHi;

};

};

du = d;

uint32_t exp = dxHi & EXP_MASK;

if( exp >= MIN_INTEGRAL_DIGITS_EXP )

// value has integral digits

if( exp < MIN_INTEGRAL_ONLY_EXP )

// there are fraction-digits to mask out

if( exp <= MAX_INTEGRAL32_EXP )

{

// the fraction digits are in the upper dword, mask them and zero the lower dword

unsigned shift = (unsigned)(exp >> HI_MANTISSA_BITS) - EXP_BIAS;

dxHi &= ~(NEG_HI_MANTISSA_MASK >> shift);

dxLo = 0;

return du;

}

else

{

// the fraction digits are in the lower dword, mask them

unsigned shift = (unsigned)(exp >> HI_MANTISSA_BITS) - EXP_BIAS - HI_MANTISSA_BITS;

dxLo &= ~(NEG_LO_MANTISSA_MASK >> shift);

return du;

}

else

if( exp < INF_NAN_EXP )

// value is integral

return du;

else

// infinite, NaN, SNaN

// raise exception on SNaN if necessary

return du + du;

else

{

// below +/-1.0

// return +/-0.0

dxHi &= SIGN_MASK;

dxLo = 0;

return du;

}

}

}

它比大多数实现要快。在我的Ryzen 7 1800X上,值> = 2 ^ 0和<= 2 ^ 54的平均执行时间为12个时钟周期。

c语言trunc函数是什么意思,C ++中是否有trunc函数?相关推荐

  1. C语言——选择控制结构 寻找中位数v1.0编写一个函数返回三个整数中的中间数。函数原型:int mid(int a, int b, int c);功能是返回a,b,c三数中大小位于中间的一个数。

    寻找中位数v1.0 编写一个函数返回三个整数中的中间数. 函数原型:int mid(int a, int b, int c); 功能是返回a,b,c三数中大小位于中间的一个数. 程序运行结果示例1: ...

  2. matlab如何输出一个函数的图像,在matlab中如何输出一个函数的图像

    点击查看在matlab中如何输出一个函数的图像具体信息 答:A. imread imread函数用于读入各种图像文件,其一般的用法为 [X,MAP]=imread('filename','fmt')其 ...

  3. c语言文件 copyfile,如何在Visual C中正确调用CopyFile函数?

    与所有接受字符串参数的Windows API函数一样,CopyFile函数实际上有两个变体: > CopyFileA是ANSI版本,它在系统的默认字符集中采用窄(非Unicode)字符串.基本上 ...

  4. 函数指针--Nginx和Redis中两种回调函数写法

    1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...

  5. python中求和公式是什么函数_Python的math库中,用于求和的函数是( )。

    [单选题]确定兴利库容 V 兴 ,已知某水库为一回运用水库,其一次蓄水量为 V 1 =300 万 m 3 ,一次供水量为 V 2 =150 万 m 3 . [ ]. [单选题]hAB大于0说明B点的高 ...

  6. java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数

    在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...

  7. keil5函数 默认返回值_Python中如何调用random()函数

    在开始了解之前,我们需要知道random()函数是需要导入模板,才可以进行访问,然后通过调用静态对象来使用这个方法,另外返回生成的随机实数,是有一定的范围.下面正式开始主题介绍: 先给大家带来一列实例 ...

  8. mysql 函数用还是不用_Mysql中日期和时间函数应用不用求人

    Mysql中日期和时间函数应用不用求人 2008-05-23 17:41· 稿源:互联网 TIME_FORMAT(time,format) 这象上面的DATE_FORMAT()函数一样使用,但是for ...

  9. python的lambda函数错误的是_Python 中的 AWS Lambda 函数错误 - AWS Lambda

    Python 中的 AWS Lambda 函数错误 当您的代码引发错误时,Lambda 将生成错误的 JSON 表示形式.此错误文档会出现在调用日志中,对于同步调用,它出现在输出中. 例 lambda ...

  10. python中如何调用函数_如何调用python中的内置函数?(实例解析)

    对于第一次接触到python这门编程语言的朋友来说,刚刚开始学习python编程的时候对于python函数调用这一方面的了解比较少,在这篇文章之中我们就来了解一下python怎么调用函数. Pytho ...

最新文章

  1. Skype for Business Server 2015-06-持久聊天服务器-3-配置
  2. python比较字符串相似度
  3. 移动端界面中的版式设计原理
  4. SAP MM模块相关透明表收集
  5. linux 内核rt,实时操作系统kernel rt
  6. HttpEntity.EMPTY属性代码示例
  7. PAT1006 换个格式输出整数
  8. linux常用操作符,Shell常用操作符总结
  9. 什么样的研究有价值?
  10. 《南明史》txt版本
  11. IIS 7.0与ASP.NET
  12. c语言函数实现顺序线性表,数据结构C语言实现——顺序线性表SqList
  13. Linux 上的NetworkManager示例
  14. python3读取pdf文档;pdfminer3k
  15. VBA学习笔记3-数据结构类型SortedList
  16. 【matplotlib教程】绘图样式,文本线型、轴刻度
  17. 世界经典咖啡@配制方法
  18. 仔细体验,我想从产品设计的角度分析分析微信的声音锁
  19. Python笔记之通过PyWin32模块实现在QQ聊天窗口自动发送消息
  20. 五脏六腑等最喜欢的食物

热门文章

  1. 成都计算机学校分数线,成都市计算机汽车职业技术学校2020年招生录取分数线...
  2. Python+OpenCV:立体图像深度图(Depth Map from Stereo Images)
  3. Halcon 学习总结——基于动态阈值法、GMM(高斯混合模型)、SVM(支持向量机)的网状物缺陷检测
  4. Halcon产品描述
  5. android自定义键盘小数点键,android实现 自定义键盘 keydemo
  6. Centos 虚拟机克隆后eth0网卡打不开
  7. 【杂题总汇】HDU-6406 Taotao Picks Apples
  8. 洛谷 P1137 旅行计划
  9. Intelli IDEA+jdk++maven+tomcat环境配置
  10. 重置gitlab管理员密码