Linux 0.12 OS. math - compare.c

来源:互联网 发布:caffe的安装和配置 编辑:程序博客网 时间:2024/06/04 20:01
#define clear_Cx() (I387.swd &= ~0x4500) /* reset C0,C3,C2 */static void normalize(temp_real * a){int i = a->exponent & 0x7fff;int sign = a->exponent & 0x8000;if (!(a->a || a->b)) {  /* zero */a->exponent = 0;return;}/*   Zero                  0/1 000...0 0.000...0   Denormalized finite   0/1 000...0 0.XXX...X (X:不全为0)   Normalized finite     0/1 YYY...Y 1.XXX...X (Y:不全为0或1)   Infinite              0/1 111...1 1.000...0   SNaN                  0/1 111...1 1.0XX...X (X:不全为0)   QNaN                  0/1 111...1 1.1XX...X   Pseudo denormal       0/1 000...0 1.XXX...X   Pseudo normal         0/1 YYY...Y 0.XXX...X (Y:不全为0或1)   Pseudo infinite       0/1 111...1 0.000...0   Pseudo SNaN           0/1 111...1 0.0XX...X (X:不全为0)   Pseudo QNaN           0/1 111...1 0.1XX...X*/while (i && a->b >= 0) {  /* 它的目的是将bit63规范化为1,通过自己加自己(即向左移1位)来实现,注意指数部分得对应减1 */i--;__asm__("addl %0,%0 ; adcl %1,%1":"=r" (a->a),"=r" (a->b):"0" (a->a),"1" (a->b));}a->exponent = i | sign;}void ftst(const temp_real * a) /* 和0.0比较 */{temp_real b;clear_Cx();b = *a;normalize(&b);/*  condition  C3  C2  C0  >          0   0   0  <          0   0   1  =          1   0   0*/if (b.a || b.b || b.exponent) { /* 其实a.a和a.b都为0时,指数必然为0 */if (b.exponent < 0)set_C0(); /* < 0.0 */} elseset_C3();   /* = 0.0 */}void fcom(const temp_real * src1, const temp_real * src2){temp_real a;a = *src1;a.exponent ^= 0x8000;fadd(&a,src2,&a); /* a = src2 - src1 */ftst(&a); /* a和0比较 */}void fucom(const temp_real * src1, const temp_real * src2){fcom(src1,src2);}