[Flac-dev] Fixed: ERROR: mismatch in decoded data, verify FAILED!
Matt Zimmerman
mdz at debian.org
Tue Jul 3 14:39:52 PDT 2001
On Mon, Jul 02, 2001 at 09:50:38PM -0700, Josh Coalson wrote:
> After some intense debugging, I found the problem. One block in the file
> triggered a very rare bug in the LPC coefficient quantizer caused by
> insufficient floating point precision. There is a snippet to compute the
> log(base 2) of a number:
>
> floor(log(cmax) / M_LN2)
>
> It turns out on at least some x86's compiling with gcc-2.91 (at least) the
> result of floor(log(8.0) / M_LN2) is 2.0 not 3.0. Anyway, I made a fix and
> also added code to detect and handle similar problems (related to FP
> accuracy).
This appears to be triggered by -ffast-math.
mizar:[/tmp] cat log.c
#include <math.h>
int main() {
double x = 8.0;
printf("log(x) / M_LN2 = %.40f\n", log(x) / M_LN2);
printf("floor(log(x) / M_LN2) = %.40f\n", floor(log(x) / M_LN2));
return 0;
}
mizar:[/tmp] gcc -o log log.c -lm
mizar:[/tmp] ./log
log(x) / M_LN2 = 3.0000000000000000000000000000000000000000
floor(log(x) / M_LN2) = 3.0000000000000000000000000000000000000000
mizar:[/tmp] gcc -ffast-math -o log log.c -lm
mizar:[/tmp] ./log
log(x) / M_LN2 = 2.9999999999999995559107901499373838305473
floor(log(x) / M_LN2) = 2.0000000000000000000000000000000000000000
mizar:[/tmp]
This happens for me with both gcc 2.95.4 and 3.0. According to the
documentation, this may not even be a bug. -ffast-math allows gcc to violate
ANSI/IEEE floating point rules as an optimization, which means that sometimes
mathematically incorrect results may be generated. If flac is expecting exact
results here, maybe it shouldn't be using -ffast-math.
--
- mdz
More information about the Flac-dev
mailing list