eLEcTRiCZiTy / libfixmath

libfixmath
0 stars 0 forks source link

32-bit multiplication seems to be way off for some values #29

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
1. Convert a = 9.9 , b = 9.9 into fixed point 
2. Call 8-bit, 32-bit, 64-bit multiplication functions
3. Covert the results back to floating point and print them

expected:98.009872 or something close to 98.009995
actual: 113.009872

Latest version, linux 64-bit PC

Trying other values worked pretty well, but it seems that values in [9.2 - 9.9] 
all give bad results. 8-bit and 64-bit multiply functions worked fine.
There may be other intervals in which the function does not work.

Original issue reported on code.google.com by dan.novi...@gmail.com on 13 Apr 2014 at 2:08

GoogleCodeExporter commented 8 years ago
I cannot seem to be able to reproduce this problem:

petteri@oddish:~/libfixmath$ cat test.c
#include <stdio.h>
#include <fix16.h>

int main()
{
        fix16_t a = fix16_from_dbl(9.9);
        fix16_t b = fix16_from_dbl(9.9);
        fix16_t result = fix16_mul(a, b);
        printf("%f\n", fix16_to_dbl(result));

        return 0;
}
petteri@oddish:~/libfixmath$ gcc -I libfixmath test.c libfixmath/fix16.c
petteri@oddish:~/libfixmath$ ./a.out 
98.009872
petteri@oddish:~/libfixmath$ gcc -I libfixmath -DFIXMATH_NO_64BIT=1 test.c 
libfixmath/fix16.c
petteri@oddish:~/libfixmath$ ./a.out 
98.009872
petteri@oddish:~/libfixmath$ gcc -I libfixmath -DFIXMATH_NO_64BIT=1 
-DFIXMATH_OPTIMIZE_8BIT test.c libfixmath/fix16.c
petteri@oddish:~/libfixmath$ ./a.out 
98.009872

Original comment by Petteri.Aimonen on 14 Apr 2014 at 9:27

GoogleCodeExporter commented 8 years ago
My bad, I was using some personalized data types for a MCU on the PC. Got the 
original repo and it works.

Info if you want to reproduce it:

$ uname -a
3.11.0-19-generic #33~precise1-Ubuntu SMP Wed Mar 12 21:16:27 UTC 2014 x86_64 
x86_64 x86_64 GNU/Linux

typedef char int8_t;
typedef unsigned char uint8_t;
typedef int int16_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
typedef long int32_t;
typedef long long int64_t;
typedef unsigned long long uint64_t;

Original comment by dan.novi...@gmail.com on 14 Apr 2014 at 10:24

GoogleCodeExporter commented 8 years ago

Original comment by Petteri.Aimonen on 15 Apr 2014 at 2:39