Hi David,

Thanks for the feedback. I am sorry i missed this type promotion...

This leaves me dubious. The double version returns a NaN in valgrind
but the float does not. If the problem came from numerical stability,
I would have expected the opposite. Outside of valgrind, with or
without excess-precision, both options return non-NaN values.

To try and make sure excess-precision was turned off outside of
valgrind I also tried adding some combination of the following gcc
options:

-ffloat-store
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

-mpc32
-mpc64
http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options


No matter what combination of options I use the results are the same, e.g.

> g++ -mpc64 -ffloat-store -msse2 -mfpmath=sse -O0 -Wall -Wconversion -I 
> /usr/local/boost_1_39_0/include/boost-1_39/ 
> boost_cyl_bessel_i_valgrind_bug_test.cpp -o 
> boost_cyl_bessel_i_valgrind_bug_test
> ./boost_cyl_bessel_i_valgrind_bug_test
passes
> valgrind -v ./boost_cyl_bessel_i_valgrind_bug_test
fails on the second assert (double version)

Tom


/////// Unit test v3 ///////

#include <boost/math/special_functions/bessel.hpp>
int main()
{
 // boost::math::cyl_bessel_i( 2, 0.82995 ) should be close to 0.0912
 assert( isnan( boost::math::cyl_bessel_i( 2.0f, 0.82995f ) ) == 0 );
 assert( isnan( boost::math::cyl_bessel_i( 2, 0.82995 ) ) == 0 );
}

///// End unit test v3 ////


On Wed, Aug 12, 2009 at 18:02, David<[email protected]> wrote:
> boost::math::cyl_bessel_i( 2, 0.82995 )
>
> is actually a function with arguments of type (int, float), which
> according to <boost/math/tools/promotion.hpp> will be forwarded to a
> function of type double(double, double).  I tried it with
>
> boost::math::cyl_bessel_i( 2.0f, 0.82995f )
>
> and it didn't assert in valgrind.
>
>
> Tom Vercauteren wrote:
>> Hi Julian,
>>
>> First of thanks for the lightning fast answer!
>>
>> I am not sure I fully understand why bullet point 8 in
>> http://www.valgrind.org/docs/manual/manual-core.html#manual-core.limits
>> addresses my concern.
>>
>> If I get it right, it only means that valgrind does not implement
>> extended (80bits) precision. This should not be a problem for me. I
>> don't expect
>>   boost::math::cyl_bessel_i( 2, 0.82995 )
>> to provide the exact same result inside and outside of valgrind. I
>> just expect them to be somewhat close. My test only checks that the
>> returned value is not NaN. This is what is failing in valgrind.
>>
>> I tried disabling extended precision (outside of valgrind) by adding
>> "-msse2 -mfpmath=sse" to my compilation command line. I also tried
>> using the float version of  boost::math::cyl_bessel_i
>>   boost::math::cyl_bessel_i( 2, 0.82995f )
>> The same pattern appears
>>
>>
>>> g++ -msse2 -mfpmath=sse -O0 -Wall -Wconversion -I 
>>> /usr/local/boost_1_39_0/include/boost-1_39/ 
>>> boost_cyl_bessel_i_valgrind_bug_test.cpp -o 
>>> boost_cyl_bessel_i_valgrind_bug_test
>>> ./boost_cyl_bessel_i_valgrind_bug_test
>>>
>> pass
>>
>>> valgrind  ./boost_cyl_bessel_i_valgrind_bug_test
>>>
>> fail
>>
>>
>> Thanks again for the support,
>> Tom
>>
>> /////// New unit test ///////
>>
>> #include <boost/math/special_functions/bessel.hpp>
>> int main()
>> {
>>   // boost::math::cyl_bessel_i( 2, 0.82995 ) should be close to 0.0912
>>   assert( isnan( boost::math::cyl_bessel_i( 2, 0.82995 ) ) == 0 );
>>   assert( isnan( boost::math::cyl_bessel_i( 2, 0.82995f ) ) == 0 );
>> }
>>
>> ///// End new unit test ////
>>
>>
>> On Wed, Aug 12, 2009 at 11:57, Julian Seward<[email protected]> wrote:
>>
>>> Known problem.  See
>>> http://www.valgrind.org/docs/manual/manual-core.html#manual-core.limits
>>> bullet point 8 for details.
>>>
>>> J
>>>
>>> On Wednesday 12 August 2009, Tom Vercauteren wrote:
>>>
>>>> Hi all,
>>>>
>>>> I encountered a strange behavior when using the cyl_bessel_i from boost:
>>>> http://www.boost.org/doc/libs/1_39_0/libs/math/doc/sf_and_dist/html/math_to
>>>> olkit/special/bessel/mbessel.html
>>>>
>>>> When running within valgrind, the following code
>>>>
>>>>   boost::math::cyl_bessel_i( 2, 0.82995 )
>>>>
>>>> returns a NaN instead of something close to 0.0912 as correctly
>>>> returned outside of valgrind. Could this be a valgrind issue, or would
>>>> you rather have me report this to the boost mailing list?
>>>>
>>>> Below is a simple (but requiring boost) unit test for this issue and
>>>> some infomation about my setup.
>>>>
>>>> Thank you for your help.
>>>>
>>>> Best regards,
>>>> Tom Vercauteren
>>>>
>>>>
>>>> /////// Unit test ///////
>>>>
>>>> #include <boost/math/special_functions/bessel.hpp>
>>>> int main()
>>>> {
>>>>    // boost::math::cyl_bessel_i( 2, 0.82995 ) should be close to 0.0912
>>>>    assert( isnan( boost::math::cyl_bessel_i( 2, 0.82995 ) ) == 0 );
>>>> }
>>>>
>>>> ///// End unit test ////
>>>>
>>>>
>>>> ////  Commands I tried ////
>>>>
>>>>
>>>>> g++-4.1 -O0 -Wall -Wconversion -I
>>>>> /usr/local/boost_1_39_0/include/boost-1_39/
>>>>> boost_cyl_bessel_i_valgrind_bug_test.cpp -o
>>>>> boost_cyl_bessel_i_valgrind_bug_test
>>>>> ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> pass
>>>>
>>>>
>>>>> valgrind ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> fail
>>>>
>>>>
>>>>> g++-4.1 -O2 -Wall -Wconversion -I
>>>>> /usr/local/boost_1_39_0/include/boost-1_39/
>>>>> boost_cyl_bessel_i_valgrind_bug_test.cpp -o
>>>>> boost_cyl_bessel_i_valgrind_bug_test
>>>>> ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> pass
>>>>
>>>>
>>>>> valgrind ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> fail
>>>>
>>>>
>>>>> g++-4.3 -O0 -Wall -Wconversion -I
>>>>> /usr/local/boost_1_39_0/include/boost-1_39/
>>>>> boost_cyl_bessel_i_valgrind_bug_test.cpp -o
>>>>> boost_cyl_bessel_i_valgrind_bug_test
>>>>> ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> pass
>>>>
>>>>
>>>>> valgrind ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> fail
>>>>
>>>>
>>>>> g++-4.3 -O2 -Wall -Wconversion -I
>>>>> /usr/local/boost_1_39_0/include/boost-1_39/
>>>>> boost_cyl_bessel_i_valgrind_bug_test.cpp -o
>>>>> boost_cyl_bessel_i_valgrind_bug_test
>>>>> ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> pass
>>>>
>>>>
>>>>> valgrind ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> fail
>>>>
>>>> ////  End commands I tried ////
>>>>
>>>>
>>>> /// Version information ///
>>>>
>>>>
>>>>> uname -a
>>>>>
>>>> Linux oahu 2.6.28-15-generic #48-Ubuntu SMP Wed Jul 29 08:54:56 UTC
>>>> 2009 i686 GNU/Linux
>>>>
>>>>
>>>>> g++-4.1 --version
>>>>>
>>>> g++-4.1 (GCC) 4.1.3 20080623 (prerelease) (Ubuntu 4.1.2-24ubuntu1)
>>>> Copyright (C) 2006 Free Software Foundation, Inc.
>>>> This is free software; see the source for copying conditions.  There is NO
>>>> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
>>>>
>>>>
>>>>> g++-4.3 --version
>>>>>
>>>> g++-4.3 (Ubuntu 4.3.3-5ubuntu4) 4.3.3
>>>> Copyright (C) 2008 Free Software Foundation, Inc.
>>>> This is free software; see the source for copying conditions.  There is NO
>>>> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
>>>>
>>>>
>>>>> valgrind --version
>>>>>
>>>> valgrind-3.4.1-Debian
>>>>
>>>> /// End version information ///
>>>>
>>>>
>>>> //// Full valgrind output example ////
>>>>
>>>>
>>>>> g++ -O0 -Wall -Wconversion -I
>>>>> /usr/local/mkt-dev/install/boost_1_39_0/include/boost-1_39/
>>>>> boost_cyl_bessel_i_valgrind_bug_test.cpp -o
>>>>> boost_cyl_bessel_i_valgrind_bug_test valgrind -v
>>>>> ./boost_cyl_bessel_i_valgrind_bug_test
>>>>>
>>>> ==28028== Memcheck, a memory error detector.
>>>> ==28028== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al.
>>>> ==28028== Using LibVEX rev 1884, a library for dynamic binary translation.
>>>> ==28028== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP.
>>>> ==28028== Using valgrind-3.4.1-Debian, a dynamic binary
>>>> instrumentation framework.
>>>> ==28028== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al.
>>>> ==28028==
>>>> --28028-- Command line
>>>> --28028--    ./boost_cyl_bessel_i_valgrind_bug_test
>>>> --28028-- Startup, with flags:
>>>> --28028--    -v
>>>> --28028-- Contents of /proc/version:
>>>> --28028--   Linux version 2.6.28-15-generic (bui...@rothera) (gcc
>>>> version 4.3.3 (Ubuntu 4.3.3-5ubuntu4) ) #48-Ubuntu SMP Wed Jul 29
>>>> 08:54:56 UTC 2009
>>>> --28028-- Arch and hwcaps: X86, x86-sse1-sse2
>>>> --28028-- Page sizes: currently 4096, max supported 4096
>>>> --28028-- Valgrind library directory: /usr/lib/valgrind
>>>> --28028-- Reading syms from /lib/ld-2.9.so (0x4000000)
>>>> --28028-- Reading debug info from /lib/ld-2.9.so ..
>>>> --28028-- .. CRC mismatch (computed 049232cc wanted 022486d8)
>>>> --28028--    object doesn't have a symbol table
>>>> --28028-- Reading syms from
>>>> /home/tom/dev/Sandbox/boost_cyl_bessel_i_valgrind_bug_test (0x8048000)
>>>> --28028-- Reading syms from /usr/lib/valgrind/x86-linux/memcheck
>>>> (0x38000000) --28028--    object doesn't have a dynamic symbol table
>>>> --28028-- Reading suppressions file: /usr/lib/valgrind/default.supp
>>>> --28028-- Reading syms from
>>>> /usr/lib/valgrind/x86-linux/vgpreload_core.so (0x4020000)
>>>> --28028-- Reading syms from
>>>> /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so (0x4023000)
>>>> --28028-- Reading syms from /usr/lib/libstdc++.so.6.0.10 (0x404c000)
>>>> --28028-- Reading debug info from /usr/lib/libstdc++.so.6.0.10 ..
>>>> --28028-- .. CRC mismatch (computed 87794c5d wanted bcd37461)
>>>> --28028--    object doesn't have a symbol table
>>>> --28028-- Reading syms from /lib/tls/i686/cmov/libm-2.9.so (0x413b000)
>>>> --28028-- Reading debug info from /lib/tls/i686/cmov/libm-2.9.so ..
>>>> --28028-- .. CRC mismatch (computed 9d3c94d0 wanted 85a674c7)
>>>> --28028--    object doesn't have a symbol table
>>>> --28028-- Reading syms from /lib/libgcc_s.so.1 (0x4162000)
>>>> --28028-- Reading debug info from /lib/libgcc_s.so.1 ..
>>>> --28028-- .. CRC mismatch (computed 224ab3f8 wanted 89276151)
>>>> --28028--    object doesn't have a symbol table
>>>> --28028-- Reading syms from /lib/tls/i686/cmov/libc-2.9.so (0x4171000)
>>>> --28028-- Reading debug info from /lib/tls/i686/cmov/libc-2.9.so ..
>>>> --28028-- .. CRC mismatch (computed 7ee64c88 wanted 8d898f0d)
>>>> --28028--    object doesn't have a symbol table
>>>> --28028-- REDIR: 0x41e8a60 (rindex) redirected to 0x4027330 (rindex)
>>>> --28028-- REDIR: 0x41e85e0 (strlen) redirected to 0x40276e0 (strlen)
>>>> --28028-- REDIR: 0x41ea850 (memcpy) redirected to 0x4027b50 (memcpy)
>>>> --28028-- REDIR: 0x41e8800 (strncmp) redirected to 0x4027950 (strncmp)
>>>> --28028-- REDIR: 0x41ea530 (stpcpy) redirected to 0x4028380 (stpcpy)
>>>> --28028-- REDIR: 0x41ea3a0 (mempcpy) redirected to 0x4028720 (mempcpy)
>>>> --28028-- REDIR: 0x41e4930 (malloc) redirected to 0x4026f20 (malloc)
>>>> --28028-- REDIR: 0x41ed390 (strchrnul) redirected to 0x40286c0 (strchrnul)
>>>> --28028-- REDIR: 0x41e2520 (free) redirected to 0x4025d40 (free)
>>>> --28028-- REDIR: 0x41ea340 (memset) redirected to 0x40285f0 (memset)
>>>> --28028-- REDIR: 0x41e4de0 (realloc) redirected to 0x4027030 (realloc)
>>>> boost_cyl_bessel_i_valgrind_bug_test:
>>>> boost_cyl_bessel_i_valgrind_bug_test.cpp:9: int main(): Assertion
>>>> `isnan( boost::math::cyl_bessel_i( 2, 0.82995 ) ) == 0' failed.
>>>> ==28028==
>>>> ==28028== Process terminating with default action of signal 6
>>>> (SIGABRT): dumping core
>>>> ==28028==    at 0x40007F2: (within /lib/ld-2.9.so)
>>>> ==28028==    by 0x419E097: abort (in /lib/tls/i686/cmov/libc-2.9.so)
>>>> ==28028==    by 0x41955CD: __assert_fail (in
>>>> /lib/tls/i686/cmov/libc-2.9.so) ==28028==    by 0x804AD8F: main (in
>>>> /home/tom/dev/Sandbox/boost_cyl_bessel_i_valgrind_bug_test)
>>>> ==28028==
>>>> ==28028== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 17 from 1)
>>>> --28028--
>>>> --28028-- supp:     17 Debian libc6 (2.9.x) stripped dynamic linker
>>>> ==28028== malloc/free: in use at exit: 0 bytes in 0 blocks.
>>>> ==28028== malloc/free: 3 allocs, 3 frees, 569 bytes allocated.
>>>> ==28028==
>>>> ==28028== All heap blocks were freed -- no leaks are possible.
>>>> --28028--  memcheck: sanity checks: 2 cheap, 2 expensive
>>>> --28028--  memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use
>>>> --28028--  memcheck: auxmaps_L1: 0 searches, 0 cmps, ratio 0:10
>>>> --28028--  memcheck: auxmaps_L2: 0 searches, 0 nodes
>>>> --28028--  memcheck: SMs: n_issued      = 11 (176k, 0M)
>>>> --28028--  memcheck: SMs: n_deissued    = 0 (0k, 0M)
>>>> --28028--  memcheck: SMs: max_noaccess  = 65535 (1048560k, 1023M)
>>>> --28028--  memcheck: SMs: max_undefined = 0 (0k, 0M)
>>>> --28028--  memcheck: SMs: max_defined   = 40 (640k, 0M)
>>>> --28028--  memcheck: SMs: max_non_DSM   = 11 (176k, 0M)
>>>> --28028--  memcheck: max sec V bit nodes:    0 (0k, 0M)
>>>> --28028--  memcheck: set_sec_vbits8 calls: 0 (new: 0, updates: 0)
>>>> --28028--  memcheck: max shadow mem size:   480k, 0M
>>>> --28028-- translate:            fast SP updates identified: 3,175 ( 85.6%)
>>>> --28028-- translate:   generic_known SP updates identified: 269 (  7.2%)
>>>> --28028-- translate: generic_unknown SP updates identified: 264 (  7.1%)
>>>> --28028--     tt/tc: 5,657 tt lookups requiring 5,794 probes
>>>> --28028--     tt/tc: 5,657 fast-cache updates, 2 flushes
>>>> --28028--  transtab: new        2,821 (67,794 -> 1,028,579; ratio
>>>> 151:10) [0 scs]
>>>> --28028--  transtab: dumped     0 (0 -> ??)
>>>> --28028--  transtab: discarded  0 (0 -> ??)
>>>> --28028-- scheduler: 231,604 jumps (bb entries).
>>>> --28028-- scheduler: 2/3,045 major/minor sched events.
>>>> --28028--    sanity: 3 cheap, 2 expensive checks.
>>>> --28028--    exectx: 769 lists, 466 contexts (avg 0 per list)
>>>> --28028--    exectx: 558 searches, 222 full compares (397 per 1000)
>>>> --28028--    exectx: 0 cmp2, 38 cmp4, 0 cmpAll
>>>> --28028--  errormgr: 6 supplist searches, 6 comparisons during search
>>>> --28028--  errormgr: 17 errlist searches, 38 comparisons during search
>>>> Aborted
>>>>
>>>> ---------------------------------------------------------------------------
>>>> --- Let Crystal Reports handle the reporting - Free Crystal Reports 2008
>>>> 30-Day trial. Simplify your report design, integration and deployment - and
>>>> focus on what you do best, core application coding. Discover what's new
>>>> with Crystal Reports now.  http://p.sf.net/sfu/bobj-july
>>>> _______________________________________________
>>>> Valgrind-users mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/valgrind-users
>>>>
>>>
>>>
>>
>> ------------------------------------------------------------------------------
>> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
>> trial. Simplify your report design, integration and deployment - and focus on
>> what you do best, core application coding. Discover what's new with
>> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
>> _______________________________________________
>> Valgrind-users mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/valgrind-users
>>
>
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
> _______________________________________________
> Valgrind-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/valgrind-users
>

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Valgrind-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to