Difference between revisions of "Dev:ETL make check"
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 | + | 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. |
− | + | ||
− | + | ||
− | + | ||
− | 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; | |
− | + | 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. | 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 04: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)