1 /*
2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg 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.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg 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 FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <inttypes.h>
22 #include <stdio.h>
26
27 #undef printf
28
32
33
36 if(v.
exp > 0)
return (
double)v.
mant * (double)(1 << v.
exp);
37 else return (
double)v.
mant / (double)(1 << (-v.
exp));
38 }
39
41 {
42 int idx, sign;
43 int sv, cv;
44 int st, ct;
45
46 idx = a >> 26;
47 sign = (idx << 27) >> 31;
49 cv = (cv ^ sign) - sign;
50
51 idx -= 8;
52 sign = (idx << 27) >> 31;
54 sv = (sv ^ sign) - sign;
55
56 idx = a >> 21;
59
60 idx = (int)(((int64_t)cv * ct - (int64_t)sv * st + 0x20000000) >> 30);
61
62 sv = (int)(((int64_t)cv * st + (int64_t)sv * ct + 0x20000000) >> 30);
63
64 cv = idx;
65
66 idx = a >> 16;
69
70 idx = (int)(((int64_t)cv * ct - (int64_t)sv * st + 0x20000000) >> 30);
71
72 sv = (int)(((int64_t)cv * st + (int64_t)sv * ct + 0x20000000) >> 30);
73 cv = idx;
74
75 idx = a >> 11;
76
77 ct = (int)(((int64_t)
av_costbl_4_sf[idx & 0x1f] * (0x800 - (a & 0x7ff)) +
79 0x400) >> 11);
80 st = (int)(((int64_t)
av_sintbl_4_sf[idx & 0x1f] * (0x800 - (a & 0x7ff)) +
82 0x400) >> 11);
83
84 *c = (int)(((int64_t)cv * ct + (int64_t)sv * st + 0x20000000) >> 30);
85
86 *s = (int)(((int64_t)cv * st + (int64_t)sv * ct + 0x20000000) >> 30);
87 }
88
92 double d1, d2, d3;
93 int i, j;
95
96 d1= 1;
97 for(i= 0; i<10; i++){
98 d1= 1/(d1+1);
99 }
100 printf("test1 double=%d\n", (int)(d1 * (1<<24)));
101
102 sf1= one;
103 for(i= 0; i<10; i++){
105 }
106 printf(
"test1 sf =%d\n",
av_sf2int(sf1, 24));
107
108
109 for(i= 0; i<100; i++){
111 d1= i;
112 d2= i/100.0;
113 for(j= 0; j<1000; j++){
114 d1= (d1+1)*d2;
115 }
117 }
118 printf("test2 double=%d\n", (int)(d1 * (1<<24)));
119
120 for(i= 0; i<100; i++){
124 for(j= 0; j<1000; j++){
126 }
128 }
130
131 d1 = 0.0177764893;
132 d2 = 1374.40625;
133 d3 = 0.1249694824;
134 d2 += d1;
135 d3 += d2;
136 printf("test3 double: %.10lf\n", d3);
137
143 printf(
"test3 softfloat: %.10lf (0x%08x %d)\n", (
double)
av_sf2double(sf3), sf3.
mant, sf3.
exp);
144
146 printf(
"test4 softfloat: %.10lf (0x%08x %d)\n", (
double)
av_sf2double(sf1), sf1.
mant, sf1.
exp);
148 printf(
"test4 softfloat: %.10lf (0x%08x %d)\n", (
double)
av_sf2double(sf1), sf1.
mant, sf1.
exp);
149
151 printf(
"test4 softfloat: %.10lf (0x%08x %d)\n", (
double)
av_sf2double(sf1), sf1.
mant, sf1.
exp);
153 printf(
"test4 softfloat: %.10lf (0x%08x %d)\n", (
double)
av_sf2double(sf1), sf1.
mant, sf1.
exp);
154
155 return 0;
156
157 }
static const SoftFloat FLOAT_1374_40625
static const int32_t av_costbl_4_sf[33]
void av_log_set_level(int level)
Set the log level.
static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b)
b has to be normalized and not zero.
static const int32_t av_sintbl_3_sf[32]
static av_const SoftFloat av_normalize_sf(SoftFloat a)
static const SoftFloat FLOAT_0_017776489257
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static av_const int av_sf2int(SoftFloat v, int frac_bits)
Rounding is to -inf.
static const int32_t av_costbl_2_sf[32]
void av_sincos_sf(int a, int *s, int *c)
Rounding-to-nearest used.
static const int32_t av_costbl_1_sf[16]
static const int32_t av_sintbl_2_sf[32]
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
common internal and external API header
static av_const double av_sf2double(SoftFloat v)
static av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b)
static const int32_t av_sintbl_4_sf[33]
static const int32_t av_costbl_3_sf[32]
static av_const SoftFloat av_int2sf(int v, int frac_bits)
Converts a mantisse and exponent to a SoftFloat.
static const SoftFloat FLOAT_0_1249694824218