ffmpeg / libavutil / intfloat_readwrite.c @ 94d85eaf
History | View | Annotate | Download (2.95 KB)
1 | c11c2bc2 | Alexander Strasser | /*
|
---|---|---|---|
2 | * portable IEEE float/double read/write functions
|
||
3 | *
|
||
4 | * Copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>
|
||
5 | *
|
||
6 | * This library is free software; you can redistribute it and/or
|
||
7 | * modify it under the terms of the GNU Lesser General Public
|
||
8 | * License as published by the Free Software Foundation; either
|
||
9 | * version 2 of the License, or (at your option) any later version.
|
||
10 | *
|
||
11 | * This library is distributed in the hope that it will be useful,
|
||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
14 | * Lesser General Public License for more details.
|
||
15 | *
|
||
16 | * You should have received a copy of the GNU Lesser General Public
|
||
17 | * License along with this library; if not, write to the Free Software
|
||
18 | 5509bffa | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19 | c11c2bc2 | Alexander Strasser | */
|
20 | 115329f1 | Diego Biurrun | |
21 | c11c2bc2 | Alexander Strasser | /**
|
22 | * @file intfloat_readwrite.c
|
||
23 | * Portable IEEE float/double read/write functions.
|
||
24 | */
|
||
25 | 115329f1 | Diego Biurrun | |
26 | c11c2bc2 | Alexander Strasser | #include "common.h" |
27 | a851b8e8 | Dieter | #include "intfloat_readwrite.h" |
28 | c11c2bc2 | Alexander Strasser | |
29 | double av_int2dbl(int64_t v){
|
||
30 | if(v+v > 0xFFELLU<<52) |
||
31 | return 0.0/0.0; |
||
32 | bf4e3bd2 | Måns Rullgård | return ldexp(((v&((1LL<<52)-1)) + (1LL<<52)) * (v>>63|1), (v>>52&0x7FF)-1075); |
33 | c11c2bc2 | Alexander Strasser | } |
34 | |||
35 | float av_int2flt(int32_t v){
|
||
36 | if(v+v > 0xFF000000U) |
||
37 | return 0.0/0.0; |
||
38 | return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150); |
||
39 | } |
||
40 | |||
41 | f11288da | Michael Niedermayer | 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 | |||
58 | c11c2bc2 | Alexander Strasser | int64_t av_dbl2int(double d){
|
59 | int e;
|
||
60 | if ( !d) return 0; |
||
61 | else if(d-d) return 0x7FF0000000000000LL + ((int64_t)(d<0)<<63) + (d!=d); |
||
62 | d= frexp(d, &e); |
||
63 | return (int64_t)(d<0)<<63 | (e+1022LL)<<52 | (int64_t)((fabs(d)-0.5)*(1LL<<53)); |
||
64 | } |
||
65 | |||
66 | int32_t av_flt2int(float d){
|
||
67 | int e;
|
||
68 | if ( !d) return 0; |
||
69 | else if(d-d) return 0x7F800000 + ((d<0)<<31) + (d!=d); |
||
70 | d= frexp(d, &e); |
||
71 | return (d<0)<<31 | (e+126)<<23 | (int64_t)((fabs(d)-0.5)*(1<<24)); |
||
72 | } |
||
73 | f11288da | Michael Niedermayer | |
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 | } |