首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-07-16 
有点难的float运算改int运算,结果有时差1主要是CPU不支持硬件float运算;int i,j的范围都是-128到127int x

有点难的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 好像也可以。

热点排行