读书人

浮点数有没有左移右移的操作?有意义吗

发布时间: 2012-11-05 09:35:12 作者: rapoo

浮点数有没有左移右移的操作?有意义吗?
如题。浮点数有没有快速的乘2幂除2幂的操作?

[解决办法]
浮点数的移位没有意义,因为它的bits都有特殊含义,移位则直接改变本质了。
[解决办法]
浮点数*2只要指数部分+1就行,感觉会很快
没研究过浮点数乘除法
[解决办法]

C/C++ code
就像这个样子:#include <stdio.h>float fltShift( float x , int n ){     int ix = *(int*)&x;          ix += n * 0x00800000;          return *(float*)&ix;     }double dblShift( double x , int n ){    long long llx = *(long long*)&x;        llx += n * 0x0010000000000000LL;        return *(double*)&llx;    }int main(){    printf( "%f\n" , fltShift( 123.456f , -3 ) );    printf( "%f\n" , fltShift( 123.456f , -2 ) );    printf( "%f\n" , fltShift( 123.456f , -1 ) );    printf( "%f\n" , fltShift( 123.456f ,  0 ) );    printf( "%f\n" , fltShift( 123.456f ,  1 ) );    printf( "%f\n" , fltShift( 123.456f ,  2 ) );    printf( "%f\n" , fltShift( 123.456f ,  3 ) );        printf( "%f\n" , dblShift( 123.456  , -3 ) );    printf( "%f\n" , dblShift( 123.456  , -2 ) );    printf( "%f\n" , dblShift( 123.456  , -1 ) );    printf( "%f\n" , dblShift( 123.456  ,  0 ) );    printf( "%f\n" , dblShift( 123.456  ,  1 ) );    printf( "%f\n" , dblShift( 123.456  ,  2 ) );    printf( "%f\n" , dblShift( 123.456  ,  3 ) );            return 0;    }
[解决办法]
左移右移是位操作,不是数学运算
整数左移右移可以当做是乘2除2,但仅仅是“可以当做”,左移右移运算符不是为了让你写数学式更难看而存在的
乘2除2就直接写*/,用什么左移右移啊,除了增加代码难看程度之外没有任何意义

顺便,任何一个好一点的编译器,都能做到优化数学运算,整数的乘2除2几乎可以肯定优化成左移右移(乘5直接优化成一次移2位和一次加法),浮点数也可能优化成指数位增减,这都是编译器的工作范畴,用不着你操心,不允许你操心
写代码姑且不论正确性和功能效率,单单论写法,第一优先的就是可读性,所谓“提高效率”的那点小技巧,在编译器优化面前不值一提
[解决办法]
好奇地看了一下,VS2008编译器的优化只是把 f*2 变成 f+f,呵呵

而浮点运算器内部对此有没有优化呢?

读书人网 >C++

热点推荐