• volcanol的工控博客


      最近学习要用到求绝对值函数,看了一下有很多种的abs函数,因此想自己实现这些代码。

    下面是我进行测试的代码:

    #include <stdio.h>
    
    typedef unsigned int U32,u32;
    typedef enum {FALSE,TRUE} BOOL;
    
    //求绝对值函数
    float fabsf(float x) 
    {
        //这里可以看到浮点数和整数在计算机中的表达方式不一样
        //下面的这种方法,不能用于整数
        U32* p;
    
        p=(U32 *)&x;
        *p=*p & 0x7FFFFFFF;
    
        return x;
    }
    
    int abs(int x) 
    {
        //负数的补码=反码+1=~源码+1 ;这个公式仅是对绝对值有效,
        //而符号位无关
        /*
        if( x & 0x80000000 )
            return ~(--x);
        else
            return x;
        */
    
        //或者用下面的方法
        return   ( x & 0x80000000 ) ? ~(--x) : x ;
    
        /*
        或者用下面的方法
        return  x>=0 ? x:(-1*x) ;
        */
        
    }
    
    double fabsd(double x)
    {
        /*
         *因为double的sizeof(double)=8,
         *所以处理需要技巧
         *这里我们可以利用char*指针进行处理
        */
        /*
        unsigned char* p;
    
        p = (unsigned char*)&x;
        p=p+7;
        *p=*p & 0x7F;
    
        return x;
        */
    
        //也可以用下面的方法
        if(x<0)
            return -1*x;
    
        return x;
    
    }
    
    BOOL isLittleEndian()
    {
        /*可以用下面这种方法实现
        U32 x=0x12345678;
        unsigned char *p;
    
        p=(unsigned char*)&x;
        if(!(*p ^ (unsigned char)0x78))
            return TRUE;
        else   //这里的else分支,其实可以不用
            return FALSE;
         */
    
        //也可以利用下面的方式实现
        union 
        {
            unsigned char x;
            unsigned int  y;
        }a;
    
        a.y=(unsigned int)0x78;
        if(!(a.x^(0x78)))
            return TRUE;
        else  //这里的else分支,其实可以不用
            return FALSE;
    }
    
    
    int main()
    {
        double x=fabsf(-123.0);
        U32 y=0x12345678;
        unsigned char *p;
    
    
        printf("fabsf(-123.0)=%f,sizeof(double)=%d",x,sizeof(double));
        printf("
    abs(x)=%d",abs(-4));
        printf("
    fabsd(x)=%f",fabsd(-300.123));
    
        p=(unsigned char*)&y;
        printf("
    %x",*p);
        if(isLittleEndian())
        {
            puts("
    Yes");
        }
    
        getchar();
        return 0;
    }

      测试结果如下图所示:

      

  • 相关阅读:
    Java时间日期格式转换
    数据库性能优化
    java 词法分析器
    hdu 1018 Big Number
    hdu 1233 还是畅通工程
    hdu 2583 permutation 动态规划
    Sublime Text 3 安装 Package Control 结果返回 275309,找不到 Install Package
    Sublime Text 常用快捷键(Mac环境)
    sublime设置 reindent 快捷键
    scrollWidth、clientWidth 和 offsetWidth
  • 原文地址:https://www.cnblogs.com/volcanol/p/3356972.html
Copyright © 2020-2023  润新知