[Insight-developers] Failing test vnl_test_math

Bill Lorensen bill.lorensen at gmail.com
Mon Apr 20 15:25:06 EDT 2009


I think we should bypass that part of the test. It does not affect ITK.

On Mon, Apr 20, 2009 at 3:22 PM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
> On Mon, Apr 20, 2009 at 11:37 AM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>> On Thu, Apr 16, 2009 at 6:43 PM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>>> Bill,
>>>
>>> More on this.
>>>
>>> The error message would indicate that the problem is in
>>>
>>>              > !isinf(qnan_q)    - **FAILED**
>>>
>>> that corresponds to line 183 of
>>>
>>>    Insight/Utilities/vxl/core/vnl/tests/test_math.cxx
>>>
>>> which is
>>>
>>>  testlib_test_assert("!isinf(qnan_q)   ", !vnl_math_isinf(qnan_q));
>>>
>>>
>>> however,
>>> when isolating this line in the following example:
>>>
>>>
>>> #include "vcl_limits.h"
>>> #include "vnl/vnl_math.h"
>>> #include <iostream>
>>>
>>> int main()
>>> {
>>>  long double qnan_q = vcl_numeric_limits<long double>::quiet_NaN();
>>>  bool result1 = !vnl_math_isfinite(qnan_q);
>>>  bool result2 = !vnl_math_isinf(qnan_q);
>>>
>>>  std::cout << "Finite  = " << result1 << std::endl;
>>>  std::cout << "Infinte = " << result2 << std::endl;
>>>
>>>  return 0;
>>> }
>>>
>>>
>>> It produces the following output in Linux gcc 4.2
>>>
>>> Finite  = 1
>>> Infinte = 1
>>>
>>> and the following output in Sun-CC
>>>
>>>
>>> Finite  = 1
>>> Infinte = 0
>>>
>>>
>>> For the record.
>>>
>>> This tests started failing in April 5 when we were amidst the
>>> frenzy of changes related to -stlport4.  It didn't look important
>>> at the time when we had hundreds of compilation errors.
>>>
>>>
>>> It is tempting to speculate that the method used by VXL for
>>> implementing isinf() for long doubles is not valid when the
>>> flag -stlport4 is used with the Sun-CC compiler.
>>>
>>>
>>>
>>>    Luis
>>>
>>>
>>>
>>> ----------------------------------------------------------------------------
>>> On Thu, Apr 16, 2009 at 6:13 PM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>>>> Hi Bill,
>>>>
>>>> I just logged in dashsun1
>>>>
>>>> and here is the full test print out:
>>>>
>>>> -------------------------------------------------------------
>>>>
>>>> Test command: /home/kitware/Dashboards/MyTests/Insight-CC/bin/vnl_test_all
>>>> test_math
>>>> -----------------------------------------------------------------------------
>>>> Start Testing test_math:
>>>> -----------------------------------------------------------------------------
>>>> n = -11
>>>> f = -7.5
>>>> d = -3.14159
>>>> i = (0,1)
>>>> z = (-1,2)
>>>> exp(d*i) = (-1,-1.22465e-16)
>>>>
>>>> abs(n) = 11
>>>> abs(f) = 7.5
>>>> abs(d) = 3.14159
>>>> abs(i) = 1
>>>> abs(z) = 2.23607
>>>> norm(z) = 5
>>>>
>>>> abs(n) == 11 -   PASSED
>>>> abs(f) == 7.5 -   PASSED
>>>> abs(d) == pi -   PASSED
>>>> abs(i) == 1 -   PASSED
>>>> abs(-1+2i)~=sqrt(5) should be 2.23607, is 2.23607,   PASSED
>>>> norm(-1+2i) ~= 5 should be 5, is 5,   PASSED
>>>> exp(d*i) ~= -1 should be 0, is 1.22465e-16,   PASSED
>>>>
>>>> rnd(-8.4999)  == -8 -   PASSED
>>>> rnd(-8.4999f) == -8 -   PASSED
>>>> vnl_math_rnd(-8.50) == -9
>>>> rnd(-8.50)  == -8/9 -   PASSED
>>>> rnd(-8.50f) == -8/9 -   PASSED
>>>> vnl_math_rnd(-8.5001) == -9
>>>> rnd(-8.5001)  == -9 -   PASSED
>>>> rnd(-8.5001f) == -9 -   PASSED
>>>> rnd(8.4999)  == 8 -   PASSED
>>>> rnd(8.4999f) == 8 -   PASSED
>>>> rnd(8.50)  == 8/9 -   PASSED
>>>> vnl_math_rnd(8.50) == 9
>>>> rnd(8.50f) == 8/9 -   PASSED
>>>> vnl_math_rnd(8.5001) == 9
>>>> rnd(8.5001)  == 9 -   PASSED
>>>> rnd(8.5001f) == 9 -   PASSED
>>>>  isfinite(f)     -   PASSED
>>>>  isfinite(d)     -   PASSED
>>>>  isfinite(i)     -   PASSED
>>>>  isfinite(z)     -   PASSED
>>>> vcl_numeric_limits<float>::has_infinity==true assumption -   PASSED
>>>> vcl_numeric_limits<double>::has_infinity==true assumption -   PASSED
>>>> vcl_numeric_limits<ldouble>::has_infinity==true assumption -   PASSED
>>>> vcl_numeric_limits<float>::has_quiet_NaN==true assumption -   PASSED
>>>> vcl_numeric_limits<double>::has_quiet_NaN==true assumption -   PASSED
>>>> vcl_numeric_limits<ldouble>::has_quiet_NaN==true assumption -   PASSED
>>>> pinf_f = inf =  �ninf_d = -inf = ��!isfinite(qnan_d) -   PASSED
>>>> !isinf(qnan_d)    -   PASSED
>>>>  isnan(qnan_d)    -   PASSED
>>>> !isfinite(pinf_q) -   PASSED
>>>> !isfinite(ninf_q) -   PASSED
>>>>  isinf(pinf_q)    -   PASSED
>>>>  isinf(ninf_q)    -   PASSED
>>>> !isnan(pinf_q)    -   PASSED
>>>> !isnan(ninf_q)    -   PASSED
>>>> !isfinite(qnan_q) -   PASSED
>>>> !isinf(qnan_q)    - **FAILED**
>>>> !isfinite(huge_val(double)) -   PASSED
>>>> !isfinite(huge_val(float)) -   PASSED
>>>> -----------------------------------------------------------------------------
>>>> test_math Test Summary: 56 tests succeeded, 1 test failed               *****
>>>> -----------------------------------------------------------------------------
>>>> -- Process completed
>>>>
>>>>
>>>> -----
>>>>
>>>>
>>>> I'm taking a look at the code...
>>>>
>>>>
>>>>    Luis
>>>>
>>>> ------------------------------------------------------------------------------------------
>>>> On Thu, Apr 16, 2009 at 3:01 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>>>>> Luis,
>>>>>
>>>>> Looks like there is only 1 failing test left (at least today):
>>>>> http://www.cdash.org/CDash/testDetails.php?test=20138903&build=313966
>>>>>
>>>>> Notice that the output is truncated, so we can't see what part of the
>>>>> test is failing. Actually, it is truncated even on systems where it
>>>>> passes (e.g. http://www.cdash.org/CDash/testDetails.php?test=2017929&build=313981
>>>>> )
>>>>>
>>>>> Also, the same test on the vxl dashboard is also truncated, forthe
>>>>> same reason I believe:
>>>>> http://www.cdash.org/CDash/testDetails.php?test=16499304&build=313792
>>>>>
>>>>>
>>>>> The test uses an internal macro, print_hex that attempts to print the
>>>>> hex digits of inf, nan, etc. They can't be printed with std::hex since
>>>>> they have special meaning and printing a inf just prints "inf". The
>>>>> print_hex macro casts the output one digit at a time to unsigned char.
>>>>> We know from ITK that this is not a good idea, and that the
>>>>> "PrintType" should be something that is printable (e.g. unsigned int).
>>>>>
>>>>> Someone (a vxl person) should look at this problem. As a temporary
>>>>> measure we could disable the print_hex portion of the code so that we
>>>>> can see where the SUN build is failing.
>>>>>
>>>>> Interesting to note that the only failing test and only valgrind
>>>>> defects are in the vxl code that we use.
>>>>>
>>>>> Bill
>>>>>
>>>>
>>>
>> ------------------------------------------------
>>
>> Bill,
>>
>> More findings on the vnl_math test failure in Sun-CC.
>>
>> 1) long double in this platform
>>    (machine + compiler + compilation options )
>>    has sizeof = 16 bytes.
>>
>> 2) qnan_q in this platform is assigned a value:
>>
>> (dbx) x qnan_q = E
>>  0x7FF10000 0x00000000 0x00000000 0x00000000    +7.26154477146748e+4927
>>
>>  However the code in:
>>
>>   Insight/Utilities/vxl/core/vnl/vnl_math.cxx
>>
>>  lines:  218 and 285 are comparing against the pattern:
>>
>>     0x7FF70000L
>>
>>  Note the change from "7FF7" to "7FF1"
>>
>>  I'm tracking the exact location
>>  where the comparison takes place....
>>
>> 3) From a quick Google Search, it seems that the
>>    the proper value for NAN in  "long double" is:
>>
>>         7FF7 FFFF FFFF FFFF
>>
>>    (for an HP...)..
>>
>>     but I'm not finding a clear definition.
>>
>>   The 7FF1 seems to be for:
>>
>>   "Addition of opposite signed infinities 7FF10000 00000000"
>>
>>
>> So....
>> It is not clear if the problem is that SunCC is generating an
>> improper quiet NAN or whether we are comparing against
>> the wrong pattern in that platform.
>>
>>
>> Any suggestions and/or words of wisdom will be appreciated.
>>
>>
>> I'll keep tracking this....
>>
>>
>>    Luis
>>
>
> ----------------------------------------------
>
> Bill,
>
> More on this Sun CC issue.
>
> It seems that it all boils down to the following:
>
>  long double qnan_q = vcl_numeric_limits<long double>::quiet_NaN();
>
>  bool  K = isnan(qnan_q) ;
>
> returns "false" in the Sun CC with -stlport4
> (it returns True on Linux)
>
>
> In this platform, isinf is defined as
>
> bool vnl_math_isinf(long double x)
> {
>  return !finitel(x) && !isnan(x);
> }
>
>
> It seems that "isnan" itself is not well defined across platforms
> for "long double":
>
> We have:
> Insight/Utilities/vxl/core/vnl/tests/test_math.cxx
>
> line 186-188
>
> #if 0 // even more nonstandard ...
>  testlib_test_assert(" isnan(qnan_q)   ",  vnl_math_isnan(qnan_q));
> #endif // 0
>
>
> We could fix vnl_math_isinf() if we could use vnl_math_isnan()...but...
>
>
> Any suggestions ?
>
>
>     Luis
>


More information about the Insight-developers mailing list