Difference between revisions of "Dev:ETL make check"

From Synfig Studio :: Documentation
Jump to: navigation, search
m (explain the failure of the 'make check' tests for 'fixed')
 
m
Line 1: Line 1:
 
If we 'make check' in the ETL directory, one of the tests fails.
 
If we 'make check' in the ETL directory, one of the tests fails.
  
−
The failing test is one which multiplies a fixed point number by PI.  The result is outside the expected accuracy range.
+
The failing test is one which multiplies a fixed point number by pi.  The result is outside the expected accuracy range.
  
−
The problem is that it's working with 12 bits of decimal.
+
The problem is that it's working with 12 bits of decimal, and pi is around 12867.9635 * 1/(2^12).  The code in ETL/_fixed.h rounds that down to 12867, and so gets the sum quite wrong. If it rounded to the nearest integer instead, it would do better.
−
 
+
−
PI is around 12867.9635 * 1/(2^12)
+
−
 
+
−
The code in ETL/_fixed.h rounds that down to 12867, and so gets the sum quite wrong.
+
−
 
+
−
If it rounded to the nearest integer instead, it would do better.
+
  
 
There are 3 lines in _fixed.h with commented "+0.5" code, like:
 
There are 3 lines in _fixed.h with commented "+0.5" code, like:
  
−
fixed_base<T,FIXED_BITS>::fixed_base(const float &f):_data(static_cast<value_type>(f*_ONE()/*+0.5f*/))
+
fixed_base<T,FIXED_BITS>::fixed_base(const float &f):
 +
_data(static_cast<value_type>(f*_ONE()/*+0.5f*/))
  
 
If those 3 bits are uncommented, the test passes.  I guess it was commented to make the code faster.
 
If those 3 bits are uncommented, the test passes.  I guess it was commented to make the code faster.
Line 19: Line 14:
 
Even once that's fixed, however, the 'fixed' check still crashes, when doing:
 
Even once that's fixed, however, the 'fixed' check still crashes, when doing:
  
−
a=3+i;
+
a=3+i;
−
b=40+i;
+
b=40+i;
−
b/=a;
+
b/=a;
  
 
on all values of i from 1 to 10 million.  When i gets to 1048573, 3+i is 2^20, which is represented by shifting it left 12 bits, giving 2^32, which on a machine with 32 bit integers is 0.
 
on all values of i from 1 to 10 million.  When i gets to 1048573, 3+i is 2^20, which is represented by shifting it left 12 bits, giving 2^32, which on a machine with 32 bit integers is 0.

Revision as of 05:43, 8 October 2007

If we 'make check' in the ETL directory, one of the tests fails.

The failing test is one which multiplies a fixed point number by pi. The result is outside the expected accuracy range.

The problem is that it's working with 12 bits of decimal, and pi is around 12867.9635 * 1/(2^12). The code in ETL/_fixed.h rounds that down to 12867, and so gets the sum quite wrong. If it rounded to the nearest integer instead, it would do better.

There are 3 lines in _fixed.h with commented "+0.5" code, like:

fixed_base<T,FIXED_BITS>::fixed_base(const float &f):
_data(static_cast<value_type>(f*_ONE()/*+0.5f*/))

If those 3 bits are uncommented, the test passes. I guess it was commented to make the code faster.

Even once that's fixed, however, the 'fixed' check still crashes, when doing:

a=3+i;
b=40+i;
b/=a;

on all values of i from 1 to 10 million. When i gets to 1048573, 3+i is 2^20, which is represented by shifting it left 12 bits, giving 2^32, which on a machine with 32 bit integers is 0.

So the b/=a line crashes, with:

 Floating point exception(core dumped)