• 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;
    }

      测试结果如下图所示:

      

  • 相关阅读:
    中綴表達式求值的兩種方法
    两次bfs求树的直径的正确性
    感染linux脚本程序技术
    C# 动态代码执行
    中秋写了个狼吃羊的智力游戏
    做一个让人喜欢的人
    MySQL数据库安全配置指南
    用 VS 2005 生成 .NET 1.1 程序
    防止入侵和攻击的主要技术措施
    .NETZ 原理分析
  • 原文地址:https://www.cnblogs.com/volcanol/p/3356972.html
Copyright © 2020-2023  润新知