读书人

有些难的float运算改int运算结果有时

发布时间: 2013-07-16 22:38:04 作者: rapoo

有点难的float运算改int运算,结果有时差1
主要是CPU不支持硬件float运算;

int i,j的范围都是-128到127;

int x = i*1.402; 完全等价 int x = i*1402/1000;

int y = i*1.402+j; 有时不等价 int y = i*1402/1000+j;
发现不等价时 i*1.402+j后改变了符号!

有什么好的算法能解决这个问题?


[解决办法]
我理解错了。楼主说“int i,j范围是-128到128……改变了符号”,我错以为是溢出。

既然没有溢出,那么用“y = (i * 1402 + j * 1000) / 1000”计算应该可以解决问题。
[解决办法]
验证过了:


#include <stdio.h>

int main()
{
int i, j;
int success = 1;
for( i = -128; i < 128; ++ i)
{
for( j = -128; j < 128; ++ j)
{
int y1 = (int)( i * 1.402 + j);
int y2 = (i * 1402 + j * 1000) / 1000;
//上面就是用整数运算实现的(int)( i * 1.402 + j)
if( y1 != y2 )
{
printf( "\n%d * 1.402 + %d = %d\n(%d * 1402 + %d * 1000) / 1000 = %d\n", i, j, y1, i, j, y2 );
success = 0;
}
}
}
if( success )
{


printf("(int)( i * 1.402 + j) ≡ (i * 1402 + j * 1000) / 1000)\n");
}
getchar();
}



输出为:

(int)( i * 1.402 + j) ≡ (i * 1402 + j * 1000) / 1000)






[解决办法]
原来y=i*1.402+j 是加j后取整;
y=(i*1402)/1000+j是加j前取整;可能造成相反方向取整。
y=i*1.402+j 可以改成 y=i*1.402; y=y+j;两个语句;
或者 y=i*1402/1000+j 改成 y=(i*1402+j*1000)/1000 好像也可以。

读书人网 >C语言

热点推荐