【快速浮点除法】用union实现快速除法

//浮点数乘以2,有0判断		//float== 1符号位+8阶码+23尾数
__inline float xmul2f(float d) {
	union {
		float floatval;
		int intval;
	} uflint;
	uflint.floatval = d;
	if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing
		uflint.intval += 1 << 23; // add 1 to the exponent	//先移位再相加,阶码的最小位为第23位,阶码+1相当于乘2
	}
	return uflint.floatval;
}
//浮点数除以2,有0判断
__inline float xdiv2f(float d) {
	union {
		float floatval;
		int intval;
	} uflint;
	uflint.floatval = d;
	if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing
		uflint.intval -= 1 << 23; // sub 1 from the exponent	//先移位再相减,阶码-1相当于除以2
	}
	return uflint.floatval;
}
//浮点数除以任意整数n,有0判断
__inline float xdivf(float d, int n) {
	union {
		float floatval;
		int intval;
	} uflint;
	uflint.floatval = d;
	if (uflint.intval & 0x7FFFFFFF) { // if f==0 do nothing
		uflint.intval -= n << 23; // add n to the exponent
	}
	return uflint.floatval;
}

//双精度浮点数除以2,有0判断
__inline double xdiv2d(double d) {
	union {
		double doubleval;
		int64_t intval;
	} uflint;
	uflint.doubleval = d;
	if (uflint.intval & 0x7FFFFFFFFFFFFFFF) { // if f==0 do nothing
		uflint.intval -= 1 << 52; // sub 1 from the exponent	//先移位再相减,阶码-1相当于除以2
	}
	return uflint.doubleval;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值