comparison intfloat_readwrite.c @ 24:2b3573111ff0 libavutil

AIFF format support by (Patrick Guimond <patg a.t patg d.o.t homeunix d.o.t org)
author michael
date Thu, 02 Feb 2006 15:21:19 +0000
parents f70fdc881a24
children 4d0fe18e5ce3
comparison
equal deleted inserted replaced
23:f70fdc881a24 24:2b3573111ff0
36 if(v+v > 0xFF000000U) 36 if(v+v > 0xFF000000U)
37 return 0.0/0.0; 37 return 0.0/0.0;
38 return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150); 38 return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150);
39 } 39 }
40 40
41 double av_ext2dbl(const AVExtFloat ext){
42 uint64_t m = 0;
43 int e, i;
44
45 for (i = 0; i < 8; i++)
46 m |= (uint64_t)ext.mantissa[i]<<(56-(i<<3));
47 e = (((int)ext.exponent[0]&0x7f)<<8) | ext.exponent[1];
48 if (e == 0x7fff && m)
49 return 0.0/0.0;
50 e -= 16383 + 63; /* In IEEE 80 bits, the whole (i.e. 1.xxxx)
51 * mantissa bit is written as opposed to the
52 * single and double precision formats */
53 if (ext.exponent[0]&0x80)
54 return ldexp(-m, e);
55 return ldexp(m, e);
56 }
57
41 int64_t av_dbl2int(double d){ 58 int64_t av_dbl2int(double d){
42 int e; 59 int e;
43 if ( !d) return 0; 60 if ( !d) return 0;
44 else if(d-d) return 0x7FF0000000000000LL + ((int64_t)(d<0)<<63) + (d!=d); 61 else if(d-d) return 0x7FF0000000000000LL + ((int64_t)(d<0)<<63) + (d!=d);
45 d= frexp(d, &e); 62 d= frexp(d, &e);
51 if ( !d) return 0; 68 if ( !d) return 0;
52 else if(d-d) return 0x7F800000 + ((d<0)<<31) + (d!=d); 69 else if(d-d) return 0x7F800000 + ((d<0)<<31) + (d!=d);
53 d= frexp(d, &e); 70 d= frexp(d, &e);
54 return (d<0)<<31 | (e+126)<<23 | (int64_t)((fabs(d)-0.5)*(1<<24)); 71 return (d<0)<<31 | (e+126)<<23 | (int64_t)((fabs(d)-0.5)*(1<<24));
55 } 72 }
73
74 AVExtFloat av_dbl2ext(double d){
75 struct AVExtFloat ext;
76 int e, i; double f; uint64_t m;
77
78 f = fabs(frexp(d, &e));
79 if (f >= 0.5 && f < 1) {
80 e += 16382;
81 ext.exponent[0] = e>>8;
82 ext.exponent[1] = e;
83 m = (uint64_t)ldexp(f, 64);
84 for (i=0; i < 8; i++)
85 ext.mantissa[i] = m>>(56-(i<<3));
86 } else if (f == 0.0) {
87 memset (&ext, 0, 10);
88 } else {
89 ext.exponent[0] = 0x7f; ext.exponent[1] = 0xff;
90 memset (&ext.mantissa, 0, 8);
91 if (f != 1/0.0)
92 ext.mantissa[0] = ~0;
93 }
94 if (d < 0)
95 ext.exponent[0] |= 0x80;
96 return ext;
97 }
98