从网上一个程序(浮点运算转定点运算)学到的知识
2006-11-02 01:05
225 查看
这段时间在学习DSP浮点运算转定点运算过程中,在网上看到了一位网友给出的一段程序.如下所示:
---------------------------------------------------------
声明:
此文为原创,欢迎转载,转载请保留如下信息
作者:聂飞(afreez) 北京-中关村
联系方式:afreez@sina.com (欢迎与作者交流)
初次发布时间:2006-11-28
不经本人同意,不得用语商业或赢利性质目的,否则,作者有权追究相关责任!
---------------------------------------------------------
/***************************************************************
// 将32位浮点数fval转换为32位整数并存储在ival中
// 小数部分将被裁剪掉
//
void TruncToInt32 (int &ival, float fval)
{
ival = *(int *)&fval;
// 提取尾数
// 注意实际的尾数前面还有一个被省略掉的1
int mantissa = (ival & 0x07fffff) | 0x800000;
// 提取指数
// 以23分界,指数大于23则左移,否则右移
// 由于指数用偏移表示,所以23+127=150
int exponent = 150 - ((ival >> 23) & 0xff);
if (exponent < 0)
ival = (mantissa << -exponent);
else
ival = (mantissa >> exponent);
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
}
*******************************************************/
程序流程写的很清晰.兴奋之余马上在自己的机器上测试了一把,结果发现总是不正确,大体如下:
//主函数
...
int ival;
float fval=4.23;
TruncToInt32 (&ival, fval);
//这里的输出结果不正确
printf("ival=%d/n",ival);
...
//函数定义
void TruncToInt32 (int &ival, float fval)
{
//skip
...
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
//发现在这里输出的结果是正确的
printf("ival=%d/n",ival);
}
仔细看了一眼,才发现,原来是函数调用时参数传递有问题。主要上理解指针和指针的指针,大家对照我的思路考虑考虑吧。
修改主程序,如下所示:
...
int ival;
float fval=4.23;
RightTruncToInt32 (&ival, fval);//第n行,假定是经过修正后的函数
ival=(int)fval;//第n+1行
printf("ival=%d/n",ival);
...
对n行和n+1行进行时间效率测试,显示,第n+1行所需的计算时间少于第n行。
对主程序进一步改善,大致如下:
...
int ival;
float fval=4.23;
//-------Begin more fast section?-----------
// 提取尾数
int ival= ((*(int *)(&fval)) & 0x07fffff) | 0x800000;
// 提取指数
int exponent = 150 - (((*(int *)(&fval)) >> 23) & 0xff);
if (exponent < 0)
ival = (ival<< -exponent);
else
ival = (ival >> exponent);
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
//-------End more fast section?-----------
ival=(int)fval;//第n+1行
...
结果显示,在RedHat 9.0平台上测试显示,如果编译不加优化选项,more fast section的执行时间效率优与第n+1行;加优化选项,第n+1行的执行时间效率优与more fast section。
分析结论:
由于more fast section还有一些代码行可以优化,我想,在一些特定场合下,还是可以借鉴这个思路的。
---------------------------------------------------------
声明:
此文为原创,欢迎转载,转载请保留如下信息
作者:聂飞(afreez) 北京-中关村
联系方式:afreez@sina.com (欢迎与作者交流)
初次发布时间:2006-11-28
不经本人同意,不得用语商业或赢利性质目的,否则,作者有权追究相关责任!
---------------------------------------------------------
/***************************************************************
// 将32位浮点数fval转换为32位整数并存储在ival中
// 小数部分将被裁剪掉
//
void TruncToInt32 (int &ival, float fval)
{
ival = *(int *)&fval;
// 提取尾数
// 注意实际的尾数前面还有一个被省略掉的1
int mantissa = (ival & 0x07fffff) | 0x800000;
// 提取指数
// 以23分界,指数大于23则左移,否则右移
// 由于指数用偏移表示,所以23+127=150
int exponent = 150 - ((ival >> 23) & 0xff);
if (exponent < 0)
ival = (mantissa << -exponent);
else
ival = (mantissa >> exponent);
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
}
*******************************************************/
程序流程写的很清晰.兴奋之余马上在自己的机器上测试了一把,结果发现总是不正确,大体如下:
//主函数
...
int ival;
float fval=4.23;
TruncToInt32 (&ival, fval);
//这里的输出结果不正确
printf("ival=%d/n",ival);
...
//函数定义
void TruncToInt32 (int &ival, float fval)
{
//skip
...
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
//发现在这里输出的结果是正确的
printf("ival=%d/n",ival);
}
仔细看了一眼,才发现,原来是函数调用时参数传递有问题。主要上理解指针和指针的指针,大家对照我的思路考虑考虑吧。
修改主程序,如下所示:
...
int ival;
float fval=4.23;
RightTruncToInt32 (&ival, fval);//第n行,假定是经过修正后的函数
ival=(int)fval;//第n+1行
printf("ival=%d/n",ival);
...
对n行和n+1行进行时间效率测试,显示,第n+1行所需的计算时间少于第n行。
对主程序进一步改善,大致如下:
...
int ival;
float fval=4.23;
//-------Begin more fast section?-----------
// 提取尾数
int ival= ((*(int *)(&fval)) & 0x07fffff) | 0x800000;
// 提取指数
int exponent = 150 - (((*(int *)(&fval)) >> 23) & 0xff);
if (exponent < 0)
ival = (ival<< -exponent);
else
ival = (ival >> exponent);
// 如果小于0,则将结果取反
if ((*(int *)&fval) & 0x80000000)
ival = -ival;
//-------End more fast section?-----------
ival=(int)fval;//第n+1行
...
结果显示,在RedHat 9.0平台上测试显示,如果编译不加优化选项,more fast section的执行时间效率优与第n+1行;加优化选项,第n+1行的执行时间效率优与more fast section。
分析结论:
由于more fast section还有一些代码行可以优化,我想,在一些特定场合下,还是可以借鉴这个思路的。
相关文章推荐
- 从网上学到的一个消息相关知识
- FPGA基础知识17(Matlab中滤波器的定点化 浮点运算转换为定点运算)
- 第十五周实验--任务2--设计分数类,开发一个窗口式程序,可以完成分数的四则运算。
- 通过键盘输入100 以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 编制一个乘法运算的程序
- 用java代码写一个简单的网上购物车程序
- 用C++编写一个随机产生多个两位数四则运算式子的简单程序
- 大小端的一些知识复习及 用Union写一个大小端判别程序
- 一个简单的数值运算程序
- 与afreez一起学习DSP中浮点转定点运算--举例及编程中的心得
- 一个简单的四则运算程序C语言实现--无法处理括号
- DSP中浮点转定点运算--定点数模拟浮点数运算及常见的策略
- 在Fragment中点击退出按钮,退出到登录界面后(按返回键退出程序开始的时候,退出到登录界面按返回键无法退出程序,而是返回到上一个Activity,网上说是没有finish掉上一个Activity)
- 使用fiddler对手机上的程序进行抓包 用fiddler对手机上的程序进行抓包,网上有很多的资料,这里写一下来进行备用。 前提: 1.必须确保安装fiddler的电脑和手机在同一个wifi环境下
- 编写一个程序,实现单链表的各种基本运算
- 与afreez一起学习DSP中浮点转定点运算--浮点与定点概述
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。 补充说明: 1、操作数为
- 写了一个小程序:定时从网上下载图片来设置桌面
- PHP浮点运算中一个不算BUG的BUG
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。