zoukankan      html  css  js  c++  java
  • c: investigate float

    #include <stdio.h>
    #include <math.h>
    #include <assert.h>

    double f(int x)
    {
        return 1.0/x;
    }

    void Test1()
    {
        double a,b;
        int i;
        a=f(10);
        b=f(10);
        i = a==b;
        printf("%d\n", i);
    }

    void Test2()
    {
        double a,b,c;
        int i;
        a=f(10);
        b=f(10);
        c=f(10);
        i = a==b;
        printf("%d\n", i);
    }

    template <typename T>
    void PrintBin(T const &t)
    {
        int n = sizeof(t)*8;
        for(int i=n-1; i>=0; i--)
        {
            printf("%d", (t>>i)&1);
            if(i%4==0) printf(" ");
        }
        printf("\n");
    }

    void Test3()
    {
        float a = -625512485.15542145;
        //unsigned char *u = (unsigned char *)&a;
        //printf("%x %x %x %x\n", u[0], u[1], u[2], u[3]);
        printf("%.15g \n", a);
        
        unsigned int *n = (unsigned int *)&a;    //For double, MUST use  long long
        printf("%x \n", *n);
        PrintBin(*n);
        //PrintBin(a);
        
        int e = 8;
        int m = 23;
        
        if(sizeof(a)==sizeof(float))
        {
            e = 8;
            m = 23;
        }
        else
        {
            assert(sizeof(a)==sizeof(double));
            e = 11;
            m = 52;
        }
        assert(1+e+m==sizeof(a)*8);;
        
        int S = (*n) >> (e+m);
        int Ep = ((*n) << 1) >> (m+1);
        int Mp = ((*n)<<(1+e))>>(1+e);
    //    printf("S %x Ep %x Mp %x \n", S, Ep, Mp);
        printf("S  ");
        PrintBin(S);
        printf("Ep  ");
        PrintBin(Ep);
        printf("Mp  ");
        PrintBin(Mp);
        
        double E , M;
        double r = 0;
        
        if(Ep==0)
        {
            E = 1.0-pow(2.0,e-1)+1;
            M = 1.0 * Mp / pow(2.0,m);
            
        }
        else if(~Ep!=0)
        {
            E = Ep-pow(2.0,e-1)+1;
            M = 1 + 1.0 * Mp / pow(2.0,m);
            //r = pow(-1.0, S) * pow(2.0, E) * M;
        }
        else
        {
            // if(Mp==0)
                // r = inf;
            // else
                // r = nan;
            assert(0);
        }
        
        printf("M  ");
        PrintBin(*(__int64*)&M);
        
        r = pow(-1.0, S) * pow(2.0, E) * M;
        
        printf("%.15g\n", r);
        assert(fabs(r-a)<1e-5);
    }

    void main()
    {
        Test1();
        Test2();
        Test3();
    }
  • 相关阅读:
    从零开始学习SSH框架笔记之一 初识SSH框架及下载地址
    CentOS 6.0 升级内核步骤、方法
    解决Ubuntu详细信息中图形显示为未知的情况
    【Oracle XE系列之二】Oracle XE创建表空间、创建用户以及授权、查看权限
    排序算法大总结
    我的vimrc 设置
    你的c++学的怎么样?
    腾讯的笔试题一道
    一道递归算法题
    vc6 bug真多 写c++别用vc6
  • 原文地址:https://www.cnblogs.com/cutepig/p/1956922.html
Copyright © 2011-2022 走看看