GMP gives wrong (negative) results
James Wanless
james at grok.ltd.uk
Fri Mar 31 14:07:12 UTC 2017
Compile it with a compiler that was released before clang - my guess
is there's a multiple_levels_of_indirection bug introduced by clang in
the separation of compile and link
J
On 31 Mar 2017, at 14:46, V. Nicolai Friedhoff wrote:
>
>
> 2017-03-31 12:10 GMT+02:00 Torbjörn Granlund <tg at gmplib.org>:
>
> For small values of x<29 the results seem to be correct, so I am
> sure that
> my maths and my implementation is correct. But for larger x>29 the
> results
> are wrong and even negative (the function should be positive for
> positive
> x).
>
> Let me rephrase that: your program is correct for some parameters,
> therefore you know it is correct for all parameters.
>
> Skeptical programmers might not find that reasoning convincing.
>
> Nope, I said that I am sure, not that I know. But I am very sure
> because I get expected results in Wolframalpha and Mathematica for x
> upto 120 (compared to 30 in C++ w/ GMP), when it suddenly also goes
> into the negative numbers, even though it is a product of two
> positive functions. To fix this and get proper results for even
> higher x, one has to apply higher precision in Mathematica. But in
> the end I need that calculation in C++, not Mathematica or
> Wolframalpha.
>
>
> What is wrong when GMP gives me negative results for a function
> that should
> be positive once some numbers become large?
>
> That can have many causes, with varying degree of likelihood:
>
> 1. The user's program is buggy
> 2. There is a bug in GMP
> 3. There is a bug in the compiler used for compiling GMP
> 4. There is a bug in the compiler used for compiling the user code
> 6. There is a bug in some other explicitly or implicitly used library
> 7. There are hardware problems
> 8. This list lacks one or more items
>
> If I were to debug a float application with apparent stability issues,
> I'd start with plain old 'double' variables.
>
> 1. That would be my favorite scenario.
> After some memory checking with valgrind I was able to get rid of a
> handful of wrongly positioned initializations and clears. Now
> valgrind does not find any memory leaks.
> But one thing confuses me: To please valgrind and get rid of memory
> errors, I have to skip a variable initialization that i would assume
> necessary, because the variable is not otherwise initialized.
>
> 2.-4. Could I find out if any of this is the case?
> 6. I only include gmp.h and gmpfrxx.h, nothing else.
> 7. Its a pretty new workstation, so I doubt that :P
>
> Do you mean regular doubles, without GMP? I tried that and the
> program fails much earlier in that case, like at x=5, giving me
> again large negative results. The problem I think is that some
> positive terms in the sum are too small or large, so they get
> neglected, while some other negative terms are valid. This adds up
> to a negative end result, far from what the sum should actually be.
> I would interpret this collective behavior as a suggestion that my
> implementation and maths are correct, but somehow all the platforms
> get the same issue at largeish numbers (x=5 for c++ doubles, x=30
> for GMP, x=120 for Mathematica) with that series.
>
>
> Thanks for the answer!
>
>
> 2017-03-31 12:33 GMT+02:00 James Wanless <james at grok.ltd.uk>:
>
> Try a compiler that predates Clang - you might have more luck
> J
>
> Hm, what do you mean? Compile it with Clang (I tried that, same
> result) or a compiler that was released before Clang got released?
>
> Thank you!
>
More information about the gmp-discuss
mailing list