⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ieee2vax.c

📁 这是一个Linux下的集成开发环境
💻 C
字号:
/* $Header: /cvsroot/sourcenav/src/snavigator/demo/c++_demo/sds/ieee2vax.c,v 1.1.1.1 2002/04/18 23:35:28 mdejong Exp $ *//************************************************************************** *                 ****** ISTK Release 1.2 *****                          * *                                                                        * *                                                                        * * This code has been produced by numerous authors at the CERN centre for * * high energy physics, Geneve, Switzerland, at the SSC laboratory in     * * Dallas, Texas, USA and at the Lawrence Berekeley Laboratory in         * * California, USA.                                                       * * The latter two institutions perform work under US Government contract. * * The intent of the work is to provide useful code for people who need   * * it, with an emphasis on free and collaborative exchange of ideas,      * * techniques and implementations.                                        * * Please read the disclaimer and copyright notices contained in the ISTK * * distribution and in distributed applications.                          * *                                                                        * **************************************************************************//* Reference release  Aug 10 1991 - C G Saltmarsh *//* Has the basics used at CDG & SSC 1988-1991, plus vxworks   support*/#include <stdio.h>#ifndef vms#include "Sds/sdsgen.h"#else#include "sdsgen.h"#endif/* What vaxx double precision floating point looks like on a vaxx */struct  vaxx_double {  unsigned int  mantissa1 : 7;  unsigned int  exp1      : 1;  unsigned int  exp2      : 7;  unsigned int  sign      : 1;  unsigned int  mantissa3 : 8;  unsigned int  mantissa2 : 8;  unsigned int  mantissa5 : 8;  unsigned int  mantissa4 : 8;  unsigned int  mantissa7 : 8;  unsigned int  mantissa6 : 8;};/* ieee double precision floating point,on vaxx*/struct  ieee_double {  unsigned int  exp2      : 7;  unsigned int  sign      : 1;  unsigned int  mantissa1 : 4;  unsigned int  exp1      : 4;  unsigned int  mantissa2 : 8;  unsigned int  mantissa3 : 8;  unsigned int  mantissa4 : 8;  unsigned int  mantissa5 : 8;  unsigned int  mantissa6 : 8;  unsigned int  mantissa7 : 8;};/* What vaxx single precision floating point looks like on a vaxx */struct  vaxx_single {  unsigned int  mantissa1: 7;  unsigned int  exp1     : 1;  unsigned int  exp2     : 7;  unsigned int  sign    : 1;  unsigned int  mantissa2: 8;  unsigned int  mantissa3: 8;};/* ieee single precision floating point as seen on vaxx */struct  ieee_single {  unsigned int  exp2      : 7;  unsigned int  sign      : 1;  unsigned int  mantissa1 : 7;  unsigned int  exp1      : 1;  unsigned int  mantissa3 : 8;  unsigned int  mantissa2 : 8;};#define VAXX_DBL_BIAS  0x81#define IEEE_DBL_BIAS  0x3ff#define MASK(nbits)  ((1 << nbits) - 1)#define VAXX_SNG_BIAS  0x81#define IEEE_SNG_BIAS  0x7fstatic struct sgl_limits {  struct ieee_single s;  struct vaxx_single vaxx;} sgl_limits[2] = {  {{ 0x7f, 0x0, 0x0, 0x1, 0x00, 0x00 },  /* Max ieee */  { 0x7f, 0x1, 0x7f, 0x0, 0xff, 0xff}},    /* Max vaxx */  {{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },  /* Min ieee */  { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }}    /* Min vaxx */};static struct dbl_limits {  struct  ieee_double d;  struct  vaxx_double vaxx;} dbl_limits[2] = {  {{ 0x7f, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },  /* Max ieee */  { 0x7f, 0x1, 0x7f, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }},      /* Max vaxx */  {{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},    /* Min ieee */  { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }}        /* Min vaxx */};/***********************************************************************/voidr_double(old,new,number)char  *old,*new;int  number;/***********************************************************************/{  struct ieee_double  *id = (struct ieee_double *)old;  struct  vaxx_double  *vd = (struct vaxx_double *)new;  register struct dbl_limits *lim;  int i,n,exp;  char  *cptr;  for (n=0;n<number;n += sizeof(double),vd++,id++)   {    for (i = 0, lim = dbl_limits;      i < sizeof(dbl_limits)/sizeof(struct dbl_limits);      i++, lim++)       {      if ((id->mantissa6 == lim->d.mantissa6) &&        (id->mantissa7 == lim->d.mantissa7) &&        (id->mantissa5 == lim->d.mantissa5) &&        (id->mantissa4 == lim->d.mantissa4) &&        (id->mantissa3 == lim->d.mantissa3) &&        (id->mantissa2 == lim->d.mantissa2) &&        (id->mantissa1 == lim->d.mantissa1) &&        (id->exp1 == lim->d.exp1) &&        (id->exp2 == lim->d.exp2))         {        memcpy((char *)vd,(char *)&lim->vaxx,8);        goto movedb;      }    }    exp = (id->exp1 | (id->exp2 << 4)) +        VAXX_DBL_BIAS - IEEE_DBL_BIAS;    vd->exp1 = exp & 0x1;    vd->exp2 = (exp & 0xfe) >> 1;    vd->mantissa1 =((0xf & id->mantissa1) << 3) +          ((0xe0 & id->mantissa2) >> 5);    vd->mantissa2 =((0x1f & id->mantissa2) << 3) +          ((0xe0 & id->mantissa3) >> 5);    vd->mantissa3 =((0x1f & id->mantissa3) << 3) +          ((0xe0 & id->mantissa4) >> 5);    vd->mantissa4 =((0x1f & id->mantissa4) << 3) +          ((0xe0 & id->mantissa5) >> 5);    vd->mantissa5 =((0x1f & id->mantissa5) << 3) +          ((0xe0 & id->mantissa6) >> 5);    vd->mantissa6 =((0x1f & id->mantissa6) << 3) +          ((0xe0 & id->mantissa7) >> 5);    vd->mantissa7 = (0x1f & id->mantissa7) << 3;    movedb:      vd->sign = id->sign;  }  return ;}/***********************************************************************/voidr_float(old,new,number)char  *old,*new;int  number;/***********************************************************************/{  struct ieee_single *is = (struct ieee_single *)old;  struct vaxx_single *vs = (struct vaxx_single *)new;  struct sgl_limits *lim;  int i,n,exp;  char  *cptr;  for (n=0; n<number;n += sizeof(float),vs++,is++)   {    for (i = 0, lim = sgl_limits;      i < sizeof(sgl_limits)/sizeof(struct sgl_limits);      i++, lim++)       {      if ((is->mantissa2 == lim->s.mantissa2) &&        (is->mantissa3 == lim->s.mantissa3) &&        (is->exp1 == lim->s.exp1) &&        (is->exp2 == lim->s.exp2) &&        (is->mantissa1 == lim->s.mantissa1))         {        memcpy((char *)vs,(char *)&lim->vaxx,4);        goto movesn;      }    }    exp = (is->exp1 | (is->exp2 << 1)) +        VAXX_SNG_BIAS - IEEE_SNG_BIAS;    vs->exp1 = exp & 0x1;    vs->exp2 = (exp & 0xfe) >> 1;    vs->mantissa1 = is->mantissa1;    vs->mantissa2 = is->mantissa2;    vs->mantissa3 = is->mantissa3;  movesn:    vs->sign = is->sign;  }  return ;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -