有点难的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)