double型除以int型的数据,可以通过移位的方法提升效率吗
不可以。浮点整数值存储方式与int型不一样(参见IEEE754),它的运算需要经过1.小数点对齐 2.运算 3.小数点移位三个步骤。其中只有第二点是有可能可以通过移位进行运算优化的。但是这三个步骤是被硬件实现在ALU中的FPU(float-point processing unit)里,不能拆开使用,故不能通过移位提升效率。 当然了,如果人工模拟第1和第3个步骤,是可以优化第二点的,但是性能上得不偿失。
■网友
问得好! 可以! 基于10的费点劲,但是如果你保证肯定是基于2的,那么://请注意p2Value是2^n的那个n,例如要除以8,p2Value应该为3而不是8double divPwr2(double input,__int16 p2Value){\tp2Value=https://www.zhihu.com/api/v4/questions/19986991/p2Value/u0026lt;/u0026lt;4; //前进4位/t( (__int16*)/u0026amp;input)-=p2Value;/treturn input;}
一条16bit减法就ok了,一些边界条件没考虑,例如符号位溢出之类的,但不是问题.弄点p2Value弄小点儿的数没问题.下面说一下原理,大多数和2有关的浮点bit trick都是这么实现的:ieee,double类型浮点数的存储方式是指数A和尾数B,即以
的形式存储,对这种形式存储的值,如果我们要对它除以2的指数:
显然直接等于: 【double型除以int型的数据,可以通过移位的方法提升效率吗】
也就是说,我们根本不用做除法,只需要对指数位进行加减法就可以实现除法.然后,对于ieee标准double类型,尾数B以整型形式存储在前52位上,指数A以带偏差值的整型存储在51-62位上,63位为符号位.显然符号位和尾数我们不能修改,那么看代码中的:( (__int16*)\u0026amp;input)
我们取input这个double类型的头16位数进行计算,当然正好取指数位那11位最安全可是x86没有11位运算哈, 当我们取这个double最头儿的16位时,最高位符号位不能动,后面是15位中其中4位是尾数B的前四位也不能动,所以我们有个对"p2Value=https://www.zhihu.com/api/v4/questions/19986991/p2Value/u0026lt;/u0026lt;4;" 前进4位的操作,然后剩下的,一个16位减法完事了.另外吐槽一下让我深恶痛绝的那句“过早进行优化是产生垃圾代码的根源。”这句话简直成了专写低效代码的程序员的盾牌了.以前公司的小子还把这话打印出来贴白板上,我们是搞算法的公司啊不优化等死呢?!?!? 反正以我的经验来看,"在适当的时候进行优化是好程序员代码跑的比坏程序员快的根源。”
■网友
其实是可以的。浮点数的表示形式,从高到低,Bit0-22小数部分,Bit23-30指数部分,Bit31是符号位。如果除数是2的整数幂,直接对指数部分进行位操作即可。双精度应当也类似。但效率未必有硬件实现高。
■网友
用C的实现,Mac OS X, SPARC, PowerPC 测试通过但是速度跟直接乘是一样一样的啊..typedef union { double d; uint64_t i;} ZHDouble;double floatMul(double d_input, int64_t bit) { const uint64_t mask = 0x7FF0000000000000; ZHDouble input; input.d = d_input; uint64_t e = input.i \u0026amp; mask; uint64_t base = input.i \u0026amp; (~mask); e += (bit \u0026lt;\u0026lt; 52); e \u0026amp;= mask; ZHDouble output; output.i = e | base; return output.d;}
■网友
我觉着不行。double,float的表示方法和int, char, long等的表示方法不一样。参见ieee 754
推荐阅读
- 在dribble和Pinterest等设计师网站上有哪些不得不关注的设计大神
- Numpy中的『using a non-integer number…』警告该怎样处理
- strawberryperl,执行print命令时,显示“无法初始化设备PRN\"是咋回事呢
- 花瓣网和 Pinterest 在使用上有啥不同,Pinterest 采集工具咋添加到浏览器上
- 为啥C语言没有直接支持二进制数
- 玩游戏是amd的显卡好还是intel的显卡好
- Intel 寄存器命名规则是啥
- 二叉树代码bug
- css的animation,jquery的animation()和setInterval制作动画区别
- java中int转换为byte越界后的原理是怎么样的