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

本文介绍了浮点数乘除法的底层实现方法,通过直接操作浮点数的二进制表示来加速运算过程。文章提供了针对不同情况的内联函数实现,并包含对0值的特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//浮点数乘以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;
}

 

### 单精度浮点数运算规则 单精度浮点数遵循IEEE 754标准,该标准定义了浮点数的表示方式以及算术操作的行为。对于单精度浮点数而言,其结构由三部分组成:1位符号位、8位指数位和23位尾数位。 #### 加法与减法 当执行加法或减法时,两个操作数需先调整到相同的阶码(exponent),即对齐小数点位置。具体过程如下: - 如果两数的指数不同,则较小的那个数要向较大的那个数看齐; - 对于被调整的小数,需要右移相应的位置来补偿指数的增长; - 尾数相加之后可能产生溢出的情况,此时应进行规格化处理并更新指数[^1]。 ```c++ // C++ example for adding two single precision floats #include <iostream> using namespace std; union FloatBits { float f; unsigned int i; }; void add_floats(float a, float b){ union FloatBits fa{a}, fb{b}; // Align exponents and mantissas here... } ``` #### 乘法与除法 在做乘法的时候,直接把两个数的尾数相乘,并将它们各自的指数相加以得到最终的结果;而除法则相反,是通过相除的方式计算新尾数并将分母的指数从分子中扣除获得新的指数值。需要注意的是,在这两种情况下都需要考虑舍入误差的影响。 #### 特殊情况处理 除了正常的数值之外,还需要特别注意一些特殊情况下的行为,比如无穷大(Infinity)、非数字(NaN)等特殊编码形式。这些特殊的编码允许程序能够优雅地处理诸如0/0这样的未定义表达式而不至于崩溃退出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值