浮点型转换整型的快速方法介绍
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
浮点型转换整型的快速方法 浮点型转换整型是计算机图形运算中一个常见的操作,例如在图像的光栅化阶段,就要执行大量的类型转换,以便将浮点数表示的坐标转化为整数表示的屏幕坐标。为了提高转换的速度,需要使用特殊的方法来实现浮点型到整型的转换。 强制类型转换是最简单的方法,即使用 C 语言的强制类型转换语句将浮点数转换为整数,如:`int_val = (int)float_val;`。然而,这种方法有一个缺点,即它严重依赖于编译器的实现,实际测试表明,编译器所生成的代码,其速度实在不尽人意。 为了解决这个问题,可以使用直接对数据位进行操作的方法。这个方法是基于 IEEE 浮点数的表示法,如果你对 IEEE 浮点数的表示法比较熟悉的话,这是显而易见的。它提取指数和尾数,然后对尾数执行移位操作。 例如,以下是一个使用整数操作来将 32 位浮点数转换为 32 位整数的函数: ```cpp void TruncToInt32 (int &ival, float fval){ ival = *(int *)&fval; int mantissa = (ival & 0x07fffff) | 0x800000; int exponent = 150 - ((ival >> 23) & 0xff); if (exponent < 0) ival = (mantissa << -exponent); else ival = (mantissa >> exponent); if ((*(int *)&fval) & 0x80000000) ival = -ival; } ``` 这个函数有一个 BUG,那就是当 `fval=0` 时,返回值是 2。解决方法是要么对 0 作特殊处理,要么直接用汇编来实现。 这个函数比标准的 C 转换要快,而且由于整个过程只使用了整数运算,可以和 FPU 并行运行。但缺点是,依赖于硬件平台。例如根据小尾和大尾顺序的不同,要相应地修改函数。 另一种方法是使用 FPU 指令 FISTP,它将栈中的浮点数弹出并保存为整数: ```cpp inline void RoundToIntFPU (int &ival, double fval){ _asm{ fld fval mov edx, dword ptr [ival] fistp dword ptr [edx] } } ``` 这个方法可以实现快速的浮点型到整型的转换,但需要使用汇编语言实现。 浮点型转换整型是一个复杂的问题,需要根据具体情况选择合适的方法来实现。
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![h](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/release/download_crawler_static/4339727/bg1.jpg)
![](https://csdnimg.cn/release/download_crawler_static/4339727/bg2.jpg)
剩余10页未读,继续阅读
![avatar](https://profile-avatar.csdnimg.cn/d45e2f394c2b4f5992e23d27bce94c07_sunboxinan.jpg!1)
- 粉丝: 3
- 资源: 5
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
- 1
- 2
前往页