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

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

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个时钟周期。

### 回答1: trunc()函数C语言math.h库自带的一个函数函数的作用是截取一个浮点数的整数部分。 其标准源代码如下: ```c #include <math.h> double trunc(double x); ``` 这是一个非常简单的函数,只需要一个参数即可完成整数部分的截取操作。 具体实现细节如下: ```c double trunc(double x) { if (x < 0) { // 对于负数,向下取整的结果应该为比当前值小的最大的整数 return ceil(x); } else { // 对于正数,向下取整的结果应该为比当前值小的最小的整数 return floor(x); } } ``` 这里使用了C语言math.h库的两个函数:ceil()和floor(),分别用于向上取整和向下取整。 需要注意的是,如果x是正数的话,向下取整的结果应该是比x小的最小整数,而不是比x小的最接近的整数。这一点需要特别注意。 总体来说,trunc()函数虽然非常简单,但是在数值计算却是一个非常常用的函数。 ### 回答2: trunc函数C语言标准库的数学函数,用于将浮点数向零取整,即舍弃小数部分,只保留整数部分。其源代码如下: ```c double trunc(double x) { if (isnan(x)) return x; if (x == 0.0) return x; if (ceil(x) == x && x < 0.0) return x; return (x < 0.0) ? ceil(x) : floor(x); } ``` 函数接受一个浮点数x作为参数,返回一个双精度浮点数。该函数的实现分为四个步骤: 1. 如果x是NaN(不是数字),则函数直接返回x。 2. 如果x等于0.0(零),则函数直接返回x。 3. 如果x的向上取整等于x且x小于零,则函数直接返回x。这是为了处理一些浮点数可能存在的精度误差问题。 4. 否则,函数利用内置的取整函数ceil和floor将x向上取整或者向下取整,从而实现将x向零取整的效果。如果x小于零,则向上取整;否则向下取整。 上述代码使用了浮点数比较时的一些技巧,如不直接使用==运算符判断两个浮点数是否相等,而是使用ceil函数。这是因为浮点数在计算机内部采用二进制表示,存在精度问题,直接进行比较可能会失败。因此,在实现数学函数时必须考虑这些特殊情况。 ### 回答3: C语言的标准trunc函数的源码如下: ```c #include <math.h> double trunc(double x) { if (isnan(x) || isinf(x)) { return x; } double integer_part; modf(x, &integer_part); return integer_part; } ``` trunc函数需要引用math.h头文件,它的作用是将一个double类型的数值x截取为整数部分。如果x为NaN(not a number)或者无穷大(infinity),那么直接返回x,否则调用modf函数截取整数部分并返回。在实现,调用了modf函数,它的作用是将一个double类型的数值分解为整数部分和小数部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值