jtv / libpqxx

The official C++ client API for PostgreSQL.
http://pqxx.org/libpqxx/
BSD 3-Clause "New" or "Revised" License
1k stars 238 forks source link

to_string fails on certain double values #328

Closed edwinvp closed 4 years ago

edwinvp commented 4 years ago

There seems to be an issue converting certain double floating point values to text. The issue is that one will receive a conversion overrun exception even though there is nothing special about the floating point value at all.

This is all assuming we're using the pqxx::to_string(double) method.

More specifically the problem is that the string buffer is too small for those double values that want to print more digits.

In order to know how big the string buffer should be the code uses a so called buffer_budget number.

For double values the budget becomes 21 chars at runtime (I presume this includes the terminating NUL character).

Now let's look at two examples:

This is fine:

double d = 0.000111111111111111; // Okay (20+1 bytes)
std::string s = pqxx::to_string(d);

This is not, it'll throw a pqxx conversion overrun exception:

double d = 0.0001111111111111111; // Not okay (21+1 bytes), to_string will throw exception
std::string s = pqxx::to_string(d);

(compiling with vs2017)

edwinvp commented 4 years ago

Here is a SO post about recommended buffer sizes, maybe it is of some use:

https://stackoverflow.com/a/52045523/1848032

edwinvp commented 4 years ago

As workaround so I can at least continue with what I was doing, I modified conversions.hxx such that ...

  static inline constexpr int buffer_budget =
    1 + 1 + std::numeric_limits<T>::max_digits10 + 1 + 1;

... in struct float_traits becomes:

  static inline constexpr int buffer_budget = 32;
jtv commented 4 years ago

I may have to go that kind of route in the end. But until then, I wish I understood where my estimate went wrong! Your example doesn't look denormalised to me... but then what?

edwinvp commented 4 years ago

Yes, from the purist point of view it would be really nice to have a formula that would cover all the situations. But I have no clue when the double to string routine will stop printing digits. I guess theoretically it could keep printing digits forever if it's a fraction - so it must stop at some point :-)

jtv commented 4 years ago

If you've got the PQXX_HAVE_TO_CHARS_FLOAT macro defined, then the code should be using std::to_chars. And that function guarantees that it will stop spitting out digits as soon as it's got to the right binary value. Shortest representation consistent with the binary value, basically. The build checks whether it can use to_chars and if so, defines the macro.

But if the macro is not defined, then the code will fall back on a horrible workaround using iostream. Can't wait to ditch that kludge.

IIRC Visual Studio 2017 has a working std::to_chars for floating-point numbers, so could you check whether the build setup defined that macro for you? If it did, the macro should be in include/pqxx/config-internal-compiler.h.

I'm not getting the exception with gcc. That's because it doesn't have the floating-point to_chars, so I get the workaround. The workaround skips the fixed buffer altogether, and just goes straight to the iostream-based implementation, which returns a std::string. You're looking at an older version of libpqxx so this detail may be different for you.

edwinvp commented 4 years ago

This is the content of the file:

// Estimation of compiler configuration for Visual Studio 2017.
// This may need still tweaking.

#define PQXX_HAVE_CHARCONV_INT 1
#define PQXX_HAVE_CHARCONV_FLOAT 1

The libpqxx code seems to use std::to_chars on my machine. I can tell from the error message in the exception that occurs no-where else (only around the implementation using std::to_chars).

A quick console project test shows that std::to_chars can generate something with 22 chars. So that will definitely trigger the exception.

Had to enable c++17 code generation on the test project otherwise I couldn't use std::to_chars (charconv header has c++17 ifdef).

GordonLElliott commented 4 years ago

Just realized this issue is exactly what I am using, and I have very small numbers very often, upgrading numerical statitical projects to VS 2019. I am going to try to reconstruct the issue and investigate, will report back. I could very easily try to convert the number 2.2250738585072014E-308, for example. What happens then?

PS: @edwinvp has a comment on his bio on wanting to be "...in the loop, but never an infinite one". I am building a batch file to quickly install PQXX on Windows with Visual Studio (which @jtv is mentioning in the README now). In the initial development of my batch file I wound up recursively calling the batch file as administrator in an infinite sequence of recursive calls. Was interesting getting that to stop, I think I logged out. I mention because @edwinvp might be interested in testing my batch file to easily upgrade the PQXX installation with VS2017, which may make installing the changes as they occur easy and I could get some feedback.

edwinvp commented 4 years ago

@GordonLElliott with the value you mention it also goes wrong, now requires a buffer budget of 23

GordonLElliott commented 4 years ago

...Your example doesn't look denormalised to me... but then what?

@jtv I don't understand that. If a foating/double number was denormalized, the hardware or library would first normalize it anyway before any more steps. The issue is how many leading zeros before the significant digits in small (exponent) numbers. My example: 2.2250738585072014E-308, if presented without exponent but with significant digits, will have some 307 or so leading zeros..... In a fixed field (at least one less than 309 characters wide) it would always wind up all 0's and no significant digits at all. I'm getting on with investigating, don't understand quite yet. I'll definitely help resolve this, because my projects will do this with thousands or even millions of small, apparently random numbers from the noise in measurements. And those always hit the worst case at the worst time -- Murphy's law!

edwinvp commented 4 years ago

@GordonLElliott Thanks, I will look into your build routines, might help us out

GordonLElliott commented 4 years ago

@GordonLElliott I will look into your build routines, might help us out

(This is not for here -- but as @jtv comments in the README, this has only been tested by one or two people so far. I have tested earlier versions on my copy of VS 2017 professional, but not the latest copy, but the underlying ideas did work and were fully tested in an earlier generation. Don't comment here on that, not appropriate place, but if you have any problems open an issue there -- and THANKS!)

GordonLElliott commented 4 years ago

@GordonLElliott with the value you mention it also goes wrong, now requires a buffer budget of 23

Ary you saying it prints all zeros, when it succeeds?

GordonLElliott commented 4 years ago

I haven't yet succeeded in reproducing a failure, because my compile still uses the to_dumb_stringstream (I just havn't figured out where to set flags to get your case).

But I am noting that the system conversion uses exponential form when the significant digits are out of range. My example above upon conversion back to string produced 2.2250738585072014e-308 (all it did is put a lower case 'e' in the exponent). Algorithm must be something like using the field width (see below) if all the significant digits can be represented with leading 0's added instead of switching to less readable exponential notation then it does that. (And that would be a "denormalised" representation in characters, as opposed to the IEEE binary meaning.) But it will switch to exponential display if needed to preserve the significant digits, I think.

But the main point here is as to number of characters required for storing that string. See this Stack Overflow on digits, but says may use 17 significant digits. (Mentioned somewhere above I believe, can't find.) Taking all the decimal and other characters out in above example: 22250738585072014 which is exactly the 17 characters. Then add a decimal point, letter 'e' for exponent, negative sign on exponent, and 3 digit exponent, and we get 23. If the number was negative then a leading minus would make 24 characters. So all those need to be accounted for in a buffer, seems like 7 more characers than significant digits (however that is found).

Jtv, the 0.0001111111111111111 is a denormalized representation in a base 10 representation (not IEEE binary meaning). Here there are 16 significant digits. Normalized would be 1.111111111111111e-4 in standard exponential notation.

OH, and I see that std::numeric_limits::max_digits10 is indeed 17 for T of double. So as I see it, add 7 to that for number of characters that may actually be used. If you are going to have a "long long double" or whatever it is called for an 80 bit representation, then the exponent can have 4 digits, so add 8. And note that does not have an old C style null terminator, BTW.

Also, the Stack Overflow discussion goes a bit sideways. The issue in representation that we care about is that every possible IEEE binary number gets represented in a string that converts back to that particular IEEE (64 bit) binary value (with some 11 of the bits used for the exponent and the leading matissa '1' is implied and not stored at all so always in a normalized format). Apparently with the 17 digit representation (even with exponent) it will convert back to the original IEEE number. (I did not know that previously--I hope it is true, and should verify further.) However the 17 decimal digits are not themselves an exact decimal representation of the mathematical numeric value that would be represented by the binary IEEE value, in which the mantissa is quite possibly multiplied by some 2^-nnn exponent so it does not have a representation in decimal that is exact with only 17 digits. Key again is that the decimal number should convert back to the original IEEE value, not that it is a completely mathematically accurate decimal presentation of that number stored in the IEEE format. See the interesting Wikipedia on floating point format.

GordonLElliott commented 4 years ago

I'm also having difficulty comparing my files. I have CMake 3.17.2 installed. (I guess there is a 3.17.3 I have not yet installed.)

But my include/pqxx/config-internal-compiler.h file only has activated lines:

/* Define if compiler provides strnlen */
#define PQXX_HAVE_STRNLEN
/* Define if compiler provides strnlen_s */
#define PQXX_HAVE_STRNLEN_S
/* Define if thread_local is fully supported. */
#define PQXX_HAVE_THREAD_LOCAL

This is true whether I build for VS 2017 or built for VS 2019. And I have only few days out on latest library source.

At this point I have not figured out how to reproduce the problem.

jtv commented 4 years ago

@GordonLElliott I'm aware of those points... Important detail is that to_chars will use exponential notation only if it's shorter. So the extra characters in scientific notation shouldn't be the issue. My buffer budget includes max_digits10 for the decimal digits, one byte for a sign, one for a zero before the decimal point, the decimal point itself, and a terminating zero.

One thing you mentioned intrigues me though: you're talking about max_digits10 as the number of significant digits, rather than just digits. If that's true, that might explain something. But I see no mention of "significant" digits in the cppreference docs.

By the way, you can manually enable use of to_chars by doing #define PQXX_HAVE_TO_CHARS_FLOAT -- but yeah, that should happen when you configure the build, and I have no idea why it doesn't in your case. Cached configuration from previous builds maybe? In any case I'd be quite interested to hear what the behaviour is with MSVC 2019.

I've re- (and re-re-) read the documentation on to_chars, and it still confuses me. There's no reference to max_digits10 even though the two seem closely related to me. And it says it works like printf() with the e or f conversion... which leaves the options of either "scientific notation" or "fixed precision." And yet we seem to be getting variable-length non-scientific notation here! What gives?

Some documentation links for convenience...

jtv commented 4 years ago

@edwinvp any chance I could get you to run an experiment for me?

Could you compile and run this code? Feel free to terminate it after a while, but it'll tell us what sorts of lengths the to_chars results have in your compiler's implementation.

// Run a lot of "double" values through to_chars, see how long they are.
#include <array>
#include <charconv>
#include <cmath>
#include <iostream>
#include <system_error>

namespace
{
// Support values up to this long.
constexpr std::size_t max{100};

// For each length, how many values had this length?
using len_map = std::array<long, max>;

// Zero-initialise a len_map.
void clear(len_map &arr)
{
  for (auto &i : arr) i = 0;
}

// Print lengths found, from shortest to longest.
void dump(std::array<long, max> const &lens)
{
  for (std::size_t len{0}; len < max; ++len)
    if (lens[len] > 0) std::cout << len << " (" << lens[len] << ")\n";
  std::cout << '\n';
}
}

int main()
{
  std::array<char, max> buf;
  char *const buf_begin{buf.data()};
  char *const buf_end{buf_begin + buf.size()};
  len_map lens;

  // Go through "double" values from 0 to 0.5 exclusive.  Tally lengths.
  // Report statistics once every million steps.
  clear(lens);
  double x{0.0};
  while (x < 0.5)
  {
    for (int i{0}; i < 1'000'000; ++i)
    {
      auto const res{std::to_chars(buf.data(), buf_end, x)};
      if (res.ec != std::errc{})
      {
        std::cerr << "Error.\n";
    return 1;
      }
      auto const len{res.ptr - buf.data()};
      ++lens[len];
      x = std::nextafter(x, 1.0);
    }
    dump(lens);
  }
}
edwinvp commented 4 years ago

@jtv Of course! I have let it run for a couple of minutes. Then I got bored and stopped it. This is what it had collected:

1 (1)
6 (69)
8 (537)
9 (4559)
10 (37491)
11 (293907)
12 (2129073)
13 (13190735)
14 (50907337)
15 (47436291)

I then slightly modified the program a bit so instead of std::nextafter it would generate random byte values and cast that to a double. The idea behind this is that it might lead to some crazy values that we normally wouldn't think of.

The output then looked like this after a while:

3 (3646)
4 (3437)
9 (3401)
10 (3685)
13 (28)
14 (331)
15 (3187)
16 (34586)
17 (227731)
18 (406744)
19 (284892)
20 (396695)
21 (2893330)
22 (9201719)
23 (11086938)
24 (4449650)
GordonLElliott commented 4 years ago

@jtv , look at std::numeric_limits::max_digits10

(Note I may edit this, look back here...)

OK, looked myself, it says there:

Notes Unlike most mathematical operations, the conversion of a floating-point value to text and back is exact as long as at least max_digits10 were used (9 for float, 17 for double): it is guaranteed to produce the same floating-point value, even though the intermediate text representation is not exact. It may take over a hundred decimal digits to represent the precise value of a float in decimal notation.

What you say is technically correct only when working with integers saved as float/double. But generalized double needs a larger field. My calculations would be correct, but there should be a constant somewhere that figures that all out for floats with exponential representation. The 17 digits is then only what is necessary to present the mantissa (and then without the decimal point).

What I quoted does not explain my issue, but read between lines the 17 digits are required to accurately represent the mantissa. More characters represent the exponent, the decimal point itself, or if there are leading 0's like the initial case (which definitely is not normalized in decimal presentation meaning since "normalized" at least to me means 1.nnnn format). "Normalized" is not the right issue anyway, but rather are there other characters to change the power of 10, like leading zeros after decimal, or exponent.

PS, look back at the counting, the exponential that I gave had to have a buffer adjusted to 23 by experimental result, exactly the correct extra characters after the 17 mantissa characters.

GordonLElliott commented 4 years ago

Guys, I agree that @edwinvp 's "Monti Carlo" style simulation will do a better job of finding longer strings. Extending @jtv 's to find longer binary mantissa values could take 9 * 10^15 steps. IF each loop takes one microsecond, it will run for 285 years. I printed some of the early and the digits are only slowly growing since all at low end of a grouping. I'm going to intentionally find a more relevant starting point, instead of using a random generator, and then print out the actual results not just abstract lengths. REMEMBER also that a negative number will take another character!

GordonLElliott commented 4 years ago

Here is my experiment: (Very slightly modified version of @jtv 's experiment.)

// Run a lot of "double" values through to_chars, see how long they are.
#include <array>
#include <charconv>
#include <cmath>
#include <iostream>
#include <system_error>
#include <iomanip>

namespace
{
    // Support values up to this long.
    constexpr std::size_t max{ 100 };

    // For each length, how many values had this length?
    using len_map = std::array<long, max>;

    // Zero-initialise a len_map.
    void clear(len_map& arr)
    {
        for (auto& i : arr) i = 0;
    }

    // Print lengths found, from shortest to longest.
    void dump(std::array<long, max> const& lens)
    {
        for (std::size_t len{ 0 }; len < max; ++len)
            if (lens[len] > 0) std::cout << len << " (" << lens[len] << ")\n";
        std::cout << '\n';
    }
}

int main()
{
    std::array<char, max> buf;
    char* const buf_begin{ buf.data() };
    char* const buf_end{ buf_begin + buf.size() };
    len_map lens;
    bool doPrint = true;    // If true prints if count, else use test.
    int maxPrintCount = 5; // Set 0 for no print
    int countPrints=0;
    int lengthLongs = 23;   // 23 will be longest positive, 24 negative.
    int count = 0;

    // Go through "double" values, with various starting points [GLE].  Tally lengths.
    // Report statistics once every million steps.
    clear(lens);
    double x;// { 0.0 };
    const unsigned long long NEGATIVE = (1ULL << 63);
    const unsigned long long MINEXPONENT = (1ULL << 52);
    const unsigned long long FULLLENGTHMANTISSA = (1ULL << 51);

    // ************ EXPERIMENT INITIALIZATION ********************** //
    //unsigned long long first = FULLLENGTHMANTISSA | MINEXPONENT;
    //*(unsigned long long*)& x = first;
    x = 0.0001;
    // ************************************************************* //

    while (count++<10)
    {
        countPrints = maxPrintCount;
        for (int i{ 0 }; i < 1'000'000; ++i)
        {
            auto const res{ std::to_chars(buf.data(), buf_end, x) };
            if (res.ec != std::errc{})
            {
                std::cerr << "Error.\n";
                return 1;
            }
            auto const len{ res.ptr - buf.data() };
            ++lens[len];
            if ((countPrints > 0) && (doPrint || len>=lengthLongs)) {
                if (countPrints > 0) --countPrints;
                unsigned long long xu = *(unsigned long long*)&x;
                std::cout << "x:"<<std::hex << std::setw(16) << std::setfill('0') << xu
                    << std::dec << " " << x << " res:\"";
                for (char* c = buf.data(); c < res.ptr; ++c)
                    std::cout << *c;
                std::cout << "\" (" << len << ")" << std::endl;    // [GLE]
            }
            x = std::nextafter(x, 1.0);
        }
        dump(lens);
    }
}

I'll give results next, with various "EXPERIMENT INITIALIZATION".

SETUP: Visual Studio 2019 professional, C++ 17 standard.

GordonLElliott commented 4 years ago

With init:

    // ************ EXPERIMENT INITIALIZATION ********************** //
    //unsigned long long first = FULLLENGTHMANTISSA | MINEXPONENT;
    //*(unsigned long long*)& x = first;
    x = 0.0001;
    // ************************************************************* //

Last run result:

x:3f1a36e2eba5976d 0.0001 res:"0.00010000000012197275" (22)
x:3f1a36e2eba5976e 0.0001 res:"0.00010000000012197276" (22)
x:3f1a36e2eba5976f 0.0001 res:"0.00010000000012197278" (22)
x:3f1a36e2eba59770 0.0001 res:"0.00010000000012197279" (22)
x:3f1a36e2eba59771 0.0001 res:"0.0001000000001219728" (21)
5 (1)
15 (1)
16 (12)
17 (122)
18 (1220)
19 (12197)
20 (121973)
21 (1219727)
22 (8644747)

NOTE this is exactly 17 significant digits at the last, example "10000000012197279".

But with experiment;

    // ************ EXPERIMENT INITIALIZATION ********************** //
    //unsigned long long first = FULLLENGTHMANTISSA | MINEXPONENT;
    //*(unsigned long long*)& x = first;
    x = 0.00001;
    // ************************************************************* //

Result:

x:3ee4f8b5896cbd31 1e-05 res:"1.0000000015246594e-05" (22)
x:3ee4f8b5896cbd32 1e-05 res:"1.0000000015246596e-05" (22)
x:3ee4f8b5896cbd33 1e-05 res:"1.0000000015246597e-05" (22)
x:3ee4f8b5896cbd34 1e-05 res:"1.0000000015246599e-05" (22)
x:3ee4f8b5896cbd35 1e-05 res:"1.00000000152466e-05" (20)
5 (1)
15 (1)
16 (15)
17 (153)
18 (1525)
19 (15246)
20 (152466)
21 (1524659)
22 (8305934)

NOTE: This is also 17 significant digits: "10000000015246599".

Experiment:

    // ************ EXPERIMENT INITIALIZATION ********************** //
    unsigned long long first = FULLLENGTHMANTISSA | MINEXPONENT;
    *(unsigned long long*)& x = first;
    //x = 0.00001;
    // ************************************************************* //

Result:

x:0018000000895440 3.33761e-308 res:"3.337610792207393e-308" (22)
x:0018000000895441 3.33761e-308 res:"3.3376107922073934e-308" (23)
x:0018000000895442 3.33761e-308 res:"3.337610792207394e-308" (22)
x:0018000000895443 3.33761e-308 res:"3.3376107922073944e-308" (23)
x:0018000000895444 3.33761e-308 res:"3.337610792207395e-308" (22)
15 (1)
16 (4)
17 (45)
18 (444)
19 (4447)
20 (44465)
21 (444659)
22 (4446592)
23 (5059343)

Experiment:

    // ************ EXPERIMENT INITIALIZATION ********************** //
    unsigned long long first = FULLLENGTHMANTISSA | MINEXPONENT| NEGATIVE;
    *(unsigned long long*)& x = first;
    //x = 0.00001;
    // ************************************************************* //

Result:

x:8017ffffff76abc0 -3.33761e-308 res:"-3.3376107833142113e-308" (24)
x:8017ffffff76abbf -3.33761e-308 res:"-3.337610783314211e-308" (23)
x:8017ffffff76abbe -3.33761e-308 res:"-3.3376107833142103e-308" (24)
x:8017ffffff76abbd -3.33761e-308 res:"-3.33761078331421e-308" (22)
x:8017ffffff76abbc -3.33761e-308 res:"-3.3376107833142093e-308" (24)
17 (5)
18 (44)
19 (445)
20 (4446)
21 (44467)
22 (444659)
23 (4446591)
24 (5059343)

NOTE: 17 + 7 = 24.

Experiment:

    // ************ EXPERIMENT INITIALIZATION ********************** //
    //unsigned long long first = FULLLENGTHMANTISSA | MINEXPONENT| NEGATIVE;
    //*(unsigned long long*)& x = first;
    x = 0.0;
    // ************************************************************* //

Result:

x:0000000000895440 4.44659e-317 res:"4.446591e-317" (13)
x:0000000000895441 4.44659e-317 res:"4.4465913e-317" (14)
x:0000000000895442 4.44659e-317 res:"4.446592e-317" (13)
x:0000000000895443 4.44659e-317 res:"4.4465923e-317" (14)
x:0000000000895444 4.44659e-317 res:"4.446593e-317" (13)
1 (1)
6 (59)
8 (450)
9 (3687)
10 (28768)
11 (206682)
12 (1256821)
13 (4468212)
14 (4035320)

(This last one was going to present short strings for a very long time.)

Experiment:

    // ************ EXPERIMENT INITIALIZATION ********************** //
    //unsigned long long first = FULLLENGTHMANTISSA | MINEXPONENT| NEGATIVE;
    //*(unsigned long long*)& x = first;
    x = -1e-303;
    // ************************************************************* //

And line change required to get this result--change search direction:

            x = std::nextafter(x, -1.0);

Result:

x:8105f1ca828e6603 -1e-303 res:"-1.0000000014570588e-303" (24)
x:8105f1ca828e6604 -1e-303 res:"-1.000000001457059e-303" (23)
x:8105f1ca828e6605 -1e-303 res:"-1.0000000014570591e-303" (24)
x:8105f1ca828e6606 -1e-303 res:"-1.0000000014570593e-303" (24)
x:8105f1ca828e6607 -1e-303 res:"-1.0000000014570595e-303" (24)
7 (1)
17 (1)
18 (15)
19 (145)
20 (1457)
21 (14571)
22 (145706)
23 (1457059)
24 (8381045)

So can get the 24 character case--but not as easy as one would think, but at least didn't have to start with a binary constructed value!

Still producing 17 significant digit results: 10000000014570595.

I also printed the constant's values we were discussing, for my VS 2019:

std::numeric_limits<float>::max_digits10 9
std::numeric_limits<double>::max_digits10 17
GordonLElliott commented 4 years ago

I have learned a lot, BTW. First I learned that all the binary double precision values can be recovered with a short string. (24 characters.) Then the std::nextafter is very useful! I can use that in optimization processes that need to find an optimal representation in the discreet floating/double value system, by a short search near an almost optimal representation.

Regarding the PostgreSQL database, this means that floating and double values can be transmitted in character strings with no loss of any bits--I didn't know that.

PS: I reran the program on all the data cases, and added conversion back to double with stod(), and compare for exact equality. No failures in any case, always reconstructed the exact double value to the bit.

jtv commented 4 years ago

Thanks both for running these experiments.

It looks as if the maximum that we actually see is 24 bytes then. I'll have to extend the buffer size, although I still don't feel that we really know why we're seeing this particular upper bound. It may be a matter of significant digits (i.e. "mantissa" vs "overall value") but I see nothing in the language on cppreference to justify it.

I hate the idea of just throwing some extra bytes at the problem and not knowing whether we've solved the problem or just made it very rare. Or how to solve the same problem for long double. So I'd like to crack this mystery, but so far my internet searches have produced very little.

Another thing I hate about the situation is that the Short String Optimisation in the most popular standard-library implementations won't accommodate 24-byte strings. Which means that to_string(double) will need to return a std::string whose contents are allocated on the heap. Allocations are costly. And the long strings don't look rare enough that we can treat them as an exceptional case.

GordonLElliott commented 4 years ago

@jtv , it is specific to double (and long long in the integers, signed or unsigned). All the others will fit in 16. Can you make the implementation type dependent, so more efficient in all those others?

x:cccccccc80895440 -1.26117e-38 res:"-1.2611686e-38" (14)
x:cccccccc80895441 -1.26117e-38 res:"-1.2611688e-38" (14)
x:cccccccc80895442 -1.26117e-38 res:"-1.2611689e-38" (14)
x:cccccccc80895443 -1.26117e-38 res:"-1.261169e-38" (13)
x:cccccccc80895444 -1.26117e-38 res:"-1.2611692e-38" (14)
2 (1)
6 (61)
8 (464)
9 (3829)
10 (30183)
11 (220837)
12 (1398379)
13 (5883783)
14 (2462463)

std::numeric_limits<long>::max_digits10 0
std::numeric_limits<long long>::max_digits10 0
std::numeric_limits<T>::max_digits10 9

Here I typedef'ed T from float in above. ALSO note that the numeric_limits doesn't work on integers in my compiler, but did produce 17 on double.

Notice generally fits the pattern, except the longest 12611692 is 8 significant digits rather than 9. I presented the example strings of the worst cases. Then minus, decimal, 'e', minus, and then for float maximum of two decimal exponent. So 8+6=14 as the experiment gives, but I don't understand why the longest significant digits is 8 when numeric_limits gives 9. Even 3 digit exponent and significant digits 9 would give 9+7=16 so fits in 16 even in that worst case on some implementation of float.

On another note: http://www.cplusplus.com/reference/limits/numeric_limits/ says:

max_digits10 | int | Number of digits (in decimal base) required to ensure that values that differ are always differentiated.

Ignoring the 8 vs 9 issue (I don't understand yet need more experiments) we do understand that the issue is the signficant digits that it presents, plus two minus signs, plus decimal point, plus the number of digits in the exponent.

Also:

std::numeric_limits<T>::max_exponent10 308

(for double and long double) could be used to find the number of digits of the exponent. My VS2019 does not implement a long double that differs from double (and it doesn't like long long double).

GordonLElliott commented 4 years ago

Tried an experimental function:

template <typename T>
constexpr size_t exponentSize()
{
    const size_t es{ std::numeric_limits<T>::max_exponent10 };
    return
        es>=100000u ? 6 :   // This is getting out of hand... stop!
        es>=10000u ? 5 :
        es>=1000u ? 4 :
        es>=100u ? 3 :
        es>=10u ?2 :
        1
        ;
}

template <typename T>
constexpr size_t maxBufferRequired()
{
    return
        std::numeric_limits<T>::max_digits10 +  // Significant digits..
        1 +                 // Leading minus sign
        1 +                 // decimal point
        1 +                 // Exponent character 'e'
        1 +                 // Exponent's minus sign
        exponentSize<T>()   // Number of characters in Exponent
        ;
}

The result can be used to dimension an array with C++17 on my VS2019.

Results for double:

std::numeric_limits<T>::min() 2.22507e-308
std::numeric_limits<T>::max() 1.79769e+308
std::numeric_limits<T>::max_digits10 17
std::numeric_limits<T>::max_exponent10 308
maxBufferRequired<T>() 24

Results for float:

std::numeric_limits<T>::min() 1.17549e-38
std::numeric_limits<T>::max() 3.40282e+38
std::numeric_limits<T>::max_digits10 9
std::numeric_limits<T>::max_exponent10 38
maxBufferRequired<T>() 15

In case of float it is overestimating, I don't understand why the output uses 8 significant characters when it says it would need 9, but at least that is an overestimate compared to experimental.

GordonLElliott commented 4 years ago

This seems to work correctly for all the long double, double, float, long long, long, int, and even signed char types. However I don't know why the digits is one byte short, see the fix:

template <typename T>
constexpr size_t exponentSize()
{
    const size_t es{ std::numeric_limits<T>::max_exponent10 };
    return
        es>=100000u ? 6 :   // This is getting out of hand... stop!
        es>=10000u ? 5 :
        es>=1000u ? 4 :
        es>=100u ? 3 :
        es>=10u ?2 :
        1
        ;
}

template <typename T>
constexpr size_t maxBufferRequired()
{
    if (std::numeric_limits<T>::max_digits10 > 0)   // A floating type..
        return
        std::numeric_limits<T>::max_digits10 +  // Significant digits..
        1 +                 // Leading minus sign
        1 +                 // decimal point
        1 +                 // Exponent character 'e'
        1 +                 // Exponent's minus sign
        exponentSize<T>()   // Number of characters in Exponent
        ;
    else if (std::numeric_limits<T>::min() < 0)
        return
        std::numeric_limits<T>::digits10 +      // Significant digits..
        1 + // NO two ways about it, digits10 is wrong on VS 2019!
        1                   // Leading minus sign
        ;
    else
        return
        std::numeric_limits<T>::digits10 +      // Significant digits..
        1   // NO two ways about it, digits10 is wrong on VS 2019!
        // Note there is no minus sign
        ;
}

Of course on Visual Studio the long double is just double, so not really a test.

jtv commented 4 years ago

AFAICT max_exponent10 should basically reflect the number of decimal digits that the exponent can introduce plus the number of decimal digits that the mantissa can generate.

GordonLElliott commented 4 years ago

AFAICT max_exponent10 should basically reflect the number of decimal digits that the exponent can introduce plus the number of decimal digits that the mantissa can generate.

I disagree... The number of digits in the mantissa is unrelated to the maximum exponent base 10 -- that just scales the mantissa (whatever size) by powers of 10. If the mantissa is "normalized" then it is like 1.12345 up to 9.99999..., but if rolling over jumps back to 1.00000... and the exponent is increased. Naturally on 64 bit stored numbers they give more bits to both mantissa and to exponent (there in powers of 2) so the range is extended as compared to 32 bit. The max_exponent10 does "reflect" the maximum in the sense that the digits that are presented in exponential notation (2 or 3 digits typically) have their cound of digits established by the maximum integer value of that exponent--of course could be negative and needs negative exponent sign as well. See the example values in the runs I made. My code does correctly (whether the best way) and determines the number of digits, like <100 then 2 dignts, <1000 then 3 digits, etc.

However the number of significant digits that are to be presented in the mantissa really has absolutely nothing at all to do with the exponent base 10 at all. That is the minimum number of digits that are required so that the mantissa can be reconstructed in binary form for all values of the mantissa. So it is determined by the number of bits dedicated to mantissa. Now during conversion the exponent is changed to power of 2 for IEEE format, and that applies power of 2 scale factors, so the mantissa may not be the same exact mathematical value as the mantissa in the decimal exponential notation, and that is one of the issues to get enough digits so that always translates correctly.

JUST a note: The storage for the translation is determined by the exponential notation form. When it will fit into that same space and is readable it may convert to 0.000nnnn leading zero format, but will quickly change to exponential representation whend the number of leading zeros grows beyond about 3 or 4. Then on large numbers, the same for trailing digits (not usually 0's becaue the mantissa conversion from binary to decimal often has lots of extra non-zero values).

GordonLElliott commented 4 years ago

I set the program to start small (negative) double, and scale up by 4 X each level. Sorry for how long, but this gives a sense of the range of outputs. Notice that until it runs out of significant digits, you can observe the exact quadrupling each line, as powers of 4 x 10^-300. This also shows how the display algorithm does not waste printable characters when they are not needed for an exact presentation:

x:81a56e1fc2f8f359 -1e-300 res:"-1e-300" (7)
x:81c56e1fc2f8f359 -4e-300 res:"-4e-300" (7)
x:81e56e1fc2f8f359 -1.6e-299 res:"-1.6e-299" (9)
x:82056e1fc2f8f359 -6.4e-299 res:"-6.4e-299" (9)
x:82256e1fc2f8f359 -2.56e-298 res:"-2.56e-298" (10)
x:82456e1fc2f8f359 -1.024e-297 res:"-1.024e-297" (11)
x:82656e1fc2f8f359 -4.096e-297 res:"-4.096e-297" (11)
x:82856e1fc2f8f359 -1.6384e-296 res:"-1.6384e-296" (12)
x:82a56e1fc2f8f359 -6.5536e-296 res:"-6.5536e-296" (12)
x:82c56e1fc2f8f359 -2.62144e-295 res:"-2.62144e-295" (13)
x:82e56e1fc2f8f359 -1.04858e-294 res:"-1.048576e-294" (14)
x:83056e1fc2f8f359 -4.1943e-294 res:"-4.194304e-294" (14)
x:83256e1fc2f8f359 -1.67772e-293 res:"-1.6777216e-293" (15)
x:83456e1fc2f8f359 -6.71089e-293 res:"-6.7108864e-293" (15)
x:83656e1fc2f8f359 -2.68435e-292 res:"-2.68435456e-292" (16)
x:83856e1fc2f8f359 -1.07374e-291 res:"-1.073741824e-291" (17)
x:83a56e1fc2f8f359 -4.29497e-291 res:"-4.294967296e-291" (17)
x:83c56e1fc2f8f359 -1.71799e-290 res:"-1.7179869184e-290" (18)
x:83e56e1fc2f8f359 -6.87195e-290 res:"-6.8719476736e-290" (18)
x:84056e1fc2f8f359 -2.74878e-289 res:"-2.74877906944e-289" (19)
x:84256e1fc2f8f359 -1.09951e-288 res:"-1.099511627776e-288" (20)
x:84456e1fc2f8f359 -4.39805e-288 res:"-4.398046511104e-288" (20)
x:84656e1fc2f8f359 -1.75922e-287 res:"-1.7592186044416e-287" (21)
x:84856e1fc2f8f359 -7.03687e-287 res:"-7.0368744177664e-287" (21)
x:84a56e1fc2f8f359 -2.81475e-286 res:"-2.81474976710656e-286" (22)
x:84c56e1fc2f8f359 -1.1259e-285 res:"-1.125899906842624e-285" (23)
x:84e56e1fc2f8f359 -4.5036e-285 res:"-4.503599627370496e-285" (23)
x:85056e1fc2f8f359 -1.80144e-284 res:"-1.8014398509481984e-284" (24)
x:85256e1fc2f8f359 -7.20576e-284 res:"-7.205759403792794e-284" (23)
x:85456e1fc2f8f359 -2.8823e-283 res:"-2.8823037615171175e-283" (24)
x:85656e1fc2f8f359 -1.15292e-282 res:"-1.152921504606847e-282" (23)
x:85856e1fc2f8f359 -4.61169e-282 res:"-4.611686018427388e-282" (23)
x:85a56e1fc2f8f359 -1.84467e-281 res:"-1.8446744073709552e-281" (24)
x:85c56e1fc2f8f359 -7.3787e-281 res:"-7.378697629483821e-281" (23)
x:85e56e1fc2f8f359 -2.95148e-280 res:"-2.9514790517935283e-280" (24)
x:86056e1fc2f8f359 -1.18059e-279 res:"-1.1805916207174113e-279" (24)
x:86256e1fc2f8f359 -4.72237e-279 res:"-4.722366482869645e-279" (23)
x:86456e1fc2f8f359 -1.88895e-278 res:"-1.888946593147858e-278" (23)
x:86656e1fc2f8f359 -7.55579e-278 res:"-7.555786372591433e-278" (23)
x:86856e1fc2f8f359 -3.02231e-277 res:"-3.022314549036573e-277" (23)
x:86a56e1fc2f8f359 -1.20893e-276 res:"-1.2089258196146292e-276" (24)
x:86c56e1fc2f8f359 -4.8357e-276 res:"-4.835703278458517e-276" (23)
x:86e56e1fc2f8f359 -1.93428e-275 res:"-1.9342813113834067e-275" (24)
x:87056e1fc2f8f359 -7.73713e-275 res:"-7.737125245533627e-275" (23)
x:87256e1fc2f8f359 -3.09485e-274 res:"-3.094850098213451e-274" (23)
x:87456e1fc2f8f359 -1.23794e-273 res:"-1.2379400392853803e-273" (24)
x:87656e1fc2f8f359 -4.95176e-273 res:"-4.951760157141521e-273" (23)
x:87856e1fc2f8f359 -1.9807e-272 res:"-1.9807040628566085e-272" (24)
x:87a56e1fc2f8f359 -7.92282e-272 res:"-7.922816251426434e-272" (23)
x:87c56e1fc2f8f359 -3.16913e-271 res:"-3.1691265005705736e-271" (24)
x:87e56e1fc2f8f359 -1.26765e-270 res:"-1.2676506002282294e-270" (24)
x:88056e1fc2f8f359 -5.0706e-270 res:"-5.070602400912918e-270" (23)
x:88256e1fc2f8f359 -2.02824e-269 res:"-2.028240960365167e-269" (23)
x:88456e1fc2f8f359 -8.11296e-269 res:"-8.112963841460668e-269" (23)
x:88656e1fc2f8f359 -3.24519e-268 res:"-3.2451855365842673e-268" (24)
x:88856e1fc2f8f359 -1.29807e-267 res:"-1.298074214633707e-267" (23)
x:88a56e1fc2f8f359 -5.1923e-267 res:"-5.192296858534828e-267" (23)
x:88c56e1fc2f8f359 -2.07692e-266 res:"-2.076918743413931e-266" (23)
x:88e56e1fc2f8f359 -8.30767e-266 res:"-8.307674973655724e-266" (23)
x:89056e1fc2f8f359 -3.32307e-265 res:"-3.32306998946229e-265" (22)
x:89256e1fc2f8f359 -1.32923e-264 res:"-1.329227995784916e-264" (23)
x:89456e1fc2f8f359 -5.31691e-264 res:"-5.316911983139664e-264" (23)
x:89656e1fc2f8f359 -2.12676e-263 res:"-2.1267647932558654e-263" (24)
x:89856e1fc2f8f359 -8.50706e-263 res:"-8.507059173023462e-263" (23)
x:89a56e1fc2f8f359 -3.40282e-262 res:"-3.402823669209385e-262" (23)
x:89c56e1fc2f8f359 -1.36113e-261 res:"-1.361129467683754e-261" (23)
x:89e56e1fc2f8f359 -5.44452e-261 res:"-5.444517870735016e-261" (23)
x:8a056e1fc2f8f359 -2.17781e-260 res:"-2.1778071482940062e-260" (24)
x:8a256e1fc2f8f359 -8.71123e-260 res:"-8.711228593176025e-260" (23)
x:8a456e1fc2f8f359 -3.48449e-259 res:"-3.48449143727041e-259" (22)
x:8a656e1fc2f8f359 -1.3938e-258 res:"-1.393796574908164e-258" (23)
x:8a856e1fc2f8f359 -5.57519e-258 res:"-5.575186299632656e-258" (23)
x:8aa56e1fc2f8f359 -2.23007e-257 res:"-2.2300745198530624e-257" (24)
x:8ac56e1fc2f8f359 -8.9203e-257 res:"-8.92029807941225e-257" (22)
x:8ae56e1fc2f8f359 -3.56812e-256 res:"-3.5681192317649e-256" (21)
x:8b056e1fc2f8f359 -1.42725e-255 res:"-1.42724769270596e-255" (22)
x:8b256e1fc2f8f359 -5.70899e-255 res:"-5.70899077082384e-255" (22)
x:8b456e1fc2f8f359 -2.2836e-254 res:"-2.283596308329536e-254" (23)
x:8b656e1fc2f8f359 -9.13439e-254 res:"-9.134385233318143e-254" (23)
x:8b856e1fc2f8f359 -3.65375e-253 res:"-3.6537540933272574e-253" (24)
x:8ba56e1fc2f8f359 -1.4615e-252 res:"-1.461501637330903e-252" (23)
x:8bc56e1fc2f8f359 -5.84601e-252 res:"-5.846006549323612e-252" (23)
x:8be56e1fc2f8f359 -2.3384e-251 res:"-2.3384026197294447e-251" (24)
x:8c056e1fc2f8f359 -9.35361e-251 res:"-9.353610478917779e-251" (23)
x:8c256e1fc2f8f359 -3.74144e-250 res:"-3.7414441915671116e-250" (24)
x:8c456e1fc2f8f359 -1.49658e-249 res:"-1.4965776766268446e-249" (24)
x:8c656e1fc2f8f359 -5.98631e-249 res:"-5.9863107065073785e-249" (24)
x:8c856e1fc2f8f359 -2.39452e-248 res:"-2.3945242826029514e-248" (24)
x:8ca56e1fc2f8f359 -9.5781e-248 res:"-9.578097130411806e-248" (23)
x:8cc56e1fc2f8f359 -3.83124e-247 res:"-3.831238852164722e-247" (23)
x:8ce56e1fc2f8f359 -1.5325e-246 res:"-1.532495540865889e-246" (23)
x:8d056e1fc2f8f359 -6.12998e-246 res:"-6.129982163463556e-246" (23)
x:8d256e1fc2f8f359 -2.45199e-245 res:"-2.4519928653854222e-245" (24)
x:8d456e1fc2f8f359 -9.80797e-245 res:"-9.807971461541689e-245" (23)
x:8d656e1fc2f8f359 -3.92319e-244 res:"-3.9231885846166756e-244" (24)
x:8d856e1fc2f8f359 -1.56928e-243 res:"-1.5692754338466702e-243" (24)
x:8da56e1fc2f8f359 -6.2771e-243 res:"-6.277101735386681e-243" (23)
x:8dc56e1fc2f8f359 -2.51084e-242 res:"-2.5108406941546724e-242" (24)
x:8de56e1fc2f8f359 -1.00434e-241 res:"-1.004336277661869e-241" (23)
x:8e056e1fc2f8f359 -4.01735e-241 res:"-4.017345110647476e-241" (23)
x:8e256e1fc2f8f359 -1.60694e-240 res:"-1.6069380442589903e-240" (24)
x:8e456e1fc2f8f359 -6.42775e-240 res:"-6.427752177035961e-240" (23)
x:8e656e1fc2f8f359 -2.5711e-239 res:"-2.5711008708143845e-239" (24)
x:8e856e1fc2f8f359 -1.02844e-238 res:"-1.0284403483257538e-238" (24)
x:8ea56e1fc2f8f359 -4.11376e-238 res:"-4.113761393303015e-238" (23)
x:8ec56e1fc2f8f359 -1.6455e-237 res:"-1.645504557321206e-237" (23)
x:8ee56e1fc2f8f359 -6.58202e-237 res:"-6.582018229284824e-237" (23)
x:8f056e1fc2f8f359 -2.63281e-236 res:"-2.6328072917139297e-236" (24)
x:8f256e1fc2f8f359 -1.05312e-235 res:"-1.0531229166855719e-235" (24)
x:8f456e1fc2f8f359 -4.21249e-235 res:"-4.2124916667422876e-235" (24)
x:8f656e1fc2f8f359 -1.685e-234 res:"-1.684996666696915e-234" (23)
x:8f856e1fc2f8f359 -6.73999e-234 res:"-6.73998666678766e-234" (22)
x:8fa56e1fc2f8f359 -2.69599e-233 res:"-2.695994666715064e-233" (23)
x:8fc56e1fc2f8f359 -1.0784e-232 res:"-1.0783978666860256e-232" (24)
x:8fe56e1fc2f8f359 -4.31359e-232 res:"-4.3135914667441025e-232" (24)
x:90056e1fc2f8f359 -1.72544e-231 res:"-1.725436586697641e-231" (23)
x:90256e1fc2f8f359 -6.90175e-231 res:"-6.901746346790564e-231" (23)
x:90456e1fc2f8f359 -2.7607e-230 res:"-2.7606985387162256e-230" (24)
x:90656e1fc2f8f359 -1.10428e-229 res:"-1.1042794154864902e-229" (24)
x:90856e1fc2f8f359 -4.41712e-229 res:"-4.417117661945961e-229" (23)
x:90a56e1fc2f8f359 -1.76685e-228 res:"-1.7668470647783844e-228" (24)
x:90c56e1fc2f8f359 -7.06739e-228 res:"-7.067388259113537e-228" (23)
x:90e56e1fc2f8f359 -2.82696e-227 res:"-2.826955303645415e-227" (23)
x:91056e1fc2f8f359 -1.13078e-226 res:"-1.130782121458166e-226" (23)
x:91256e1fc2f8f359 -4.52313e-226 res:"-4.523128485832664e-226" (23)
x:91456e1fc2f8f359 -1.80925e-225 res:"-1.8092513943330656e-225" (24)
x:91656e1fc2f8f359 -7.23701e-225 res:"-7.237005577332262e-225" (23)
x:91856e1fc2f8f359 -2.8948e-224 res:"-2.894802230932905e-224" (23)
x:91a56e1fc2f8f359 -1.15792e-223 res:"-1.157920892373162e-223" (23)
x:91c56e1fc2f8f359 -4.63168e-223 res:"-4.631683569492648e-223" (23)
x:91e56e1fc2f8f359 -1.85267e-222 res:"-1.8526734277970592e-222" (24)
x:92056e1fc2f8f359 -7.41069e-222 res:"-7.410693711188237e-222" (23)
x:92256e1fc2f8f359 -2.96428e-221 res:"-2.9642774844752947e-221" (24)
x:92456e1fc2f8f359 -1.18571e-220 res:"-1.1857109937901179e-220" (24)
x:92656e1fc2f8f359 -4.74284e-220 res:"-4.7428439751604715e-220" (24)
x:92856e1fc2f8f359 -1.89714e-219 res:"-1.8971375900641886e-219" (24)
x:92a56e1fc2f8f359 -7.58855e-219 res:"-7.588550360256754e-219" (23)
x:92c56e1fc2f8f359 -3.03542e-218 res:"-3.035420144102702e-218" (23)
x:92e56e1fc2f8f359 -1.21417e-217 res:"-1.2141680576410807e-217" (24)
x:93056e1fc2f8f359 -4.85667e-217 res:"-4.856672230564323e-217" (23)
x:93256e1fc2f8f359 -1.94267e-216 res:"-1.942668892225729e-216" (23)
x:93456e1fc2f8f359 -7.77068e-216 res:"-7.770675568902916e-216" (23)
x:93656e1fc2f8f359 -3.10827e-215 res:"-3.1082702275611666e-215" (24)
x:93856e1fc2f8f359 -1.24331e-214 res:"-1.2433080910244666e-214" (24)
x:93a56e1fc2f8f359 -4.97323e-214 res:"-4.9732323640978665e-214" (24)
x:93c56e1fc2f8f359 -1.98929e-213 res:"-1.9892929456391466e-213" (24)
x:93e56e1fc2f8f359 -7.95717e-213 res:"-7.957171782556586e-213" (23)
x:94056e1fc2f8f359 -3.18287e-212 res:"-3.1828687130226346e-212" (24)
x:94256e1fc2f8f359 -1.27315e-211 res:"-1.2731474852090538e-211" (24)
x:94456e1fc2f8f359 -5.09259e-211 res:"-5.092589940836215e-211" (23)
x:94656e1fc2f8f359 -2.03704e-210 res:"-2.037035976334486e-210" (23)
x:94856e1fc2f8f359 -8.14814e-210 res:"-8.148143905337945e-210" (23)
x:94a56e1fc2f8f359 -3.25926e-209 res:"-3.259257562135178e-209" (23)
x:94c56e1fc2f8f359 -1.3037e-208 res:"-1.3037030248540711e-208" (24)
x:94e56e1fc2f8f359 -5.21481e-208 res:"-5.2148120994162845e-208" (24)
x:95056e1fc2f8f359 -2.08592e-207 res:"-2.0859248397665138e-207" (24)
x:95256e1fc2f8f359 -8.3437e-207 res:"-8.343699359066055e-207" (23)
x:95456e1fc2f8f359 -3.33748e-206 res:"-3.337479743626422e-206" (23)
x:95656e1fc2f8f359 -1.33499e-205 res:"-1.3349918974505688e-205" (24)
x:95856e1fc2f8f359 -5.33997e-205 res:"-5.339967589802275e-205" (23)
x:95a56e1fc2f8f359 -2.13599e-204 res:"-2.13598703592091e-204" (22)
x:95c56e1fc2f8f359 -8.54395e-204 res:"-8.54394814368364e-204" (22)
x:95e56e1fc2f8f359 -3.41758e-203 res:"-3.417579257473456e-203" (23)
x:96056e1fc2f8f359 -1.36703e-202 res:"-1.3670317029893825e-202" (24)
x:96256e1fc2f8f359 -5.46813e-202 res:"-5.46812681195753e-202" (22)
x:96456e1fc2f8f359 -2.18725e-201 res:"-2.187250724783012e-201" (23)
x:96656e1fc2f8f359 -8.749e-201 res:"-8.749002899132048e-201" (23)
x:96856e1fc2f8f359 -3.4996e-200 res:"-3.499601159652819e-200" (23)
x:96a56e1fc2f8f359 -1.39984e-199 res:"-1.3998404638611277e-199" (24)
x:96c56e1fc2f8f359 -5.59936e-199 res:"-5.599361855444511e-199" (23)
x:96e56e1fc2f8f359 -2.23974e-198 res:"-2.2397447421778043e-198" (24)
x:97056e1fc2f8f359 -8.95898e-198 res:"-8.958978968711217e-198" (23)
x:97256e1fc2f8f359 -3.58359e-197 res:"-3.583591587484487e-197" (23)
x:97456e1fc2f8f359 -1.43344e-196 res:"-1.4334366349937947e-196" (24)
x:97656e1fc2f8f359 -5.73375e-196 res:"-5.733746539975179e-196" (23)
x:97856e1fc2f8f359 -2.2935e-195 res:"-2.2934986159900716e-195" (24)
x:97a56e1fc2f8f359 -9.17399e-195 res:"-9.173994463960286e-195" (23)
x:97c56e1fc2f8f359 -3.6696e-194 res:"-3.6695977855841145e-194" (24)
x:97e56e1fc2f8f359 -1.46784e-193 res:"-1.4678391142336458e-193" (24)
x:98056e1fc2f8f359 -5.87136e-193 res:"-5.871356456934583e-193" (23)
x:98256e1fc2f8f359 -2.34854e-192 res:"-2.3485425827738333e-192" (24)
x:98456e1fc2f8f359 -9.39417e-192 res:"-9.394170331095333e-192" (23)
x:98656e1fc2f8f359 -3.75767e-191 res:"-3.757668132438133e-191" (23)
x:98856e1fc2f8f359 -1.50307e-190 res:"-1.5030672529752533e-190" (24)
x:98a56e1fc2f8f359 -6.01227e-190 res:"-6.012269011901013e-190" (23)
x:98c56e1fc2f8f359 -2.40491e-189 res:"-2.4049076047604053e-189" (24)
x:98e56e1fc2f8f359 -9.61963e-189 res:"-9.619630419041621e-189" (23)
x:99056e1fc2f8f359 -3.84785e-188 res:"-3.8478521676166485e-188" (24)
x:99256e1fc2f8f359 -1.53914e-187 res:"-1.5391408670466594e-187" (24)
x:99456e1fc2f8f359 -6.15656e-187 res:"-6.156563468186638e-187" (23)
x:99656e1fc2f8f359 -2.46263e-186 res:"-2.462625387274655e-186" (23)
x:99856e1fc2f8f359 -9.8505e-186 res:"-9.85050154909862e-186" (22)
x:99a56e1fc2f8f359 -3.9402e-185 res:"-3.940200619639448e-185" (23)
x:99c56e1fc2f8f359 -1.57608e-184 res:"-1.5760802478557792e-184" (24)
x:99e56e1fc2f8f359 -6.30432e-184 res:"-6.304320991423117e-184" (23)
x:9a056e1fc2f8f359 -2.52173e-183 res:"-2.5217283965692467e-183" (24)
x:9a256e1fc2f8f359 -1.00869e-182 res:"-1.0086913586276987e-182" (24)
x:9a456e1fc2f8f359 -4.03477e-182 res:"-4.034765434510795e-182" (23)
x:9a656e1fc2f8f359 -1.61391e-181 res:"-1.613906173804318e-181" (23)
x:9a856e1fc2f8f359 -6.45562e-181 res:"-6.455624695217272e-181" (23)
x:9aa56e1fc2f8f359 -2.58225e-180 res:"-2.5822498780869087e-180" (24)
x:9ac56e1fc2f8f359 -1.0329e-179 res:"-1.0328999512347635e-179" (24)
x:9ae56e1fc2f8f359 -4.1316e-179 res:"-4.131599804939054e-179" (23)
x:9b056e1fc2f8f359 -1.65264e-178 res:"-1.6526399219756215e-178" (24)
x:9b256e1fc2f8f359 -6.61056e-178 res:"-6.610559687902486e-178" (23)
x:9b456e1fc2f8f359 -2.64422e-177 res:"-2.6442238751609945e-177" (24)
x:9b656e1fc2f8f359 -1.05769e-176 res:"-1.0576895500643978e-176" (24)
x:9b856e1fc2f8f359 -4.23076e-176 res:"-4.230758200257591e-176" (23)
x:9ba56e1fc2f8f359 -1.6923e-175 res:"-1.6923032801030365e-175" (24)
x:9bc56e1fc2f8f359 -6.76921e-175 res:"-6.769213120412146e-175" (23)
x:9be56e1fc2f8f359 -2.70769e-174 res:"-2.7076852481648583e-174" (24)
x:9c056e1fc2f8f359 -1.08307e-173 res:"-1.0830740992659433e-173" (24)
x:9c256e1fc2f8f359 -4.3323e-173 res:"-4.332296397063773e-173" (23)
x:9c456e1fc2f8f359 -1.73292e-172 res:"-1.7329185588255093e-172" (24)
x:9c656e1fc2f8f359 -6.93167e-172 res:"-6.931674235302037e-172" (23)
x:9c856e1fc2f8f359 -2.77267e-171 res:"-2.772669694120815e-171" (23)
x:9ca56e1fc2f8f359 -1.10907e-170 res:"-1.109067877648326e-170" (23)
x:9cc56e1fc2f8f359 -4.43627e-170 res:"-4.436271510593304e-170" (23)
x:9ce56e1fc2f8f359 -1.77451e-169 res:"-1.7745086042373216e-169" (24)
x:9d056e1fc2f8f359 -7.09803e-169 res:"-7.098034416949286e-169" (23)
x:9d256e1fc2f8f359 -2.83921e-168 res:"-2.8392137667797145e-168" (24)
x:9d456e1fc2f8f359 -1.13569e-167 res:"-1.1356855067118858e-167" (24)
x:9d656e1fc2f8f359 -4.54274e-167 res:"-4.542742026847543e-167" (23)
x:9d856e1fc2f8f359 -1.8171e-166 res:"-1.8170968107390173e-166" (24)
x:9da56e1fc2f8f359 -7.26839e-166 res:"-7.268387242956069e-166" (23)
x:9dc56e1fc2f8f359 -2.90735e-165 res:"-2.9073548971824276e-165" (24)
x:9de56e1fc2f8f359 -1.16294e-164 res:"-1.162941958872971e-164" (23)
x:9e056e1fc2f8f359 -4.65177e-164 res:"-4.651767835491884e-164" (23)
x:9e256e1fc2f8f359 -1.86071e-163 res:"-1.8607071341967537e-163" (24)
x:9e456e1fc2f8f359 -7.44283e-163 res:"-7.442828536787015e-163" (23)
x:9e656e1fc2f8f359 -2.97713e-162 res:"-2.977131414714806e-162" (23)
x:9e856e1fc2f8f359 -1.19085e-161 res:"-1.1908525658859224e-161" (24)
x:9ea56e1fc2f8f359 -4.76341e-161 res:"-4.7634102635436894e-161" (24)
x:9ec56e1fc2f8f359 -1.90536e-160 res:"-1.9053641054174758e-160" (24)
x:9ee56e1fc2f8f359 -7.62146e-160 res:"-7.621456421669903e-160" (23)
x:9f056e1fc2f8f359 -3.04858e-159 res:"-3.048582568667961e-159" (23)
x:9f256e1fc2f8f359 -1.21943e-158 res:"-1.2194330274671845e-158" (24)
x:9f456e1fc2f8f359 -4.87773e-158 res:"-4.877732109868738e-158" (23)
x:9f656e1fc2f8f359 -1.95109e-157 res:"-1.9510928439474952e-157" (24)
x:9f856e1fc2f8f359 -7.80437e-157 res:"-7.804371375789981e-157" (23)
x:9fa56e1fc2f8f359 -3.12175e-156 res:"-3.1217485503159923e-156" (24)
x:9fc56e1fc2f8f359 -1.2487e-155 res:"-1.248699420126397e-155" (23)
x:9fe56e1fc2f8f359 -4.9948e-155 res:"-4.994797680505588e-155" (23)
x:a0056e1fc2f8f359 -1.99792e-154 res:"-1.997919072202235e-154" (23)
x:a0256e1fc2f8f359 -7.99168e-154 res:"-7.99167628880894e-154" (22)
x:a0456e1fc2f8f359 -3.19667e-153 res:"-3.196670515523576e-153" (23)
x:a0656e1fc2f8f359 -1.27867e-152 res:"-1.2786682062094305e-152" (24)
x:a0856e1fc2f8f359 -5.11467e-152 res:"-5.114672824837722e-152" (23)
x:a0a56e1fc2f8f359 -2.04587e-151 res:"-2.0458691299350887e-151" (24)
x:a0c56e1fc2f8f359 -8.18348e-151 res:"-8.183476519740355e-151" (23)
x:a0e56e1fc2f8f359 -3.27339e-150 res:"-3.273390607896142e-150" (23)
x:a1056e1fc2f8f359 -1.30936e-149 res:"-1.3093562431584568e-149" (24)
x:a1256e1fc2f8f359 -5.23742e-149 res:"-5.237424972633827e-149" (23)
x:a1456e1fc2f8f359 -2.09497e-148 res:"-2.094969989053531e-148" (23)
x:a1656e1fc2f8f359 -8.37988e-148 res:"-8.379879956214123e-148" (23)
x:a1856e1fc2f8f359 -3.35195e-147 res:"-3.3519519824856494e-147" (24)
x:a1a56e1fc2f8f359 -1.34078e-146 res:"-1.3407807929942597e-146" (24)
x:a1c56e1fc2f8f359 -5.36312e-146 res:"-5.363123171977039e-146" (23)
x:a1e56e1fc2f8f359 -2.14525e-145 res:"-2.1452492687908156e-145" (24)
x:a2056e1fc2f8f359 -8.581e-145 res:"-8.580997075163262e-145" (23)
x:a2256e1fc2f8f359 -3.4324e-144 res:"-3.432398830065305e-144" (23)
x:a2456e1fc2f8f359 -1.37296e-143 res:"-1.372959532026122e-143" (23)
x:a2656e1fc2f8f359 -5.49184e-143 res:"-5.491838128104488e-143" (23)
x:a2856e1fc2f8f359 -2.19674e-142 res:"-2.196735251241795e-142" (23)
x:a2a56e1fc2f8f359 -8.78694e-142 res:"-8.78694100496718e-142" (22)
x:a2c56e1fc2f8f359 -3.51478e-141 res:"-3.514776401986872e-141" (23)
x:a2e56e1fc2f8f359 -1.40591e-140 res:"-1.405910560794749e-140" (23)
x:a3056e1fc2f8f359 -5.62364e-140 res:"-5.623642243178996e-140" (23)
x:a3256e1fc2f8f359 -2.24946e-139 res:"-2.2494568972715982e-139" (24)
x:a3456e1fc2f8f359 -8.99783e-139 res:"-8.997827589086393e-139" (23)
x:a3656e1fc2f8f359 -3.59913e-138 res:"-3.599131035634557e-138" (23)
x:a3856e1fc2f8f359 -1.43965e-137 res:"-1.4396524142538229e-137" (24)
x:a3a56e1fc2f8f359 -5.75861e-137 res:"-5.7586096570152915e-137" (24)
x:a3c56e1fc2f8f359 -2.30344e-136 res:"-2.3034438628061166e-136" (24)
x:a3e56e1fc2f8f359 -9.21378e-136 res:"-9.213775451224466e-136" (23)
x:a4056e1fc2f8f359 -3.68551e-135 res:"-3.6855101804897866e-135" (24)
x:a4256e1fc2f8f359 -1.4742e-134 res:"-1.4742040721959146e-134" (24)
x:a4456e1fc2f8f359 -5.89682e-134 res:"-5.8968162887836585e-134" (24)
x:a4656e1fc2f8f359 -2.35873e-133 res:"-2.3587265155134634e-133" (24)
x:a4856e1fc2f8f359 -9.43491e-133 res:"-9.434906062053854e-133" (23)
x:a4a56e1fc2f8f359 -3.77396e-132 res:"-3.7739624248215414e-132" (24)
x:a4c56e1fc2f8f359 -1.50958e-131 res:"-1.5095849699286166e-131" (24)
x:a4e56e1fc2f8f359 -6.03834e-131 res:"-6.038339879714466e-131" (23)
x:a5056e1fc2f8f359 -2.41534e-130 res:"-2.4153359518857865e-130" (24)
x:a5256e1fc2f8f359 -9.66134e-130 res:"-9.661343807543146e-130" (23)
x:a5456e1fc2f8f359 -3.86454e-129 res:"-3.8645375230172584e-129" (24)
x:a5656e1fc2f8f359 -1.54582e-128 res:"-1.5458150092069034e-128" (24)
x:a5856e1fc2f8f359 -6.18326e-128 res:"-6.183260036827614e-128" (23)
x:a5a56e1fc2f8f359 -2.4733e-127 res:"-2.4733040147310454e-127" (24)
x:a5c56e1fc2f8f359 -9.89322e-127 res:"-9.893216058924182e-127" (23)
x:a5e56e1fc2f8f359 -3.95729e-126 res:"-3.9572864235696726e-126" (24)
x:a6056e1fc2f8f359 -1.58291e-125 res:"-1.582914569427869e-125" (23)
x:a6256e1fc2f8f359 -6.33166e-125 res:"-6.331658277711476e-125" (23)
x:a6456e1fc2f8f359 -2.53266e-124 res:"-2.5326633110845905e-124" (24)
x:a6656e1fc2f8f359 -1.01307e-123 res:"-1.0130653244338362e-123" (24)
x:a6856e1fc2f8f359 -4.05226e-123 res:"-4.052261297735345e-123" (23)
x:a6a56e1fc2f8f359 -1.6209e-122 res:"-1.620904519094138e-122" (23)
x:a6c56e1fc2f8f359 -6.48362e-122 res:"-6.483618076376552e-122" (23)
x:a6e56e1fc2f8f359 -2.59345e-121 res:"-2.5934472305506207e-121" (24)
x:a7056e1fc2f8f359 -1.03738e-120 res:"-1.0373788922202483e-120" (24)
x:a7256e1fc2f8f359 -4.14952e-120 res:"-4.149515568880993e-120" (23)
x:a7456e1fc2f8f359 -1.65981e-119 res:"-1.6598062275523972e-119" (24)
x:a7656e1fc2f8f359 -6.63922e-119 res:"-6.639224910209589e-119" (23)
x:a7856e1fc2f8f359 -2.65569e-118 res:"-2.6556899640838356e-118" (24)
x:a7a56e1fc2f8f359 -1.06228e-117 res:"-1.0622759856335342e-117" (24)
x:a7c56e1fc2f8f359 -4.2491e-117 res:"-4.249103942534137e-117" (23)
x:a7e56e1fc2f8f359 -1.69964e-116 res:"-1.6996415770136548e-116" (24)
x:a8056e1fc2f8f359 -6.79857e-116 res:"-6.798566308054619e-116" (23)
x:a8256e1fc2f8f359 -2.71943e-115 res:"-2.7194265232218476e-115" (24)
x:a8456e1fc2f8f359 -1.08777e-114 res:"-1.087770609288739e-114" (23)
x:a8656e1fc2f8f359 -4.35108e-114 res:"-4.351082437154956e-114" (23)
x:a8856e1fc2f8f359 -1.74043e-113 res:"-1.7404329748619825e-113" (24)
x:a8a56e1fc2f8f359 -6.96173e-113 res:"-6.96173189944793e-113" (22)
x:a8c56e1fc2f8f359 -2.78469e-112 res:"-2.784692759779172e-112" (23)
x:a8e56e1fc2f8f359 -1.11388e-111 res:"-1.1138771039116688e-111" (24)
x:a9056e1fc2f8f359 -4.45551e-111 res:"-4.455508415646675e-111" (23)
x:a9256e1fc2f8f359 -1.7822e-110 res:"-1.78220336625867e-110" (22)
x:a9456e1fc2f8f359 -7.12881e-110 res:"-7.12881346503468e-110" (22)
x:a9656e1fc2f8f359 -2.85153e-109 res:"-2.851525386013872e-109" (23)
x:a9856e1fc2f8f359 -1.14061e-108 res:"-1.1406101544055488e-108" (24)
x:a9a56e1fc2f8f359 -4.56244e-108 res:"-4.562440617622195e-108" (23)
x:a9c56e1fc2f8f359 -1.82498e-107 res:"-1.824976247048878e-107" (23)
x:a9e56e1fc2f8f359 -7.2999e-107 res:"-7.299904988195513e-107" (23)
x:aa056e1fc2f8f359 -2.91996e-106 res:"-2.919961995278205e-106" (23)
x:aa256e1fc2f8f359 -1.16798e-105 res:"-1.167984798111282e-105" (23)
x:aa456e1fc2f8f359 -4.67194e-105 res:"-4.671939192445128e-105" (23)
x:aa656e1fc2f8f359 -1.86878e-104 res:"-1.8687756769780512e-104" (24)
x:aa856e1fc2f8f359 -7.4751e-104 res:"-7.475102707912205e-104" (23)
x:aaa56e1fc2f8f359 -2.99004e-103 res:"-2.990041083164882e-103" (23)
x:aac56e1fc2f8f359 -1.19602e-102 res:"-1.1960164332659528e-102" (24)
x:aae56e1fc2f8f359 -4.78407e-102 res:"-4.784065733063811e-102" (23)
x:ab056e1fc2f8f359 -1.91363e-101 res:"-1.9136262932255244e-101" (24)
x:ab256e1fc2f8f359 -7.65451e-101 res:"-7.654505172902098e-101" (23)
x:ab456e1fc2f8f359 -3.0618e-100 res:"-3.061802069160839e-100" (23)
x:ab656e1fc2f8f359 -1.22472e-99 res:"-1.2247208276643356e-99" (23)
x:ab856e1fc2f8f359 -4.89888e-99 res:"-4.8988833106573426e-99" (23)
x:aba56e1fc2f8f359 -1.95955e-98 res:"-1.959553324262937e-98" (22)
x:abc56e1fc2f8f359 -7.83821e-98 res:"-7.838213297051748e-98" (22)
x:abe56e1fc2f8f359 -3.13529e-97 res:"-3.135285318820699e-97" (22)
x:ac056e1fc2f8f359 -1.25411e-96 res:"-1.2541141275282797e-96" (23)
x:ac256e1fc2f8f359 -5.01646e-96 res:"-5.016456510113119e-96" (22)
x:ac456e1fc2f8f359 -2.00658e-95 res:"-2.0065826040452475e-95" (23)
x:ac656e1fc2f8f359 -8.02633e-95 res:"-8.02633041618099e-95" (21)
x:ac856e1fc2f8f359 -3.21053e-94 res:"-3.210532166472396e-94" (22)
x:aca56e1fc2f8f359 -1.28421e-93 res:"-1.2842128665889584e-93" (23)
x:acc56e1fc2f8f359 -5.13685e-93 res:"-5.136851466355834e-93" (22)
x:ace56e1fc2f8f359 -2.05474e-92 res:"-2.0547405865423335e-92" (23)
x:ad056e1fc2f8f359 -8.21896e-92 res:"-8.218962346169334e-92" (22)
x:ad256e1fc2f8f359 -3.28758e-91 res:"-3.2875849384677335e-91" (23)
x:ad456e1fc2f8f359 -1.31503e-90 res:"-1.3150339753870934e-90" (23)
x:ad656e1fc2f8f359 -5.26014e-90 res:"-5.260135901548374e-90" (22)
x:ad856e1fc2f8f359 -2.10405e-89 res:"-2.1040543606193495e-89" (23)
x:ada56e1fc2f8f359 -8.41622e-89 res:"-8.416217442477398e-89" (22)
x:adc56e1fc2f8f359 -3.36649e-88 res:"-3.366486976990959e-88" (22)
x:ade56e1fc2f8f359 -1.34659e-87 res:"-1.3465947907963837e-87" (23)
x:ae056e1fc2f8f359 -5.38638e-87 res:"-5.386379163185535e-87" (22)
x:ae256e1fc2f8f359 -2.15455e-86 res:"-2.154551665274214e-86" (22)
x:ae456e1fc2f8f359 -8.61821e-86 res:"-8.618206661096855e-86" (22)
x:ae656e1fc2f8f359 -3.44728e-85 res:"-3.447282664438742e-85" (22)
x:ae856e1fc2f8f359 -1.37891e-84 res:"-1.3789130657754969e-84" (23)
x:aea56e1fc2f8f359 -5.51565e-84 res:"-5.515652263101987e-84" (22)
x:aec56e1fc2f8f359 -2.20626e-83 res:"-2.206260905240795e-83" (22)
x:aee56e1fc2f8f359 -8.82504e-83 res:"-8.82504362096318e-83" (21)
x:af056e1fc2f8f359 -3.53002e-82 res:"-3.530017448385272e-82" (22)
x:af256e1fc2f8f359 -1.41201e-81 res:"-1.4120069793541088e-81" (23)
x:af456e1fc2f8f359 -5.64803e-81 res:"-5.648027917416435e-81" (22)
x:af656e1fc2f8f359 -2.25921e-80 res:"-2.259211166966574e-80" (22)
x:af856e1fc2f8f359 -9.03684e-80 res:"-9.036844667866296e-80" (22)
x:afa56e1fc2f8f359 -3.61474e-79 res:"-3.6147378671465185e-79" (23)
x:afc56e1fc2f8f359 -1.4459e-78 res:"-1.4458951468586074e-78" (23)
x:afe56e1fc2f8f359 -5.78358e-78 res:"-5.78358058743443e-78" (21)
x:b0056e1fc2f8f359 -2.31343e-77 res:"-2.313432234973772e-77" (22)
x:b0256e1fc2f8f359 -9.25373e-77 res:"-9.253728939895087e-77" (22)
x:b0456e1fc2f8f359 -3.70149e-76 res:"-3.701491575958035e-76" (22)
x:b0656e1fc2f8f359 -1.4806e-75 res:"-1.480596630383214e-75" (22)
x:b0856e1fc2f8f359 -5.92239e-75 res:"-5.922386521532856e-75" (22)
x:b0a56e1fc2f8f359 -2.36895e-74 res:"-2.3689546086131424e-74" (23)
x:b0c56e1fc2f8f359 -9.47582e-74 res:"-9.47581843445257e-74" (21)
x:b0e56e1fc2f8f359 -3.79033e-73 res:"-3.790327373781028e-73" (22)
x:b1056e1fc2f8f359 -1.51613e-72 res:"-1.516130949512411e-72" (22)
x:b1256e1fc2f8f359 -6.06452e-72 res:"-6.064523798049644e-72" (22)
x:b1456e1fc2f8f359 -2.42581e-71 res:"-2.4258095192198578e-71" (23)
x:b1656e1fc2f8f359 -9.70324e-71 res:"-9.703238076879431e-71" (22)
x:b1856e1fc2f8f359 -3.8813e-70 res:"-3.8812952307517724e-70" (23)
x:b1a56e1fc2f8f359 -1.55252e-69 res:"-1.552518092300709e-69" (22)
x:b1c56e1fc2f8f359 -6.21007e-69 res:"-6.210072369202836e-69" (22)
x:b1e56e1fc2f8f359 -2.48403e-68 res:"-2.4840289476811344e-68" (23)
x:b2056e1fc2f8f359 -9.93612e-68 res:"-9.936115790724537e-68" (22)
x:b2256e1fc2f8f359 -3.97445e-67 res:"-3.974446316289815e-67" (22)
x:b2456e1fc2f8f359 -1.58978e-66 res:"-1.589778526515926e-66" (22)
x:b2656e1fc2f8f359 -6.35911e-66 res:"-6.359114106063704e-66" (22)
x:b2856e1fc2f8f359 -2.54365e-65 res:"-2.5436456424254816e-65" (23)
x:b2a56e1fc2f8f359 -1.01746e-64 res:"-1.0174582569701926e-64" (23)
x:b2c56e1fc2f8f359 -4.06983e-64 res:"-4.0698330278807705e-64" (23)
x:b2e56e1fc2f8f359 -1.62793e-63 res:"-1.6279332111523082e-63" (23)
x:b3056e1fc2f8f359 -6.51173e-63 res:"-6.511732844609233e-63" (22)
x:b3256e1fc2f8f359 -2.60469e-62 res:"-2.604693137843693e-62" (22)
x:b3456e1fc2f8f359 -1.04188e-61 res:"-1.0418772551374773e-61" (23)
x:b3656e1fc2f8f359 -4.16751e-61 res:"-4.167509020549909e-61" (22)
x:b3856e1fc2f8f359 -1.667e-60 res:"-1.6670036082199636e-60" (23)
x:b3a56e1fc2f8f359 -6.66801e-60 res:"-6.668014432879854e-60" (22)
x:b3c56e1fc2f8f359 -2.66721e-59 res:"-2.6672057731519418e-59" (23)
x:b3e56e1fc2f8f359 -1.06688e-58 res:"-1.0668823092607767e-58" (23)
x:b4056e1fc2f8f359 -4.26753e-58 res:"-4.267529237043107e-58" (22)
x:b4256e1fc2f8f359 -1.70701e-57 res:"-1.7070116948172427e-57" (23)
x:b4456e1fc2f8f359 -6.82805e-57 res:"-6.828046779268971e-57" (22)
x:b4656e1fc2f8f359 -2.73122e-56 res:"-2.7312187117075884e-56" (23)
x:b4856e1fc2f8f359 -1.09249e-55 res:"-1.0924874846830354e-55" (23)
x:b4a56e1fc2f8f359 -4.36995e-55 res:"-4.3699499387321414e-55" (23)
x:b4c56e1fc2f8f359 -1.74798e-54 res:"-1.7479799754928566e-54" (23)
x:b4e56e1fc2f8f359 -6.99192e-54 res:"-6.991919901971426e-54" (22)
x:b5056e1fc2f8f359 -2.79677e-53 res:"-2.7967679607885705e-53" (23)
x:b5256e1fc2f8f359 -1.11871e-52 res:"-1.1187071843154282e-52" (23)
x:b5456e1fc2f8f359 -4.47483e-52 res:"-4.474828737261713e-52" (22)
x:b5656e1fc2f8f359 -1.78993e-51 res:"-1.789931494904685e-51" (22)
x:b5856e1fc2f8f359 -7.15973e-51 res:"-7.15972597961874e-51" (21)
x:b5a56e1fc2f8f359 -2.86389e-50 res:"-2.863890391847496e-50" (22)
x:b5c56e1fc2f8f359 -1.14556e-49 res:"-1.1455561567389985e-49" (23)
x:b5e56e1fc2f8f359 -4.58222e-49 res:"-4.582224626955994e-49" (22)
x:b6056e1fc2f8f359 -1.83289e-48 res:"-1.8328898507823976e-48" (23)
x:b6256e1fc2f8f359 -7.33156e-48 res:"-7.33155940312959e-48" (21)
x:b6456e1fc2f8f359 -2.93262e-47 res:"-2.932623761251836e-47" (22)
x:b6656e1fc2f8f359 -1.17305e-46 res:"-1.1730495045007344e-46" (23)
x:b6856e1fc2f8f359 -4.6922e-46 res:"-4.692198018002938e-46" (22)
x:b6a56e1fc2f8f359 -1.87688e-45 res:"-1.876879207201175e-45" (22)
x:b6c56e1fc2f8f359 -7.50752e-45 res:"-7.5075168288047e-45" (20)
x:b6e56e1fc2f8f359 -3.00301e-44 res:"-3.00300673152188e-44" (21)
x:b7056e1fc2f8f359 -1.2012e-43 res:"-1.201202692608752e-43" (22)
x:b7256e1fc2f8f359 -4.80481e-43 res:"-4.804810770435008e-43" (22)
x:b7456e1fc2f8f359 -1.92192e-42 res:"-1.9219243081740033e-42" (23)
x:b7656e1fc2f8f359 -7.6877e-42 res:"-7.687697232696013e-42" (22)
x:b7856e1fc2f8f359 -3.07508e-41 res:"-3.0750788930784053e-41" (23)
x:b7a56e1fc2f8f359 -1.23003e-40 res:"-1.2300315572313621e-40" (23)
x:b7c56e1fc2f8f359 -4.92013e-40 res:"-4.9201262289254485e-40" (23)
x:b7e56e1fc2f8f359 -1.96805e-39 res:"-1.9680504915701794e-39" (23)
x:b8056e1fc2f8f359 -7.8722e-39 res:"-7.872201966280718e-39" (22)
x:b8256e1fc2f8f359 -3.14888e-38 res:"-3.148880786512287e-38" (22)
x:b8456e1fc2f8f359 -1.25955e-37 res:"-1.2595523146049148e-37" (23)
x:b8656e1fc2f8f359 -5.03821e-37 res:"-5.038209258419659e-37" (22)
x:b8856e1fc2f8f359 -2.01528e-36 res:"-2.0152837033678637e-36" (23)
x:b8a56e1fc2f8f359 -8.06113e-36 res:"-8.061134813471455e-36" (22)
x:b8c56e1fc2f8f359 -3.22445e-35 res:"-3.224453925388582e-35" (22)
x:b8e56e1fc2f8f359 -1.28978e-34 res:"-1.2897815701554328e-34" (23)
x:b9056e1fc2f8f359 -5.15913e-34 res:"-5.159126280621731e-34" (22)
x:b9256e1fc2f8f359 -2.06365e-33 res:"-2.0636505122486924e-33" (23)
x:b9456e1fc2f8f359 -8.2546e-33 res:"-8.25460204899477e-33" (21)
x:b9656e1fc2f8f359 -3.30184e-32 res:"-3.301840819597908e-32" (22)
x:b9856e1fc2f8f359 -1.32074e-31 res:"-1.3207363278391631e-31" (23)
x:b9a56e1fc2f8f359 -5.28295e-31 res:"-5.282945311356653e-31" (22)
x:b9c56e1fc2f8f359 -2.11318e-30 res:"-2.113178124542661e-30" (22)
x:b9e56e1fc2f8f359 -8.45271e-30 res:"-8.452712498170644e-30" (22)
x:ba056e1fc2f8f359 -3.38108e-29 res:"-3.3810849992682577e-29" (23)
x:ba256e1fc2f8f359 -1.35243e-28 res:"-1.352433999707303e-28" (22)
x:ba456e1fc2f8f359 -5.40974e-28 res:"-5.409735998829212e-28" (22)
x:ba656e1fc2f8f359 -2.16389e-27 res:"-2.163894399531685e-27" (22)
x:ba856e1fc2f8f359 -8.65558e-27 res:"-8.65557759812674e-27" (21)
x:baa56e1fc2f8f359 -3.46223e-26 res:"-3.462231039250696e-26" (22)
x:bac56e1fc2f8f359 -1.38489e-25 res:"-1.3848924157002783e-25" (23)
x:bae56e1fc2f8f359 -5.53957e-25 res:"-5.539569662801113e-25" (22)
x:bb056e1fc2f8f359 -2.21583e-24 res:"-2.2158278651204453e-24" (23)
x:bb256e1fc2f8f359 -8.86331e-24 res:"-8.863311460481781e-24" (22)
x:bb456e1fc2f8f359 -3.54532e-23 res:"-3.5453245841927125e-23" (23)
x:bb656e1fc2f8f359 -1.41813e-22 res:"-1.418129833677085e-22" (22)
x:bb856e1fc2f8f359 -5.67252e-22 res:"-5.67251933470834e-22" (21)
x:bba56e1fc2f8f359 -2.26901e-21 res:"-2.269007733883336e-21" (22)
x:bbc56e1fc2f8f359 -9.07603e-21 res:"-9.076030935533344e-21" (22)
x:bbe56e1fc2f8f359 -3.63041e-20 res:"-3.6304123742133376e-20" (23)
x:bc056e1fc2f8f359 -1.45216e-19 res:"-1.452164949685335e-19" (22)
x:bc256e1fc2f8f359 -5.80866e-19 res:"-5.80865979874134e-19" (21)
x:bc456e1fc2f8f359 -2.32346e-18 res:"-2.323463919496536e-18" (22)
x:bc656e1fc2f8f359 -9.29386e-18 res:"-9.293855677986144e-18" (22)
x:bc856e1fc2f8f359 -3.71754e-17 res:"-3.717542271194458e-17" (22)
x:bca56e1fc2f8f359 -1.48702e-16 res:"-1.487016908477783e-16" (22)
x:bcc56e1fc2f8f359 -5.94807e-16 res:"-5.948067633911132e-16" (22)
x:bce56e1fc2f8f359 -2.37923e-15 res:"-2.379227053564453e-15" (22)
x:bd056e1fc2f8f359 -9.51691e-15 res:"-9.516908214257812e-15" (22)
x:bd256e1fc2f8f359 -3.80676e-14 res:"-3.806763285703125e-14" (22)
x:bd456e1fc2f8f359 -1.52271e-13 res:"-1.52270531428125e-13" (21)
x:bd656e1fc2f8f359 -6.09082e-13 res:"-6.090821257125e-13" (19)
x:bd856e1fc2f8f359 -2.43633e-12 res:"-2.43632850285e-12" (18)
x:bda56e1fc2f8f359 -9.74531e-12 res:"-9.7453140114e-12" (17)
x:bdc56e1fc2f8f359 -3.89813e-11 res:"-3.89812560456e-11" (18)
x:bde56e1fc2f8f359 -1.55925e-10 res:"-1.559250241824e-10" (19)
x:be056e1fc2f8f359 -6.237e-10 res:"-6.237000967296e-10" (19)
x:be256e1fc2f8f359 -2.4948e-09 res:"-2.4948003869184e-09" (20)
x:be456e1fc2f8f359 -9.9792e-09 res:"-9.9792015476736e-09" (20)
x:be656e1fc2f8f359 -3.99168e-08 res:"-3.99168061906944e-08" (21)
x:be856e1fc2f8f359 -1.59667e-07 res:"-1.596672247627776e-07" (22)
x:bea56e1fc2f8f359 -6.38669e-07 res:"-6.386688990511104e-07" (22)
x:bec56e1fc2f8f359 -2.55468e-06 res:"-2.5546755962044414e-06" (23)
x:bee56e1fc2f8f359 -1.02187e-05 res:"-1.0218702384817766e-05" (23)
x:bf056e1fc2f8f359 -4.08748e-05 res:"-4.087480953927106e-05" (22)
x:bf256e1fc2f8f359 -0.000163499 res:"-0.00016349923815708425" (23)
x:bf456e1fc2f8f359 -0.000653997 res:"-0.000653996952628337" (21)
x:bf656e1fc2f8f359 -0.00261599 res:"-0.002615987810513348" (21)
x:bf856e1fc2f8f359 -0.010464 res:"-0.010463951242053392" (21)
x:bfa56e1fc2f8f359 -0.0418558 res:"-0.04185580496821357" (20)
x:bfc56e1fc2f8f359 -0.167423 res:"-0.16742321987285427" (20)
x:bfe56e1fc2f8f359 -0.669693 res:"-0.6696928794914171" (19)
x:c0056e1fc2f8f359 -2.67877 res:"-2.6787715179656684" (19)
x:c0256e1fc2f8f359 -10.7151 res:"-10.715086071862673" (19)
x:c0456e1fc2f8f359 -42.8603 res:"-42.860344287450694" (19)
x:c0656e1fc2f8f359 -171.441 res:"-171.44137714980278" (19)
x:c0856e1fc2f8f359 -685.766 res:"-685.7655085992111" (18)
x:c0a56e1fc2f8f359 -2743.06 res:"-2743.0620343968444" (19)
x:c0c56e1fc2f8f359 -10972.2 res:"-10972.248137587378" (19)
x:c0e56e1fc2f8f359 -43889 res:"-43888.99255034951" (18)
x:c1056e1fc2f8f359 -175556 res:"-175555.97020139804" (19)
x:c1256e1fc2f8f359 -702224 res:"-702223.8808055922" (18)
x:c1456e1fc2f8f359 -2.8089e+06 res:"-2808895.5232223687" (19)
x:c1656e1fc2f8f359 -1.12356e+07 res:"-11235582.092889475" (19)
x:c1856e1fc2f8f359 -4.49423e+07 res:"-44942328.3715579" (17)
x:c1a56e1fc2f8f359 -1.79769e+08 res:"-179769313.4862316" (18)
x:c1c56e1fc2f8f359 -7.19077e+08 res:"-719077253.9449264" (18)
x:c1e56e1fc2f8f359 -2.87631e+09 res:"-2876309015.7797055" (19)
x:c2056e1fc2f8f359 -1.15052e+10 res:"-11505236063.118822" (19)
x:c2256e1fc2f8f359 -4.60209e+10 res:"-46020944252.47529" (18)
x:c2456e1fc2f8f359 -1.84084e+11 res:"-184083777009.90115" (19)
x:c2656e1fc2f8f359 -7.36335e+11 res:"-736335108039.6046" (18)
x:c2856e1fc2f8f359 -2.94534e+12 res:"-2945340432158.4185" (19)
x:c2a56e1fc2f8f359 -1.17814e+13 res:"-11781361728633.674" (19)
x:c2c56e1fc2f8f359 -4.71254e+13 res:"-47125446914534.695" (19)
x:c2e56e1fc2f8f359 -1.88502e+14 res:"-188501787658138.78" (19)
x:c3056e1fc2f8f359 -7.54007e+14 res:"-754007150632555.1" (18)
x:c3256e1fc2f8f359 -3.01603e+15 res:"-3016028602530220.5" (19)
x:c3456e1fc2f8f359 -1.20641e+16 res:"-12064114410120882" (18)
x:c3656e1fc2f8f359 -4.82565e+16 res:"-48256457640483528" (18)
x:c3856e1fc2f8f359 -1.93026e+17 res:"-193025830561934112" (19)
x:c3a56e1fc2f8f359 -7.72103e+17 res:"-772103322247736448" (19)
x:c3c56e1fc2f8f359 -3.08841e+18 res:"-3088413288990945792" (20)
x:c3e56e1fc2f8f359 -1.23537e+19 res:"-12353653155963783168" (21)
x:c4056e1fc2f8f359 -4.94146e+19 res:"-49414612623855132672" (21)
x:c4256e1fc2f8f359 -1.97658e+20 res:"-197658450495420530688" (22)
x:c4456e1fc2f8f359 -7.90634e+20 res:"-790633801981682122752" (22)
x:c4656e1fc2f8f359 -3.16254e+21 res:"-3162535207926728491008" (23)
x:c4856e1fc2f8f359 -1.26501e+22 res:"-1.2650140831706914e+22" (23)
x:c4a56e1fc2f8f359 -5.06006e+22 res:"-5.060056332682766e+22" (22)
x:c4c56e1fc2f8f359 -2.02402e+23 res:"-2.0240225330731062e+23" (23)
x:c4e56e1fc2f8f359 -8.09609e+23 res:"-8.096090132292425e+23" (22)
x:c5056e1fc2f8f359 -3.23844e+24 res:"-3.23843605291697e+24" (21)
x:c5256e1fc2f8f359 -1.29537e+25 res:"-1.295374421166788e+25" (22)
x:c5456e1fc2f8f359 -5.1815e+25 res:"-5.181497684667152e+25" (22)
x:c5656e1fc2f8f359 -2.0726e+26 res:"-2.0725990738668608e+26" (23)
x:c5856e1fc2f8f359 -8.2904e+26 res:"-8.290396295467443e+26" (22)
x:c5a56e1fc2f8f359 -3.31616e+27 res:"-3.316158518186977e+27" (22)
x:c5c56e1fc2f8f359 -1.32646e+28 res:"-1.326463407274791e+28" (22)
x:c5e56e1fc2f8f359 -5.30585e+28 res:"-5.305853629099164e+28" (22)
x:c6056e1fc2f8f359 -2.12234e+29 res:"-2.1223414516396654e+29" (23)
x:c6256e1fc2f8f359 -8.48937e+29 res:"-8.489365806558662e+29" (22)
x:c6456e1fc2f8f359 -3.39575e+30 res:"-3.3957463226234647e+30" (23)
x:c6656e1fc2f8f359 -1.3583e+31 res:"-1.3582985290493859e+31" (23)
x:c6856e1fc2f8f359 -5.43319e+31 res:"-5.4331941161975435e+31" (23)
x:c6a56e1fc2f8f359 -2.17328e+32 res:"-2.1732776464790174e+32" (23)
x:c6c56e1fc2f8f359 -8.69311e+32 res:"-8.69311058591607e+32" (21)
x:c6e56e1fc2f8f359 -3.47724e+33 res:"-3.477244234366428e+33" (22)
x:c7056e1fc2f8f359 -1.3909e+34 res:"-1.3908976937465711e+34" (23)
x:c7256e1fc2f8f359 -5.56359e+34 res:"-5.563590774986285e+34" (22)
x:c7456e1fc2f8f359 -2.22544e+35 res:"-2.225436309994514e+35" (22)
x:c7656e1fc2f8f359 -8.90175e+35 res:"-8.901745239978055e+35" (22)
x:c7856e1fc2f8f359 -3.5607e+36 res:"-3.560698095991222e+36" (22)
x:c7a56e1fc2f8f359 -1.42428e+37 res:"-1.4242792383964889e+37" (23)
x:c7c56e1fc2f8f359 -5.69712e+37 res:"-5.697116953585955e+37" (22)
x:c7e56e1fc2f8f359 -2.27885e+38 res:"-2.278846781434382e+38" (22)
x:c8056e1fc2f8f359 -9.11539e+38 res:"-9.115387125737529e+38" (22)
x:c8256e1fc2f8f359 -3.64615e+39 res:"-3.6461548502950115e+39" (23)
x:c8456e1fc2f8f359 -1.45846e+40 res:"-1.4584619401180046e+40" (23)
x:c8656e1fc2f8f359 -5.83385e+40 res:"-5.833847760472018e+40" (22)
x:c8856e1fc2f8f359 -2.33354e+41 res:"-2.3335391041888073e+41" (23)
x:c8a56e1fc2f8f359 -9.33416e+41 res:"-9.33415641675523e+41" (21)
x:c8c56e1fc2f8f359 -3.73366e+42 res:"-3.733662566702092e+42" (22)
x:c8e56e1fc2f8f359 -1.49347e+43 res:"-1.4934650266808367e+43" (23)
x:c9056e1fc2f8f359 -5.97386e+43 res:"-5.973860106723347e+43" (22)
x:c9256e1fc2f8f359 -2.38954e+44 res:"-2.3895440426893387e+44" (23)
x:c9456e1fc2f8f359 -9.55818e+44 res:"-9.558176170757355e+44" (22)
x:c9656e1fc2f8f359 -3.82327e+45 res:"-3.823270468302942e+45" (22)
x:c9856e1fc2f8f359 -1.52931e+46 res:"-1.5293081873211768e+46" (23)
x:c9a56e1fc2f8f359 -6.11723e+46 res:"-6.117232749284707e+46" (22)
x:c9c56e1fc2f8f359 -2.44689e+47 res:"-2.446893099713883e+47" (22)
x:c9e56e1fc2f8f359 -9.78757e+47 res:"-9.787572398855531e+47" (22)
x:ca056e1fc2f8f359 -3.91503e+48 res:"-3.9150289595422125e+48" (23)
x:ca256e1fc2f8f359 -1.56601e+49 res:"-1.566011583816885e+49" (22)
x:ca456e1fc2f8f359 -6.26405e+49 res:"-6.26404633526754e+49" (21)
x:ca656e1fc2f8f359 -2.50562e+50 res:"-2.505618534107016e+50" (22)
x:ca856e1fc2f8f359 -1.00225e+51 res:"-1.0022474136428064e+51" (23)
x:caa56e1fc2f8f359 -4.00899e+51 res:"-4.0089896545712256e+51" (23)
x:cac56e1fc2f8f359 -1.6036e+52 res:"-1.6035958618284903e+52" (23)
x:cae56e1fc2f8f359 -6.41438e+52 res:"-6.414383447313961e+52" (22)
x:cb056e1fc2f8f359 -2.56575e+53 res:"-2.5657533789255844e+53" (23)
x:cb256e1fc2f8f359 -1.0263e+54 res:"-1.0263013515702338e+54" (23)
x:cb456e1fc2f8f359 -4.10521e+54 res:"-4.105205406280935e+54" (22)
x:cb656e1fc2f8f359 -1.64208e+55 res:"-1.642082162512374e+55" (22)
x:cb856e1fc2f8f359 -6.56833e+55 res:"-6.568328650049496e+55" (22)
x:cba56e1fc2f8f359 -2.62733e+56 res:"-2.6273314600197984e+56" (23)
x:cbc56e1fc2f8f359 -1.05093e+57 res:"-1.0509325840079194e+57" (23)
x:cbe56e1fc2f8f359 -4.20373e+57 res:"-4.2037303360316775e+57" (23)
x:cc056e1fc2f8f359 -1.68149e+58 res:"-1.681492134412671e+58" (22)
x:cc256e1fc2f8f359 -6.72597e+58 res:"-6.725968537650684e+58" (22)
x:cc456e1fc2f8f359 -2.69039e+59 res:"-2.6903874150602736e+59" (23)
x:cc656e1fc2f8f359 -1.07615e+60 res:"-1.0761549660241094e+60" (23)
x:cc856e1fc2f8f359 -4.30462e+60 res:"-4.304619864096438e+60" (22)
x:cca56e1fc2f8f359 -1.72185e+61 res:"-1.721847945638575e+61" (22)
x:ccc56e1fc2f8f359 -6.88739e+61 res:"-6.8873917825543e+61" (20)
x:cce56e1fc2f8f359 -2.75496e+62 res:"-2.75495671302172e+62" (21)
x:cd056e1fc2f8f359 -1.10198e+63 res:"-1.101982685208688e+63" (22)
x:cd256e1fc2f8f359 -4.40793e+63 res:"-4.407930740834752e+63" (22)
x:cd456e1fc2f8f359 -1.76317e+64 res:"-1.763172296333901e+64" (22)
x:cd656e1fc2f8f359 -7.05269e+64 res:"-7.052689185335604e+64" (22)
x:cd856e1fc2f8f359 -2.82108e+65 res:"-2.8210756741342415e+65" (23)
x:cda56e1fc2f8f359 -1.12843e+66 res:"-1.1284302696536966e+66" (23)
x:cdc56e1fc2f8f359 -4.51372e+66 res:"-4.513721078614786e+66" (22)
x:cde56e1fc2f8f359 -1.80549e+67 res:"-1.8054884314459145e+67" (23)
x:ce056e1fc2f8f359 -7.22195e+67 res:"-7.221953725783658e+67" (22)
x:ce256e1fc2f8f359 -2.88878e+68 res:"-2.8887814903134632e+68" (23)
x:ce456e1fc2f8f359 -1.15551e+69 res:"-1.1555125961253853e+69" (23)
x:ce656e1fc2f8f359 -4.62205e+69 res:"-4.622050384501541e+69" (22)
x:ce856e1fc2f8f359 -1.84882e+70 res:"-1.8488201538006165e+70" (23)
x:cea56e1fc2f8f359 -7.39528e+70 res:"-7.395280615202466e+70" (22)
x:cec56e1fc2f8f359 -2.95811e+71 res:"-2.9581122460809864e+71" (23)
x:cee56e1fc2f8f359 -1.18324e+72 res:"-1.1832448984323945e+72" (23)
x:cf056e1fc2f8f359 -4.73298e+72 res:"-4.732979593729578e+72" (22)
x:cf256e1fc2f8f359 -1.89319e+73 res:"-1.8931918374918313e+73" (23)
x:cf456e1fc2f8f359 -7.57277e+73 res:"-7.572767349967325e+73" (22)
x:cf656e1fc2f8f359 -3.02911e+74 res:"-3.02910693998693e+74" (21)
x:cf856e1fc2f8f359 -1.21164e+75 res:"-1.211642775994772e+75" (22)
x:cfa56e1fc2f8f359 -4.84657e+75 res:"-4.846571103979088e+75" (22)
x:cfc56e1fc2f8f359 -1.93863e+76 res:"-1.9386284415916352e+76" (23)
x:cfe56e1fc2f8f359 -7.75451e+76 res:"-7.754513766366541e+76" (22)
x:d0056e1fc2f8f359 -3.10181e+77 res:"-3.1018055065466164e+77" (23)
x:d0256e1fc2f8f359 -1.24072e+78 res:"-1.2407222026186465e+78" (23)
x:d0456e1fc2f8f359 -4.96289e+78 res:"-4.962888810474586e+78" (22)
x:d0656e1fc2f8f359 -1.98516e+79 res:"-1.9851555241898345e+79" (23)
x:d0856e1fc2f8f359 -7.94062e+79 res:"-7.940622096759338e+79" (22)
x:d0a56e1fc2f8f359 -3.17625e+80 res:"-3.176248838703735e+80" (22)
x:d0c56e1fc2f8f359 -1.2705e+81 res:"-1.270499535481494e+81" (22)
x:d0e56e1fc2f8f359 -5.082e+81 res:"-5.081998141925976e+81" (22)
x:d1056e1fc2f8f359 -2.0328e+82 res:"-2.0327992567703905e+82" (23)
x:d1256e1fc2f8f359 -8.1312e+82 res:"-8.131197027081562e+82" (22)
x:d1456e1fc2f8f359 -3.25248e+83 res:"-3.252478810832625e+83" (22)
x:d1656e1fc2f8f359 -1.30099e+84 res:"-1.30099152433305e+84" (21)
x:d1856e1fc2f8f359 -5.20397e+84 res:"-5.2039660973322e+84" (20)
x:d1a56e1fc2f8f359 -2.08159e+85 res:"-2.08158643893288e+85" (21)
x:d1c56e1fc2f8f359 -8.32635e+85 res:"-8.32634575573152e+85" (21)
x:d1e56e1fc2f8f359 -3.33054e+86 res:"-3.330538302292608e+86" (22)
x:d2056e1fc2f8f359 -1.33222e+87 res:"-1.3322153209170431e+87" (23)
x:d2256e1fc2f8f359 -5.32886e+87 res:"-5.3288612836681725e+87" (23)
x:d2456e1fc2f8f359 -2.13154e+88 res:"-2.131544513467269e+88" (22)
x:d2656e1fc2f8f359 -8.52618e+88 res:"-8.526178053869076e+88" (22)
x:d2856e1fc2f8f359 -3.41047e+89 res:"-3.4104712215476304e+89" (23)
x:d2a56e1fc2f8f359 -1.36419e+90 res:"-1.3641884886190522e+90" (23)
x:d2c56e1fc2f8f359 -5.45675e+90 res:"-5.456753954476209e+90" (22)
x:d2e56e1fc2f8f359 -2.1827e+91 res:"-2.1827015817904834e+91" (23)
x:d3056e1fc2f8f359 -8.73081e+91 res:"-8.730806327161934e+91" (22)
x:d3256e1fc2f8f359 -3.49232e+92 res:"-3.4923225308647735e+92" (23)
x:d3456e1fc2f8f359 -1.39693e+93 res:"-1.3969290123459094e+93" (23)
x:d3656e1fc2f8f359 -5.58772e+93 res:"-5.587716049383638e+93" (22)
x:d3856e1fc2f8f359 -2.23509e+94 res:"-2.235086419753455e+94" (22)
x:d3a56e1fc2f8f359 -8.94035e+94 res:"-8.94034567901382e+94" (21)
x:d3c56e1fc2f8f359 -3.57614e+95 res:"-3.576138271605528e+95" (22)
x:d3e56e1fc2f8f359 -1.43046e+96 res:"-1.4304553086422112e+96" (23)
x:d4056e1fc2f8f359 -5.72182e+96 res:"-5.721821234568845e+96" (22)
x:d4256e1fc2f8f359 -2.28873e+97 res:"-2.288728493827538e+97" (22)
x:d4456e1fc2f8f359 -9.15491e+97 res:"-9.154913975310152e+97" (22)
x:d4656e1fc2f8f359 -3.66197e+98 res:"-3.661965590124061e+98" (22)
x:d4856e1fc2f8f359 -1.46479e+99 res:"-1.4647862360496243e+99" (23)
x:d4a56e1fc2f8f359 -5.85914e+99 res:"-5.859144944198497e+99" (22)
x:d4c56e1fc2f8f359 -2.34366e+100 res:"-2.343657977679399e+100" (23)
x:d4e56e1fc2f8f359 -9.37463e+100 res:"-9.374631910717596e+100" (23)
x:d5056e1fc2f8f359 -3.74985e+101 res:"-3.749852764287038e+101" (23)
x:d5256e1fc2f8f359 -1.49994e+102 res:"-1.4999411057148153e+102" (24)
x:d5456e1fc2f8f359 -5.99976e+102 res:"-5.999764422859261e+102" (23)
x:d5656e1fc2f8f359 -2.39991e+103 res:"-2.3999057691437044e+103" (24)
x:d5856e1fc2f8f359 -9.59962e+103 res:"-9.599623076574818e+103" (23)
x:d5a56e1fc2f8f359 -3.83985e+104 res:"-3.839849230629927e+104" (23)
x:d5c56e1fc2f8f359 -1.53594e+105 res:"-1.5359396922519708e+105" (24)
x:d5e56e1fc2f8f359 -6.14376e+105 res:"-6.143758769007883e+105" (23)
x:d6056e1fc2f8f359 -2.4575e+106 res:"-2.4575035076031534e+106" (24)
x:d6256e1fc2f8f359 -9.83001e+106 res:"-9.830014030412613e+106" (23)
x:d6456e1fc2f8f359 -3.93201e+107 res:"-3.9320056121650454e+107" (24)
x:d6656e1fc2f8f359 -1.5728e+108 res:"-1.5728022448660181e+108" (24)
x:d6856e1fc2f8f359 -6.29121e+108 res:"-6.291208979464073e+108" (23)
x:d6a56e1fc2f8f359 -2.51648e+109 res:"-2.516483591785629e+109" (23)
x:d6c56e1fc2f8f359 -1.00659e+110 res:"-1.0065934367142516e+110" (24)
x:d6e56e1fc2f8f359 -4.02637e+110 res:"-4.0263737468570065e+110" (24)
x:d7056e1fc2f8f359 -1.61055e+111 res:"-1.6105494987428026e+111" (24)
x:d7256e1fc2f8f359 -6.4422e+111 res:"-6.44219799497121e+111" (22)
x:d7456e1fc2f8f359 -2.57688e+112 res:"-2.576879197988484e+112" (23)
x:d7656e1fc2f8f359 -1.03075e+113 res:"-1.0307516791953937e+113" (24)
x:d7856e1fc2f8f359 -4.12301e+113 res:"-4.1230067167815746e+113" (24)
x:d7a56e1fc2f8f359 -1.6492e+114 res:"-1.6492026867126298e+114" (24)
x:d7c56e1fc2f8f359 -6.59681e+114 res:"-6.596810746850519e+114" (23)
x:d7e56e1fc2f8f359 -2.63872e+115 res:"-2.6387242987402078e+115" (24)
x:d8056e1fc2f8f359 -1.05549e+116 res:"-1.0554897194960831e+116" (24)
x:d8256e1fc2f8f359 -4.22196e+116 res:"-4.2219588779843324e+116" (24)
x:d8456e1fc2f8f359 -1.68878e+117 res:"-1.688783551193733e+117" (23)
x:d8656e1fc2f8f359 -6.75513e+117 res:"-6.755134204774932e+117" (23)
x:d8856e1fc2f8f359 -2.70205e+118 res:"-2.7020536819099727e+118" (24)
x:d8a56e1fc2f8f359 -1.08082e+119 res:"-1.0808214727639891e+119" (24)
x:d8c56e1fc2f8f359 -4.32329e+119 res:"-4.3232858910559564e+119" (24)
x:d8e56e1fc2f8f359 -1.72931e+120 res:"-1.7293143564223826e+120" (24)
x:d9056e1fc2f8f359 -6.91726e+120 res:"-6.91725742568953e+120" (22)
x:d9256e1fc2f8f359 -2.7669e+121 res:"-2.766902970275812e+121" (23)
x:d9456e1fc2f8f359 -1.10676e+122 res:"-1.1067611881103248e+122" (24)
x:d9656e1fc2f8f359 -4.42704e+122 res:"-4.427044752441299e+122" (23)
x:d9856e1fc2f8f359 -1.77082e+123 res:"-1.7708179009765197e+123" (24)
x:d9a56e1fc2f8f359 -7.08327e+123 res:"-7.083271603906079e+123" (23)
x:d9c56e1fc2f8f359 -2.83331e+124 res:"-2.8333086415624316e+124" (24)
x:d9e56e1fc2f8f359 -1.13332e+125 res:"-1.1333234566249726e+125" (24)
x:da056e1fc2f8f359 -4.53329e+125 res:"-4.5332938264998905e+125" (24)
x:da256e1fc2f8f359 -1.81332e+126 res:"-1.8133175305999562e+126" (24)
x:da456e1fc2f8f359 -7.25327e+126 res:"-7.253270122399825e+126" (23)
x:da656e1fc2f8f359 -2.90131e+127 res:"-2.90130804895993e+127" (22)
x:da856e1fc2f8f359 -1.16052e+128 res:"-1.160523219583972e+128" (23)
x:daa56e1fc2f8f359 -4.64209e+128 res:"-4.642092878335888e+128" (23)
x:dac56e1fc2f8f359 -1.85684e+129 res:"-1.8568371513343552e+129" (24)
x:dae56e1fc2f8f359 -7.42735e+129 res:"-7.427348605337421e+129" (23)
x:db056e1fc2f8f359 -2.97094e+130 res:"-2.9709394421349683e+130" (24)
x:db256e1fc2f8f359 -1.18838e+131 res:"-1.1883757768539873e+131" (24)
x:db456e1fc2f8f359 -4.7535e+131 res:"-4.753503107415949e+131" (23)
x:db656e1fc2f8f359 -1.9014e+132 res:"-1.9014012429663797e+132" (24)
x:db856e1fc2f8f359 -7.6056e+132 res:"-7.605604971865519e+132" (23)
x:dba56e1fc2f8f359 -3.04224e+133 res:"-3.0422419887462075e+133" (24)
x:dbc56e1fc2f8f359 -1.2169e+134 res:"-1.216896795498483e+134" (23)
x:dbe56e1fc2f8f359 -4.86759e+134 res:"-4.867587181993932e+134" (23)
x:dc056e1fc2f8f359 -1.94703e+135 res:"-1.9470348727975728e+135" (24)
x:dc256e1fc2f8f359 -7.78814e+135 res:"-7.788139491190291e+135" (23)
x:dc456e1fc2f8f359 -3.11526e+136 res:"-3.1152557964761165e+136" (24)
x:dc656e1fc2f8f359 -1.2461e+137 res:"-1.2461023185904466e+137" (24)
x:dc856e1fc2f8f359 -4.98441e+137 res:"-4.984409274361786e+137" (23)
x:dca56e1fc2f8f359 -1.99376e+138 res:"-1.9937637097447145e+138" (24)
x:dcc56e1fc2f8f359 -7.97505e+138 res:"-7.975054838978858e+138" (23)
x:dce56e1fc2f8f359 -3.19002e+139 res:"-3.190021935591543e+139" (23)
x:dd056e1fc2f8f359 -1.27601e+140 res:"-1.2760087742366173e+140" (24)
x:dd256e1fc2f8f359 -5.10404e+140 res:"-5.104035096946469e+140" (23)
x:dd456e1fc2f8f359 -2.04161e+141 res:"-2.0416140387785877e+141" (24)
x:dd656e1fc2f8f359 -8.16646e+141 res:"-8.166456155114351e+141" (23)
x:dd856e1fc2f8f359 -3.26658e+142 res:"-3.2665824620457403e+142" (24)
x:dda56e1fc2f8f359 -1.30663e+143 res:"-1.3066329848182961e+143" (24)
x:ddc56e1fc2f8f359 -5.22653e+143 res:"-5.2265319392731845e+143" (24)
x:dde56e1fc2f8f359 -2.09061e+144 res:"-2.0906127757092738e+144" (24)
x:de056e1fc2f8f359 -8.36245e+144 res:"-8.362451102837095e+144" (23)
x:de256e1fc2f8f359 -3.34498e+145 res:"-3.344980441134838e+145" (23)
x:de456e1fc2f8f359 -1.33799e+146 res:"-1.3379921764539352e+146" (24)
x:de656e1fc2f8f359 -5.35197e+146 res:"-5.351968705815741e+146" (23)
x:de856e1fc2f8f359 -2.14079e+147 res:"-2.1407874823262964e+147" (24)
x:dea56e1fc2f8f359 -8.56315e+147 res:"-8.563149929305185e+147" (23)
x:dec56e1fc2f8f359 -3.42526e+148 res:"-3.425259971722074e+148" (23)
x:dee56e1fc2f8f359 -1.3701e+149 res:"-1.3701039886888297e+149" (24)
x:df056e1fc2f8f359 -5.48042e+149 res:"-5.480415954755319e+149" (23)
x:df256e1fc2f8f359 -2.19217e+150 res:"-2.1921663819021275e+150" (24)
x:df456e1fc2f8f359 -8.76867e+150 res:"-8.76866552760851e+150" (22)
x:df656e1fc2f8f359 -3.50747e+151 res:"-3.507466211043404e+151" (23)
x:df856e1fc2f8f359 -1.40299e+152 res:"-1.4029864844173616e+152" (24)
x:dfa56e1fc2f8f359 -5.61195e+152 res:"-5.611945937669446e+152" (23)
x:dfc56e1fc2f8f359 -2.24478e+153 res:"-2.2447783750677785e+153" (24)
x:dfe56e1fc2f8f359 -8.97911e+153 res:"-8.979113500271114e+153" (23)
x:e0056e1fc2f8f359 -3.59165e+154 res:"-3.5916454001084457e+154" (24)
x:e0256e1fc2f8f359 -1.43666e+155 res:"-1.4366581600433783e+155" (24)
x:e0456e1fc2f8f359 -5.74663e+155 res:"-5.746632640173513e+155" (23)
x:e0656e1fc2f8f359 -2.29865e+156 res:"-2.2986530560694052e+156" (24)
x:e0856e1fc2f8f359 -9.19461e+156 res:"-9.194612224277621e+156" (23)
x:e0a56e1fc2f8f359 -3.67784e+157 res:"-3.6778448897110484e+157" (24)
x:e0c56e1fc2f8f359 -1.47114e+158 res:"-1.4711379558844193e+158" (24)
x:e0e56e1fc2f8f359 -5.88455e+158 res:"-5.884551823537677e+158" (23)
x:e1056e1fc2f8f359 -2.35382e+159 res:"-2.353820729415071e+159" (23)
x:e1256e1fc2f8f359 -9.41528e+159 res:"-9.415282917660284e+159" (23)
x:e1456e1fc2f8f359 -3.76611e+160 res:"-3.7661131670641135e+160" (24)
x:e1656e1fc2f8f359 -1.50645e+161 res:"-1.5064452668256454e+161" (24)
x:e1856e1fc2f8f359 -6.02578e+161 res:"-6.025781067302582e+161" (23)
x:e1a56e1fc2f8f359 -2.41031e+162 res:"-2.4103124269210326e+162" (24)
x:e1c56e1fc2f8f359 -9.64125e+162 res:"-9.64124970768413e+162" (22)
x:e1e56e1fc2f8f359 -3.8565e+163 res:"-3.856499883073652e+163" (23)
x:e2056e1fc2f8f359 -1.5426e+164 res:"-1.542599953229461e+164" (23)
x:e2256e1fc2f8f359 -6.1704e+164 res:"-6.170399812917844e+164" (23)
x:e2456e1fc2f8f359 -2.46816e+165 res:"-2.4681599251671374e+165" (24)
x:e2656e1fc2f8f359 -9.87264e+165 res:"-9.87263970066855e+165" (22)
x:e2856e1fc2f8f359 -3.94906e+166 res:"-3.94905588026742e+166" (22)
x:e2a56e1fc2f8f359 -1.57962e+167 res:"-1.579622352106968e+167" (23)
x:e2c56e1fc2f8f359 -6.31849e+167 res:"-6.318489408427872e+167" (23)
x:e2e56e1fc2f8f359 -2.5274e+168 res:"-2.5273957633711487e+168" (24)
x:e3056e1fc2f8f359 -1.01096e+169 res:"-1.0109583053484595e+169" (24)
x:e3256e1fc2f8f359 -4.04383e+169 res:"-4.043833221393838e+169" (23)
x:e3456e1fc2f8f359 -1.61753e+170 res:"-1.6175332885575352e+170" (24)
x:e3656e1fc2f8f359 -6.47013e+170 res:"-6.470133154230141e+170" (23)
x:e3856e1fc2f8f359 -2.58805e+171 res:"-2.5880532616920563e+171" (24)
x:e3a56e1fc2f8f359 -1.03522e+172 res:"-1.0352213046768225e+172" (24)
x:e3c56e1fc2f8f359 -4.14089e+172 res:"-4.14088521870729e+172" (22)
x:e3e56e1fc2f8f359 -1.65635e+173 res:"-1.656354087482916e+173" (23)
x:e4056e1fc2f8f359 -6.62542e+173 res:"-6.625416349931664e+173" (23)
x:e4256e1fc2f8f359 -2.65017e+174 res:"-2.6501665399726657e+174" (24)
x:e4456e1fc2f8f359 -1.06007e+175 res:"-1.0600666159890663e+175" (24)
x:e4656e1fc2f8f359 -4.24027e+175 res:"-4.240266463956265e+175" (23)
x:e4856e1fc2f8f359 -1.69611e+176 res:"-1.696106585582506e+176" (23)
x:e4a56e1fc2f8f359 -6.78443e+176 res:"-6.784426342330024e+176" (23)
x:e4c56e1fc2f8f359 -2.71377e+177 res:"-2.7137705369320096e+177" (24)
x:e4e56e1fc2f8f359 -1.08551e+178 res:"-1.0855082147728039e+178" (24)
x:e5056e1fc2f8f359 -4.34203e+178 res:"-4.3420328590912154e+178" (24)
x:e5256e1fc2f8f359 -1.73681e+179 res:"-1.7368131436364862e+179" (24)
x:e5456e1fc2f8f359 -6.94725e+179 res:"-6.947252574545945e+179" (23)
x:e5656e1fc2f8f359 -2.7789e+180 res:"-2.778901029818378e+180" (23)
x:e5856e1fc2f8f359 -1.11156e+181 res:"-1.1115604119273511e+181" (24)
x:e5a56e1fc2f8f359 -4.44624e+181 res:"-4.4462416477094046e+181" (24)
x:e5c56e1fc2f8f359 -1.7785e+182 res:"-1.7784966590837618e+182" (24)
x:e5e56e1fc2f8f359 -7.11399e+182 res:"-7.113986636335047e+182" (23)
x:e6056e1fc2f8f359 -2.84559e+183 res:"-2.845594654534019e+183" (23)
x:e6256e1fc2f8f359 -1.13824e+184 res:"-1.1382378618136076e+184" (24)
x:e6456e1fc2f8f359 -4.55295e+184 res:"-4.55295144725443e+184" (22)
x:e6656e1fc2f8f359 -1.82118e+185 res:"-1.821180578901772e+185" (23)
x:e6856e1fc2f8f359 -7.28472e+185 res:"-7.284722315607088e+185" (23)
x:e6a56e1fc2f8f359 -2.91389e+186 res:"-2.9138889262428354e+186" (24)
x:e6c56e1fc2f8f359 -1.16556e+187 res:"-1.1655555704971342e+187" (24)
x:e6e56e1fc2f8f359 -4.66222e+187 res:"-4.6622222819885366e+187" (24)
x:e7056e1fc2f8f359 -1.86489e+188 res:"-1.8648889127954146e+188" (24)
x:e7256e1fc2f8f359 -7.45956e+188 res:"-7.459555651181659e+188" (23)
x:e7456e1fc2f8f359 -2.98382e+189 res:"-2.9838222604726634e+189" (24)
x:e7656e1fc2f8f359 -1.19353e+190 res:"-1.1935289041890654e+190" (24)
x:e7856e1fc2f8f359 -4.77412e+190 res:"-4.7741156167562615e+190" (24)
x:e7a56e1fc2f8f359 -1.90965e+191 res:"-1.9096462467025046e+191" (24)
x:e7c56e1fc2f8f359 -7.63858e+191 res:"-7.638584986810018e+191" (23)
x:e7e56e1fc2f8f359 -3.05543e+192 res:"-3.0554339947240074e+192" (24)
x:e8056e1fc2f8f359 -1.22217e+193 res:"-1.222173597889603e+193" (23)
x:e8256e1fc2f8f359 -4.88869e+193 res:"-4.888694391558412e+193" (23)
x:e8456e1fc2f8f359 -1.95548e+194 res:"-1.9554777566233647e+194" (24)
x:e8656e1fc2f8f359 -7.82191e+194 res:"-7.821911026493459e+194" (23)
x:e8856e1fc2f8f359 -3.12876e+195 res:"-3.1287644105973835e+195" (24)
x:e8a56e1fc2f8f359 -1.25151e+196 res:"-1.2515057642389534e+196" (24)
x:e8c56e1fc2f8f359 -5.00602e+196 res:"-5.006023056955814e+196" (23)
x:e8e56e1fc2f8f359 -2.00241e+197 res:"-2.0024092227823255e+197" (24)
x:e9056e1fc2f8f359 -8.00964e+197 res:"-8.009636891129302e+197" (23)
x:e9256e1fc2f8f359 -3.20385e+198 res:"-3.2038547564517207e+198" (24)
x:e9456e1fc2f8f359 -1.28154e+199 res:"-1.2815419025806883e+199" (24)
x:e9656e1fc2f8f359 -5.12617e+199 res:"-5.126167610322753e+199" (23)
x:e9856e1fc2f8f359 -2.05047e+200 res:"-2.0504670441291013e+200" (24)
x:e9a56e1fc2f8f359 -8.20187e+200 res:"-8.201868176516405e+200" (23)
x:e9c56e1fc2f8f359 -3.28075e+201 res:"-3.280747270606562e+201" (23)
x:e9e56e1fc2f8f359 -1.3123e+202 res:"-1.3122989082426248e+202" (24)
x:ea056e1fc2f8f359 -5.2492e+202 res:"-5.249195632970499e+202" (23)
x:ea256e1fc2f8f359 -2.09968e+203 res:"-2.0996782531881997e+203" (24)
x:ea456e1fc2f8f359 -8.39871e+203 res:"-8.398713012752799e+203" (23)
x:ea656e1fc2f8f359 -3.35949e+204 res:"-3.3594852051011195e+204" (24)
x:ea856e1fc2f8f359 -1.34379e+205 res:"-1.3437940820404478e+205" (24)
x:eaa56e1fc2f8f359 -5.37518e+205 res:"-5.375176328161791e+205" (23)
x:eac56e1fc2f8f359 -2.15007e+206 res:"-2.1500705312647165e+206" (24)
x:eae56e1fc2f8f359 -8.60028e+206 res:"-8.600282125058866e+206" (23)
x:eb056e1fc2f8f359 -3.44011e+207 res:"-3.4401128500235464e+207" (24)
x:eb256e1fc2f8f359 -1.37605e+208 res:"-1.3760451400094186e+208" (24)
x:eb456e1fc2f8f359 -5.50418e+208 res:"-5.504180560037674e+208" (23)
x:eb656e1fc2f8f359 -2.20167e+209 res:"-2.2016722240150697e+209" (24)
x:eb856e1fc2f8f359 -8.80669e+209 res:"-8.806688896060279e+209" (23)
x:eba56e1fc2f8f359 -3.52268e+210 res:"-3.5226755584241115e+210" (24)
x:ebc56e1fc2f8f359 -1.40907e+211 res:"-1.4090702233696446e+211" (24)
x:ebe56e1fc2f8f359 -5.63628e+211 res:"-5.636280893478578e+211" (23)
x:ec056e1fc2f8f359 -2.25451e+212 res:"-2.2545123573914314e+212" (24)
x:ec256e1fc2f8f359 -9.01805e+212 res:"-9.018049429565725e+212" (23)
x:ec456e1fc2f8f359 -3.60722e+213 res:"-3.60721977182629e+213" (22)
x:ec656e1fc2f8f359 -1.44289e+214 res:"-1.442887908730516e+214" (23)
x:ec856e1fc2f8f359 -5.77155e+214 res:"-5.771551634922064e+214" (23)
x:eca56e1fc2f8f359 -2.30862e+215 res:"-2.3086206539688257e+215" (24)
x:ecc56e1fc2f8f359 -9.23448e+215 res:"-9.234482615875303e+215" (23)
x:ece56e1fc2f8f359 -3.69379e+216 res:"-3.693793046350121e+216" (23)
x:ed056e1fc2f8f359 -1.47752e+217 res:"-1.4775172185400485e+217" (24)
x:ed256e1fc2f8f359 -5.91007e+217 res:"-5.910068874160194e+217" (23)
x:ed456e1fc2f8f359 -2.36403e+218 res:"-2.3640275496640775e+218" (24)
x:ed656e1fc2f8f359 -9.45611e+218 res:"-9.45611019865631e+218" (22)
x:ed856e1fc2f8f359 -3.78244e+219 res:"-3.782444079462524e+219" (23)
x:eda56e1fc2f8f359 -1.51298e+220 res:"-1.5129776317850096e+220" (24)
x:edc56e1fc2f8f359 -6.05191e+220 res:"-6.051910527140038e+220" (23)
x:ede56e1fc2f8f359 -2.42076e+221 res:"-2.4207642108560154e+221" (24)
x:ee056e1fc2f8f359 -9.68306e+221 res:"-9.683056843424062e+221" (23)
x:ee256e1fc2f8f359 -3.87322e+222 res:"-3.8732227373696246e+222" (24)
x:ee456e1fc2f8f359 -1.54929e+223 res:"-1.5492890949478499e+223" (24)
x:ee656e1fc2f8f359 -6.19716e+223 res:"-6.197156379791399e+223" (23)
x:ee856e1fc2f8f359 -2.47886e+224 res:"-2.4788625519165598e+224" (24)
x:eea56e1fc2f8f359 -9.91545e+224 res:"-9.915450207666239e+224" (23)
x:eec56e1fc2f8f359 -3.96618e+225 res:"-3.9661800830664956e+225" (24)
x:eee56e1fc2f8f359 -1.58647e+226 res:"-1.5864720332265982e+226" (24)
x:ef056e1fc2f8f359 -6.34589e+226 res:"-6.345888132906393e+226" (23)
x:ef256e1fc2f8f359 -2.53836e+227 res:"-2.538355253162557e+227" (23)
x:ef456e1fc2f8f359 -1.01534e+228 res:"-1.0153421012650229e+228" (24)
x:ef656e1fc2f8f359 -4.06137e+228 res:"-4.0613684050600915e+228" (24)
x:ef856e1fc2f8f359 -1.62455e+229 res:"-1.6245473620240366e+229" (24)
x:efa56e1fc2f8f359 -6.49819e+229 res:"-6.498189448096146e+229" (23)
x:efc56e1fc2f8f359 -2.59928e+230 res:"-2.5992757792384586e+230" (24)
x:efe56e1fc2f8f359 -1.03971e+231 res:"-1.0397103116953834e+231" (24)
x:f0056e1fc2f8f359 -4.15884e+231 res:"-4.158841246781534e+231" (23)
x:f0256e1fc2f8f359 -1.66354e+232 res:"-1.6635364987126135e+232" (24)
x:f0456e1fc2f8f359 -6.65415e+232 res:"-6.654145994850454e+232" (23)
x:f0656e1fc2f8f359 -2.66166e+233 res:"-2.6616583979401816e+233" (24)
x:f0856e1fc2f8f359 -1.06466e+234 res:"-1.0646633591760726e+234" (24)
x:f0a56e1fc2f8f359 -4.25865e+234 res:"-4.2586534367042905e+234" (24)
x:f0c56e1fc2f8f359 -1.70346e+235 res:"-1.7034613746817162e+235" (24)
x:f0e56e1fc2f8f359 -6.81385e+235 res:"-6.813845498726865e+235" (23)
x:f1056e1fc2f8f359 -2.72554e+236 res:"-2.725538199490746e+236" (23)
x:f1256e1fc2f8f359 -1.09022e+237 res:"-1.0902152797962984e+237" (24)
x:f1456e1fc2f8f359 -4.36086e+237 res:"-4.3608611191851935e+237" (24)
x:f1656e1fc2f8f359 -1.74434e+238 res:"-1.7443444476740774e+238" (24)
x:f1856e1fc2f8f359 -6.97738e+238 res:"-6.97737779069631e+238" (22)
x:f1a56e1fc2f8f359 -2.79095e+239 res:"-2.790951116278524e+239" (23)
x:f1c56e1fc2f8f359 -1.11638e+240 res:"-1.1163804465114095e+240" (24)
x:f1e56e1fc2f8f359 -4.46552e+240 res:"-4.465521786045638e+240" (23)
x:f2056e1fc2f8f359 -1.78621e+241 res:"-1.7862087144182553e+241" (24)
x:f2256e1fc2f8f359 -7.14483e+241 res:"-7.144834857673021e+241" (23)
x:f2456e1fc2f8f359 -2.85793e+242 res:"-2.8579339430692084e+242" (24)
x:f2656e1fc2f8f359 -1.14317e+243 res:"-1.1431735772276834e+243" (24)
x:f2856e1fc2f8f359 -4.57269e+243 res:"-4.5726943089107334e+243" (24)
x:f2a56e1fc2f8f359 -1.82908e+244 res:"-1.8290777235642934e+244" (24)
x:f2c56e1fc2f8f359 -7.31631e+244 res:"-7.316310894257174e+244" (23)
x:f2e56e1fc2f8f359 -2.92652e+245 res:"-2.9265243577028694e+245" (24)
x:f3056e1fc2f8f359 -1.17061e+246 res:"-1.1706097430811478e+246" (24)
x:f3256e1fc2f8f359 -4.68244e+246 res:"-4.682438972324591e+246" (23)
x:f3456e1fc2f8f359 -1.87298e+247 res:"-1.8729755889298364e+247" (24)
x:f3656e1fc2f8f359 -7.4919e+247 res:"-7.491902355719346e+247" (23)
x:f3856e1fc2f8f359 -2.99676e+248 res:"-2.9967609422877383e+248" (24)
x:f3a56e1fc2f8f359 -1.1987e+249 res:"-1.1987043769150953e+249" (24)
x:f3c56e1fc2f8f359 -4.79482e+249 res:"-4.794817507660381e+249" (23)
x:f3e56e1fc2f8f359 -1.91793e+250 res:"-1.9179270030641525e+250" (24)
x:f4056e1fc2f8f359 -7.67171e+250 res:"-7.67170801225661e+250" (22)
x:f4256e1fc2f8f359 -3.06868e+251 res:"-3.068683204902644e+251" (23)
x:f4456e1fc2f8f359 -1.22747e+252 res:"-1.2274732819610576e+252" (24)
x:f4656e1fc2f8f359 -4.90989e+252 res:"-4.90989312784423e+252" (22)
x:f4856e1fc2f8f359 -1.96396e+253 res:"-1.963957251137692e+253" (23)
x:f4a56e1fc2f8f359 -7.85583e+253 res:"-7.855829004550769e+253" (23)
x:f4c56e1fc2f8f359 -3.14233e+254 res:"-3.1423316018203074e+254" (24)
x:f4e56e1fc2f8f359 -1.25693e+255 res:"-1.256932640728123e+255" (23)
x:f5056e1fc2f8f359 -5.02773e+255 res:"-5.027730562912492e+255" (23)
x:f5256e1fc2f8f359 -2.01109e+256 res:"-2.0110922251649968e+256" (24)
x:f5456e1fc2f8f359 -8.04437e+256 res:"-8.044368900659987e+256" (23)
x:f5656e1fc2f8f359 -3.21775e+257 res:"-3.217747560263995e+257" (23)
x:f5856e1fc2f8f359 -1.2871e+258 res:"-1.287099024105598e+258" (23)
x:f5a56e1fc2f8f359 -5.1484e+258 res:"-5.148396096422392e+258" (23)
x:f5c56e1fc2f8f359 -2.05936e+259 res:"-2.0593584385689567e+259" (24)
x:f5e56e1fc2f8f359 -8.23743e+259 res:"-8.237433754275827e+259" (23)
x:f6056e1fc2f8f359 -3.29497e+260 res:"-3.2949735017103307e+260" (24)
x:f6256e1fc2f8f359 -1.31799e+261 res:"-1.3179894006841323e+261" (24)
x:f6456e1fc2f8f359 -5.27196e+261 res:"-5.271957602736529e+261" (23)
x:f6656e1fc2f8f359 -2.10878e+262 res:"-2.1087830410946116e+262" (24)
x:f6856e1fc2f8f359 -8.43513e+262 res:"-8.435132164378447e+262" (23)
x:f6a56e1fc2f8f359 -3.37405e+263 res:"-3.3740528657513786e+263" (24)
x:f6c56e1fc2f8f359 -1.34962e+264 res:"-1.3496211463005515e+264" (24)
x:f6e56e1fc2f8f359 -5.39848e+264 res:"-5.398484585202206e+264" (23)
x:f7056e1fc2f8f359 -2.15939e+265 res:"-2.1593938340808823e+265" (24)
x:f7256e1fc2f8f359 -8.63758e+265 res:"-8.63757533632353e+265" (22)
x:f7456e1fc2f8f359 -3.45503e+266 res:"-3.455030134529412e+266" (23)
x:f7656e1fc2f8f359 -1.38201e+267 res:"-1.3820120538117647e+267" (24)
x:f7856e1fc2f8f359 -5.52805e+267 res:"-5.528048215247059e+267" (23)
x:f7a56e1fc2f8f359 -2.21122e+268 res:"-2.2112192860988235e+268" (24)
x:f7c56e1fc2f8f359 -8.84488e+268 res:"-8.844877144395294e+268" (23)
x:f7e56e1fc2f8f359 -3.53795e+269 res:"-3.5379508577581176e+269" (24)
x:f8056e1fc2f8f359 -1.41518e+270 res:"-1.415180343103247e+270" (23)
x:f8256e1fc2f8f359 -5.66072e+270 res:"-5.660721372412988e+270" (23)
x:f8456e1fc2f8f359 -2.26429e+271 res:"-2.2642885489651953e+271" (24)
x:f8656e1fc2f8f359 -9.05715e+271 res:"-9.057154195860781e+271" (23)
x:f8856e1fc2f8f359 -3.62286e+272 res:"-3.6228616783443124e+272" (24)
x:f8a56e1fc2f8f359 -1.44914e+273 res:"-1.449144671337725e+273" (23)
x:f8c56e1fc2f8f359 -5.79658e+273 res:"-5.7965786853509e+273" (21)
x:f8e56e1fc2f8f359 -2.31863e+274 res:"-2.31863147414036e+274" (22)
x:f9056e1fc2f8f359 -9.27453e+274 res:"-9.27452589656144e+274" (22)
x:f9256e1fc2f8f359 -3.70981e+275 res:"-3.709810358624576e+275" (23)
x:f9456e1fc2f8f359 -1.48392e+276 res:"-1.4839241434498304e+276" (24)
x:f9656e1fc2f8f359 -5.9357e+276 res:"-5.935696573799321e+276" (23)
x:f9856e1fc2f8f359 -2.37428e+277 res:"-2.3742786295197286e+277" (24)
x:f9a56e1fc2f8f359 -9.49711e+277 res:"-9.497114518078914e+277" (23)
x:f9c56e1fc2f8f359 -3.79885e+278 res:"-3.798845807231566e+278" (23)
x:f9e56e1fc2f8f359 -1.51954e+279 res:"-1.5195383228926263e+279" (24)
x:fa056e1fc2f8f359 -6.07815e+279 res:"-6.078153291570505e+279" (23)
x:fa256e1fc2f8f359 -2.43126e+280 res:"-2.431261316628202e+280" (23)
x:fa456e1fc2f8f359 -9.72505e+280 res:"-9.725045266512808e+280" (23)
x:fa656e1fc2f8f359 -3.89002e+281 res:"-3.8900181066051233e+281" (24)
x:fa856e1fc2f8f359 -1.55601e+282 res:"-1.5560072426420493e+282" (24)
x:faa56e1fc2f8f359 -6.22403e+282 res:"-6.224028970568197e+282" (23)
x:fac56e1fc2f8f359 -2.48961e+283 res:"-2.489611588227279e+283" (23)
x:fae56e1fc2f8f359 -9.95845e+283 res:"-9.958446352909116e+283" (23)
x:fb056e1fc2f8f359 -3.98338e+284 res:"-3.983378541163646e+284" (23)
x:fb256e1fc2f8f359 -1.59335e+285 res:"-1.5933514164654585e+285" (24)
x:fb456e1fc2f8f359 -6.37341e+285 res:"-6.373405665861834e+285" (23)
x:fb656e1fc2f8f359 -2.54936e+286 res:"-2.5493622663447336e+286" (24)
x:fb856e1fc2f8f359 -1.01974e+287 res:"-1.0197449065378935e+287" (24)
x:fba56e1fc2f8f359 -4.07898e+287 res:"-4.078979626151574e+287" (23)
x:fbc56e1fc2f8f359 -1.63159e+288 res:"-1.6315918504606295e+288" (24)
x:fbe56e1fc2f8f359 -6.52637e+288 res:"-6.526367401842518e+288" (23)
x:fc056e1fc2f8f359 -2.61055e+289 res:"-2.6105469607370072e+289" (24)
x:fc256e1fc2f8f359 -1.04422e+290 res:"-1.0442187842948029e+290" (24)
x:fc456e1fc2f8f359 -4.17688e+290 res:"-4.1768751371792116e+290" (24)
x:fc656e1fc2f8f359 -1.67075e+291 res:"-1.6707500548716846e+291" (24)
x:fc856e1fc2f8f359 -6.683e+291 res:"-6.683000219486739e+291" (23)
x:fca56e1fc2f8f359 -2.6732e+292 res:"-2.6732000877946954e+292" (24)
x:fcc56e1fc2f8f359 -1.06928e+293 res:"-1.0692800351178782e+293" (24)
x:fce56e1fc2f8f359 -4.27712e+293 res:"-4.277120140471513e+293" (23)
x:fd056e1fc2f8f359 -1.71085e+294 res:"-1.710848056188605e+294" (23)
x:fd256e1fc2f8f359 -6.84339e+294 res:"-6.84339222475442e+294" (22)
x:fd456e1fc2f8f359 -2.73736e+295 res:"-2.737356889901768e+295" (23)
x:fd656e1fc2f8f359 -1.09494e+296 res:"-1.0949427559607072e+296" (24)
x:fd856e1fc2f8f359 -4.37977e+296 res:"-4.379771023842829e+296" (23)
x:fda56e1fc2f8f359 -1.75191e+297 res:"-1.7519084095371316e+297" (24)
x:fdc56e1fc2f8f359 -7.00763e+297 res:"-7.007633638148526e+297" (23)
x:fde56e1fc2f8f359 -2.80305e+298 res:"-2.8030534552594105e+298" (24)
x:fe056e1fc2f8f359 -1.12122e+299 res:"-1.1212213821037642e+299" (24)
x:fe256e1fc2f8f359 -4.48489e+299 res:"-4.484885528415057e+299" (23)
x:fe456e1fc2f8f359 -1.79395e+300 res:"-1.7939542113660227e+300" (24)
x:fe656e1fc2f8f359 -7.17582e+300 res:"-7.175816845464091e+300" (23)
x:fe856e1fc2f8f359 -2.87033e+301 res:"-2.8703267381856364e+301" (24)
7 (2)
9 (2)
10 (1)
11 (2)
12 (2)
13 (1)
14 (2)
15 (2)
16 (1)
17 (4)
18 (14)
19 (24)
20 (10)
21 (32)
22 (187)
23 (421)
24 (293)

std::numeric_limits<T>::digits10 15
std::numeric_limits<T>::min() 2.22507e-308
std::numeric_limits<T>::max() 1.79769e+308
std::numeric_limits<T>::max_digits10 17
std::numeric_limits<T>::max_exponent10 308
maxBufferRequired<T>() 24
GordonLElliott commented 4 years ago

Especially notice the sequence:

x:bee56e1fc2f8f359 -1.02187e-05 res:"-1.0218702384817766e-05" (23)
x:bf056e1fc2f8f359 -4.08748e-05 res:"-4.087480953927106e-05" (22)
x:bf256e1fc2f8f359 -0.000163499 res:"-0.00016349923815708425" (23)
x:bf456e1fc2f8f359 -0.000653997 res:"-0.000653996952628337" (21)
x:bf656e1fc2f8f359 -0.00261599 res:"-0.002615987810513348" (21)
x:bf856e1fc2f8f359 -0.010464 res:"-0.010463951242053392" (21)
x:bfa56e1fc2f8f359 -0.0418558 res:"-0.04185580496821357" (20)
x:bfc56e1fc2f8f359 -0.167423 res:"-0.16742321987285427" (20)
x:bfe56e1fc2f8f359 -0.669693 res:"-0.6696928794914171" (19)
x:c0056e1fc2f8f359 -2.67877 res:"-2.6787715179656684" (19)
x:c0256e1fc2f8f359 -10.7151 res:"-10.715086071862673" (19)
x:c0456e1fc2f8f359 -42.8603 res:"-42.860344287450694" (19)
x:c0656e1fc2f8f359 -171.441 res:"-171.44137714980278" (19)
x:c0856e1fc2f8f359 -685.766 res:"-685.7655085992111" (18)
x:c0a56e1fc2f8f359 -2743.06 res:"-2743.0620343968444" (19)
x:c0c56e1fc2f8f359 -10972.2 res:"-10972.248137587378" (19)
x:c0e56e1fc2f8f359 -43889 res:"-43888.99255034951" (18)
x:c1056e1fc2f8f359 -175556 res:"-175555.97020139804" (19)
x:c1256e1fc2f8f359 -702224 res:"-702223.8808055922" (18)
x:c1456e1fc2f8f359 -2.8089e+06 res:"-2808895.5232223687" (19)
x:c1656e1fc2f8f359 -1.12356e+07 res:"-11235582.092889475" (19)
x:c1856e1fc2f8f359 -4.49423e+07 res:"-44942328.3715579" (17)
x:c1a56e1fc2f8f359 -1.79769e+08 res:"-179769313.4862316" (18)
x:c1c56e1fc2f8f359 -7.19077e+08 res:"-719077253.9449264" (18)
x:c1e56e1fc2f8f359 -2.87631e+09 res:"-2876309015.7797055" (19)
x:c2056e1fc2f8f359 -1.15052e+10 res:"-11505236063.118822" (19)
x:c2256e1fc2f8f359 -4.60209e+10 res:"-46020944252.47529" (18)
x:c2456e1fc2f8f359 -1.84084e+11 res:"-184083777009.90115" (19)
x:c2656e1fc2f8f359 -7.36335e+11 res:"-736335108039.6046" (18)
x:c2856e1fc2f8f359 -2.94534e+12 res:"-2945340432158.4185" (19)
x:c2a56e1fc2f8f359 -1.17814e+13 res:"-11781361728633.674" (19)
x:c2c56e1fc2f8f359 -4.71254e+13 res:"-47125446914534.695" (19)
x:c2e56e1fc2f8f359 -1.88502e+14 res:"-188501787658138.78" (19)
x:c3056e1fc2f8f359 -7.54007e+14 res:"-754007150632555.1" (18)
x:c3256e1fc2f8f359 -3.01603e+15 res:"-3016028602530220.5" (19)
x:c3456e1fc2f8f359 -1.20641e+16 res:"-12064114410120882" (18)
x:c3656e1fc2f8f359 -4.82565e+16 res:"-48256457640483528" (18)
x:c3856e1fc2f8f359 -1.93026e+17 res:"-193025830561934112" (19)
x:c3a56e1fc2f8f359 -7.72103e+17 res:"-772103322247736448" (19)
x:c3c56e1fc2f8f359 -3.08841e+18 res:"-3088413288990945792" (20)
x:c3e56e1fc2f8f359 -1.23537e+19 res:"-12353653155963783168" (21)
x:c4056e1fc2f8f359 -4.94146e+19 res:"-49414612623855132672" (21)
x:c4256e1fc2f8f359 -1.97658e+20 res:"-197658450495420530688" (22)
x:c4456e1fc2f8f359 -7.90634e+20 res:"-790633801981682122752" (22)
x:c4656e1fc2f8f359 -3.16254e+21 res:"-3162535207926728491008" (23)
x:c4856e1fc2f8f359 -1.26501e+22 res:"-1.2650140831706914e+22" (23)
x:c4a56e1fc2f8f359 -5.06006e+22 res:"-5.060056332682766e+22" (22)
x:c4c56e1fc2f8f359 -2.02402e+23 res:"-2.0240225330731062e+23" (23)
x:c4e56e1fc2f8f359 -8.09609e+23 res:"-8.096090132292425e+23" (22)
x:c5056e1fc2f8f359 -3.23844e+24 res:"-3.23843605291697e+24" (21)

Also interesting is that in the binary (hex) dump of the IEEE format, the binary mantissa (bottom 52 bits) is always the same. That is because *=4 just ups the binary exponent by 2 (which shows in the top 11 or 12 bits.

And notice in the decimal output, in the range:

x:bfe56e1fc2f8f359 -0.669693 res:"-0.6696928794914171" (19)
x:c0056e1fc2f8f359 -2.67877 res:"-2.6787715179656684" (19)
x:c0256e1fc2f8f359 -10.7151 res:"-10.715086071862673" (19)
x:c0456e1fc2f8f359 -42.8603 res:"-42.860344287450694" (19)
x:c0656e1fc2f8f359 -171.441 res:"-171.44137714980278" (19)
x:c0856e1fc2f8f359 -685.766 res:"-685.7655085992111" (18)
x:c0a56e1fc2f8f359 -2743.06 res:"-2743.0620343968444" (19)
x:c0c56e1fc2f8f359 -10972.2 res:"-10972.248137587378" (19)
x:c0e56e1fc2f8f359 -43889 res:"-43888.99255034951" (18)
x:c1056e1fc2f8f359 -175556 res:"-175555.97020139804" (19)
x:c1256e1fc2f8f359 -702224 res:"-702223.8808055922" (18)
x:c1456e1fc2f8f359 -2.8089e+06 res:"-2808895.5232223687" (19)
x:c1656e1fc2f8f359 -1.12356e+07 res:"-11235582.092889475" (19)
x:c1856e1fc2f8f359 -4.49423e+07 res:"-44942328.3715579" (17)
x:c1a56e1fc2f8f359 -1.79769e+08 res:"-179769313.4862316" (18)
x:c1c56e1fc2f8f359 -7.19077e+08 res:"-719077253.9449264" (18)
x:c1e56e1fc2f8f359 -2.87631e+09 res:"-2876309015.7797055" (19)
x:c2056e1fc2f8f359 -1.15052e+10 res:"-11505236063.118822" (19)
x:c2256e1fc2f8f359 -4.60209e+10 res:"-46020944252.47529" (18)
x:c2456e1fc2f8f359 -1.84084e+11 res:"-184083777009.90115" (19)
x:c2656e1fc2f8f359 -7.36335e+11 res:"-736335108039.6046" (18)
x:c2856e1fc2f8f359 -2.94534e+12 res:"-2945340432158.4185" (19)
x:c2a56e1fc2f8f359 -1.17814e+13 res:"-11781361728633.674" (19)
x:c2c56e1fc2f8f359 -4.71254e+13 res:"-47125446914534.695" (19)
x:c2e56e1fc2f8f359 -1.88502e+14 res:"-188501787658138.78" (19)
x:c3056e1fc2f8f359 -7.54007e+14 res:"-754007150632555.1" (18)
x:c3256e1fc2f8f359 -3.01603e+15 res:"-3016028602530220.5" (19)

There are almost always exactly 17 significant digits. (One negative, one decimal point, to 19 characters--occasiinally the last rounds to 0 and it drops to 16 significant digits because the 17th is '0'.)

After that it continues:

x:c3456e1fc2f8f359 -1.20641e+16 res:"-12064114410120882" (18)
x:c3656e1fc2f8f359 -4.82565e+16 res:"-48256457640483528" (18)
x:c3856e1fc2f8f359 -1.93026e+17 res:"-193025830561934112" (19)
x:c3a56e1fc2f8f359 -7.72103e+17 res:"-772103322247736448" (19)
x:c3c56e1fc2f8f359 -3.08841e+18 res:"-3088413288990945792" (20)
x:c3e56e1fc2f8f359 -1.23537e+19 res:"-12353653155963783168" (21)
x:c4056e1fc2f8f359 -4.94146e+19 res:"-49414612623855132672" (21)
x:c4256e1fc2f8f359 -1.97658e+20 res:"-197658450495420530688" (22)
x:c4456e1fc2f8f359 -7.90634e+20 res:"-790633801981682122752" (22)
x:c4656e1fc2f8f359 -3.16254e+21 res:"-3162535207926728491008" (23)
x:c4856e1fc2f8f359 -1.26501e+22 res:"-1.2650140831706914e+22" (23)

The first 2 lines still have exactly 17 significant digits (only a negative character of the 18). After that it starts to present more significant digits (in the conversion from binary) to fill out the integer format until it finally at 22 significant digits decides on the next line to switch to exponential format. (Which, by the way, goes back to exactly 17 significant digits--17+ 2 exponent, 2 signs, an 'e' so 17+5=23 characters.)

GordonLElliott commented 4 years ago

AFAICT max_exponent10 should basically reflect the number of decimal digits that the exponent can introduce plus the number of decimal digits that the mantissa can generate.

I think part of the issue is the difference between base 10 character display and base 2 binary storage.

The base 2 binary (in 32 or 64 bits, respectively, for float and double) when valid bit combination represent a certain mathematical number. Then we have the problem of how to display that number in the character base 10 system. There are 3 or 4 different formats, I think, let me enumerate, and I think these are chosen in the priority order I am listing:

  1. Integer (When the number represented is an integer and does not have too many digits, uses direct integer display. May have a negative sign and no other characters.) Note special case of zero, presented as '0' single digit.
  2. Decimal fraction >= 1.0 (When the number is fractional, that means there are fractions of discrete integers to represent, it uses numbers before and after the decimal point. Here I mean explicitly that there are one or more non-zero digits to the left of the decimal point. As long as the decimal point does not move such as to create too long a string, it will use that format for numbers >= 1.0. Of course negative numbers same rule with leading minus sign.)
  3. Decimal fraction < 1.0 (When the number is fractional but less than 1, and it can still represent without too many characters, it puts '0.' followed by as many digits to represent as accurately as possible, but will stop and round before presenting too many digits. . Of course negative numbers same rule with leading minus sign.)
  4. Exponential notation (When outside the other cases then it switches to exponential notation. Note absolute zero is accounted in case 1, not this case. Exponential notation then really does not care about what the binary exponent is but rather what the mathematical number being represented is. Then that mathematical number is presented first with a "mantissa" in decimal notation with a first digit 1 through 9, then decimal, then up to the limit of fractional digits. Whatever the alloted space it then rounds to that many digits--and then truncates any trailing zeros rather than display those. And then presents the 'e' and exponent. The exponent only turns out to be limited to 2 or 3 characters by the limits that the binary number can store, not really matter how it's binary storage is accomplished or any of the details thereof. So normalized or denormalized binary storage is of absolutely no consequence, only what mathematical number is being represented by that binary number needing presentation. The max_exponent10 is just the largest number for the displayed exponent that the algorithm is capable of generating, based upon the largest possible number that can be represented in the particular binary representation. Also note it will never present a "denormalized" character format for the mantissa, that will always be in range 1 <= mantissa < 10. The exponent is then determined as that exponent needed to make that so, and is exactly unique for any non-zero rational number.

While I may not have done a very good job of presenting the rules, I think that they are a fixed set of rules and can be understood. While not explicitly stated that way, I think that is an equivalent to the rules presented in cpp reference.

Thus I think we can predict the buffer size from those rules. I think my algorithm above works with either overapproximation but never underapproximates. Furthremore it does not go above 16 except in double, long double, and long long type formats, all 32 bit or smallwer formats have a 16 character or less representation (even non-floating). So if sizeof(T)<=4 then fits in 16 characters.

We have experimentally come up with the numbers @edwinvp gave in the link on buffer sizes.

I would also note that we have not accounted for locale based variants--I am asuming that as far as strict conversions of base types without formatting as intended here, the most that will happen is that the decimal point will change character. I don't think there is any locale based change to minus sign, is there? And formatting is required for more advanced conversions, won't use the method here if one wants accounting formats, etc. I am especially interested in all this to produce statistical results, transfer to spreadsheets, etc., with large numbers of values so needs to be efficient. I think it is worth the time to get this efficient--so much work has gone into efficiency in version 7.

Unless one has quad precision defined, or the special 80 bit, then we only have 2 cases: All integral less than long long, and float fit in 16 characters. Then double fits in 24 characters, as does long long integral variants. Could use a 16 character fast method for all except the special cases, then use my algorithm or hard code those cases. Users with special quad or 80 bit floating formats might heed to add a hard-code variable?

This is a key result, that all the smaller formats will be guaranteed to fit in 16 characters. An efficient method can be used for these, even if that efficient method is limited to 16 characers.

PS: Seems there should be a C++ library constant that tells this buffer size, but I have scoured the Internet and can't find such.

jtv commented 4 years ago

Sorry, it's very hard for me to deal with all this text! It's been confusing me and wearing me out. Making your text clear, concise, and relevant is worth much more than adding more detail.

Here's the situation as I understand it at the moment, for any given floating-point type:

  1. There are two notations, e and f. Let's call the lengths of their longest values Me and Mf respectively.
  2. What we want is a safe, tight upper bound on the length of the strings that to_chars generates.
  3. For any given value, to_chars always chooses the shortest of the two notations.
  4. The longest value in one notation won't generally be the longest in the other.
  5. We can ignore infinities and NaNs for now.
  6. In practical floating-point types, Me <= Mf.
  7. max(Me, Mf) will be a safe upper bound, but it's not tight enough.
  8. min(Me, Mf) is a safe upper bound: no value is longer in e, and if it's longer in f, then charconv will choose e notatoin.
  9. min(Me, Mf) sounds like a tight upper bound.
  10. For practical floating-point types, min(Me, Mf) == Me.
  11. Me == 1 (for sign) + 1 (for decimal point) + 1 (for 'e') + 1 (for exponent sign) + max_digits10 + max number of digits in the exponent + 1 (terminating zero).

Looks like the value of max number of digits in the exponent is the final piece of the puzzle. Is there a portable way to find it? Experimentally I see up to 3 digits for a 64-bit double and up to 4 digits for a 128-bit long double. But I can't prove that I've found the worst cases, and there are other floating-point types out there.

GordonLElliott commented 4 years ago

(deleting comment)

GordonLElliott commented 4 years ago

This experimentally worked in every case on VS2017 or VS2019. I ran a lot of different types both integral and floating. But I don't actually have >64 bit long double, that is just double on VS, so not tested but mathematically it should work. Does not count a terminating zero, add one more. With added 1 for terminating zero, agrees with @jtv 's formula, but working out the macros that are defined in C++17 for all the decisions.

// For floating types, this returns the number of digits in the exponent.
// This does not include the sign character, nor the 'e' exponent
// designator. 
template <typename T>
constexpr size_t exponentSize()
{
    const size_t es{ std::numeric_limits<T>::max_exponent10 };
    return
        es>=100000u ? 6 :   // This is getting out of hand... stop!
        es>=10000u ? 5 :
        es>=1000u ? 4 :
        es>=100u ? 3 :
        es>=10u ?2 :
        1
        ;
}

// Return the number of significant digits that are projected to be used by
// to_chars.
template <typename T>
constexpr size_t significantDigits()
{
    // Note some non-floating types don't have non-zero max_digits10.
    // The max_digits10 always works on floating types.
    if (std::numeric_limits<T>::max_digits10 > 0)
        return std::numeric_limits<T>::max_digits10;
    else    // So using an upgrade to digits10:
        return std::numeric_limits<T>::digits10 + 1;
        // Here handle issue that to_string digits might exceed digits10.
}

// Actual buffer size projected to be needed by to_chars.
template <typename T>
constexpr size_t maxBufferRequired()
{
    if (std::is_floating_point<T>::value)  // A floating type?..
        return
        significantDigits<T>()+ // Significant digits..
        1 +                     // Leading minus sign
        1 +                     // decimal point (in locale format)
        1 +                     // Exponent character 'e'
        1 +                     // Exponent's sign character (- or +)
        exponentSize<T>()       // Number of characters in Exponent
        ;
    else if (std::is_signed<T>::value) // Integral's min negative for signed
        return
        significantDigits<T>()+ // Significant digits..
        1                       // Leading minus sign
        ;
    else                        // Unsigned!
        return
        significantDigits<T>()  // Significant digits..
        // Note there is no minus sign
        ;
}

The characters it counts are documented in the code. Note that max_digits10 only works on floating types, and that digits10 doesn't give the maximum number of characters for integral types (at least on VS).

GordonLElliott commented 4 years ago

Alternative for the counting exponent size. I would note that rather robust constexpr functions have been available since C++14, even more extensive in C++17. Works perfectly in both VS2017 and VS2019 set for C++17.

// For number d of type size_t, how many digits does it have?
constexpr size_t sizeDigits(const size_t d)
{
    size_t m{ d };
    size_t n{ 1 };
    while (m >= 10U) {
        m /= 10u;
        ++n;
    }
    return n;
}

// For floating types, this returns the number of digits in the exponent.
// This does not include the sign character, nor the 'e' exponent
// designator. 
template <typename T>
constexpr size_t exponentSize()
{
    return sizeDigits(std::numeric_limits<T>::max_exponent10);
}
GordonLElliott commented 4 years ago

PS: The above function (with new exponentSize method) not only compiles the following in VS2017:

char aa_int[maxBufferRequired<int>()];          // Note size 11
char aa_long_long[maxBufferRequired<long long>()];  // Note size 20
char aa_float[maxBufferRequired<float>()];      // Note size 15
char aa_ull[maxBufferRequired<unsigned long long>()];   // Note size 20
char aa_double[maxBufferRequired<double>()];        // Note size 24
char aa_char[maxBufferRequired<char>()];        // Note size 4
char aa_uchar[maxBufferRequired<unsigned char>()];  // Note size 3
char aa_ldouble[maxBufferRequired<long double>()];  // Note size 24 (same as double)

Even the text editor knows how to evaluate them. The noted sizes were found by hovering over the arrays!

IN another application or use, the memory could easily be allocated on the stack for efficiency. I know the case in question is std::string which is returned, so have to allocate from heap there. But maximum size is no more than 3 double variables on the stack.

GordonLElliott commented 4 years ago

I managed to turn on the two flags in config-public-compiler.h, in the -master downloaded today.

However in strconv.hxx I had to comment the lines starting 595:

template<typename F>
inline std::string to_dumb_stringstream(dumb_stringstream<F> &s, F value)
{
  s.str("");
  s << value;
  return s.str();
}

because they referred to then non-existent dumb_stringstream and were not commented by #if. Before defining PQXX_HAVE_CHARCONV_FLOAT and PQXX_HAVE_CHARCONV_INT it compiled properly. VS2017. With this change I was able to build and run runner tests, have not constructed a usage to test the buffer issues yet.

ALSO we probably need to figure out why CMake scripting is not turning on those flags, since the functions implied clearly work. Same (CMake leaves undefined) in both VS2017 and VS2019.

GordonLElliott commented 4 years ago

Reading the fine print: ( @jtv this is here for my documentation of this problem as I just found most of these details, Piecing standards and what you have done together. )

Fine print on to_chars:

3) value is converted to a string as if by std::printf in the default ("C") locale. The conversion specifier is f or e (resolving in favor of f in case of a tie), chosen according to the requirement for a shortest representation: the string representation consists of the smallest number of characters such that there is at least one digit before the radix point (if present) and parsing the representation using the corresponding std::from_chars function recovers value exactly. If there are several such representations, one with the smallest difference to value is chosen, resolving any remaining ties using rounding according to std::round_to_nearest.

(Consistent with way @jtv said...)

AND then you guys were speaking cryptically and it took me a long time to find all this--just documenting where the affected code is:

strconv.cxx 670:

template std::string to_string_float(float);
template std::string to_string_float(double);
template std::string to_string_float(long double);

conversions.hxx 120:

  static constexpr std::size_t size_buffer(T const &) noexcept
  {
    /** Includes a sign if needed; a possible leading zero before the decimal
     * point; the full number of base-10 digits which may be needed; a decimal
     * point if needed; and the terminating zero.
     */
    return 1 + 1 + std::numeric_limits<T>::max_digits10 + 1 + 1;
  }

(Presumably the code to be improved -- here only applying to the 3 float types not integral types.)

strconv.cxx 604:

/// Floating-point implementations for @c pqxx::to_string().
template<typename T> std::string to_string_float(T value)
{
#if defined(PQXX_HAVE_CHARCONV_FLOAT)
  {
    constexpr auto space{float_traits<T>::size_buffer(value)};
    std::string buf;
    buf.resize(space);
    std::string_view const view{
      float_traits<T>::to_buf(buf.data(), buf.data() + space, value)};
    buf.resize(view.end() - view.begin());
    return buf;
  }
#else
   < .... The horrible way .... >

... the usage that apparently failed!

I have not figured out where to_string goes for the other non-floating types? Do they always work on all systems, and only the floating types were missing on some systems, requiring this specialization?

Really all that is needed is something like my exponentSize function above, booth the loop and the single return versions are tested to work in VS. Constexpr functions are much more robust by time we get to C++17, and VS has been lagging and GNU leading on features. Besides this use is dynamic, returning string.

jtv commented 4 years ago

@GordonLElliott thanks, I made that bit of dumb_stringstream-related code conditional. So you should no longer need to comment it out.

Sorry if I was unclear to you. I would have been happy to explain if asked. There's a separate float_traits template for the floating-point conversions, and its size_buffer() function is the thing we're trying to fix.

Where does to_string go for non-floating-point types? There's a single generic implementation near the bottom of include/pqxx/conversions.hxx. It uses string_traits<TYPE>::into_buf(). And that function in turn has lots of different implementations for different types. (There's a generic implementation which makes use of to_buf(), but it's likely to be a lot slower than a specialised implementation.)

A quick overview there: libpqxx has 3 ways of representing a value as a string, and mostly you can choose based on optimisation needs:

All of this can become just a little bit simpler once every compiler supports to_chars.

Next, totally agree: we ought to find out why CMake is setting PQXX_HAVE_CHARCONV_FLOAT but not in another! Could be something as silly as "the test code for this feature produces some completely unrelated error in one compiler but not in another." I wonder why my CMakeOutput.log doesn't say anything about it.

Finally, I'm starting to understand what you're saying about exponent size, and it makes sense to me. I'll just need to dig a bit more into the negative exponents to make sure I understand the implications there. Weird things could happen when exponents don't have zero in the middle of their value range, as well as with denormalised values. We need to accommodate the number of decimal digits in the exponent at either extreme of the range.

GordonLElliott commented 4 years ago

On my VS2017 and VS2019 builds, neither flag is set: PQXX_HAVE_CHARCONV_FLOAT or PQXX_HAVE_CHARCONV_INT Yet both are actually available. I manually set both. I generated the library with and without using Unicode character set on both 2017 and 2019 and in all cases the only flags set were:

/* Define if compiler provides strnlen */
#define PQXX_HAVE_STRNLEN
/* Define if compiler provides strnlen_s */
#define PQXX_HAVE_STRNLEN_S
/* Define if thread_local is fully supported. */
#define PQXX_HAVE_THREAD_LOCAL
GordonLElliott commented 4 years ago

By the way, one of the functions I was experimenting with was:

std::numeric_limits<T>::min()

Now this one is very weird in its difference between floating and integral types. For a signed integer type it produced the most negative integer. However for floating types, it produced the positive value that is the smallest exponent. (However the significant digit used to display happen to be short, so not worst case string length.)

Also of interest is that IEEE floating types are not two's complement. Actually probably better described as sign-magnitude. But the negative sign is independent of the rest. So the negative sign at beginning of mantissa does not affect the rest of the number, and the largest length positive or negative can simply be negated to produce the other. Largest negative value is just minus of the largest positive value: -std::numeric_limits<T>::max()

Hey, here is an interesting page, set bits and see the displayed float value: https://evanw.github.io/float-toy/ This definitely does not display the longest mantissa as our function, but it is interesting to change the bits and see the exponent values change.

I'm working on a generator that will quickly find the worst cases that can be used for test suite, and should work for all three floating types. (Unfortunately I can't test a quad or 80 bit float myself.)

I know you know of other compilers that work on Windows (have listed), but question is there one that handles large floating types? I should be able to run the GNU with no problems as a console only, all that is needed, I will look into that, but you guys are already testing that so sort of redundant. I suppose if I get an idea you can run on yours to see what it generates.

Also, what compilers need to support pqxx, yet use a non-IEEE floating point? (We know all the IEEE formats exactly they are so well documented, even if I can't personally test all of them.)

Also the de-normalized values do allow a larger range in the negative exponent direction. Not in the positive exponent direction because the largest numbers can't be denormalized otherwise they would be less than the largest. So IEEE double (64 bit) largest number when displayed in base 10 with an exponent e+308, while the smallest (denormalized) number when displayed base 10 has exponent e-324. Notice they use the sign always and the 'e' always so exponent is just 2 more than max digits. In this case we have asymetrical negative-positive values but they don't roll over a 10's column.

Speculating: IF a particular floating system generated a largest positive exponent in base 10 display of say e+995, then there could be a problem of base 10 exponent rollover when the denormalized value had a negative exponent something like e-1010. I am hoping the compiler generators give a correct value of max_digits10 of 4 in that example, even though the max digits in positive exponent was only 3 digits.

GordonLElliott commented 4 years ago

Here is a loop structure for testing that more or less guarantees largest strings, based upon first principles. Beyond what I have done should reconstruct the original value. (And of course don't print them--but the printing is given here so you can experiment first and see the values created). Need to compile/link for libpqxx of course. Someone with a compiler that generates long double that means something should try this.

(Edited: Better documentatoin and more robust looping.) (Edited: Due to concern on large positive exponent, added 3rd loop starting large positive e.) (Edited: Print hex of floating format for arbitrary size, hope we test some others...)

template <typename T>
void Printout(T x, const std::string& s)
{
    const unsigned endianTest = 1;
    bool littleEndian = *(unsigned char*)&endianTest == 1;// Little endian?
    const int ST = sizeof T;
    std::cout << "x:";
    for (int i = 0; i < ST; ++i) {
        unsigned b = ((unsigned char*)&x)[littleEndian ? ST - 1 - i : i];
        std::cout << std::hex << std::setw(2) << std::setfill('0') << b;
    }
    std::cout << std::dec << " " << x << " res:\"" << s
        << "\" (" << s.length() << ")" << std::endl;
}

// Here do a test sequence that may fail, to set for libpqxx testing suite. This
// is only applicable to a floating type. Do this in a catch to trap the error
// if one occurs. If no error will return, errors will throw ??.
template <typename T>
std::string doTestForLibpqxx()
{
    std::string retStr;
    // First loop starts at smallest normal floating value, works up a bit.
    const T initialX{ -std::numeric_limits<T>::min() }; // Neg so neg values!
    T x{ initialX };                    // Start here
    const T upLim{ -std::numeric_limits<T>::max() / 2 };    // Sure to stop here.
    std::size_t Nloop1{ 40 };   // Trust me, does all it needs (long story...)
    // Second loop goes down into denormalized values...
    std::size_t Nloop2{ std::numeric_limits<T>::digits * 16 };  // Enough to minimum.
    // Third loop goes down from the topmost positive exponents (just in case)
    const T initialBigX{ -std::numeric_limits<T>::max() };  // Neg so neg values!
    std::size_t Nloop3{ Nloop1 };   // ..all it needs, same as loop 1

    std::cout << "\n\nTest floating of size " << (sizeof T) << std::endl;
    // Note x is negative value, and going more negative to a most negative
    // limit. This loop uses "exponential growth" to quickly scan entire range
    // of exponents. However all that is needed is short sequence. Keep Nloop1
    // short, unless you want to see the entire sequence then make that a very
    // large number and let upLim stop the loop.
    std::cout << "Loop1: Up from smallest normal exponent." << std::endl;
    for (std::size_t i = 0; i <= Nloop1 && std::isnormal(x) && x >= upLim; ++i) {
        std::string const Objstr{ pqxx::to_string(x) };
        retStr = Objstr;    // Copy it. (Just to do something so compiler won't optimize out!)
        Printout(x, Objstr);    // Printing here only to understand, not test.
        // Note complete test should reconstruct number, etc.
        x *= 1.0625F;   // Small increase but exponential growth.
        if (x == 0) std::cout << "X reached 0." << std::endl;
    }

    std::cout << "Loop2: Now denormalize, starting smallest normal." << std::endl;
    x = initialX;
    for (std::size_t i = 0; i <= Nloop2 && !std::isnan(x) && x < 0 /*&& x!=xLast*/; ++i) {
        std::string const Objstr{ pqxx::to_string(x) };
        retStr = Objstr;    // Copy it. (Just to do something so compiler won't optimize out!)
        Printout(x, Objstr);    // Printing here only to understand, not test.
        // Note complete test should reconstruct number, etc.
        // Here doing a more robust end of run test, in case compilers do differently.
        T nextX = x / 1.0625F;  // Small decrease but exponential decay.
        // But just count down bits at the last...
        if (std::isnan(nextX) || x == nextX || nextX==0 )
            nextX = T(std::nexttoward(x, 1.0)); // Denormalize smaller negative to +.
        x = nextX;
    }

    // Third loop starts with very high exponent. (Still negative value.)
    // It will terminate by count--though could run same as loop 2 but that is huge!
    std::cout << "Loop3: Now down from largest positive exponent." << std::endl;
    x = initialBigX;
    for (std::size_t i = 0; i <= Nloop3 && std::isnormal(x) && x <= 0; ++i) {
        std::string const Objstr{ pqxx::to_string(x) };
        retStr = Objstr;    // Copy it. (Just to do something so compiler won't optimize out!)
        Printout(x, Objstr);    // Printing here only to understand, not test.
        // Note complete test should reconstruct number, etc.
        // Here doing a more robust end of run test, in case compilers do differently.
        T nextX = x / 1.0625F;  // Small decrease but exponential decay.
        // But just count down bits at the last...
        if (std::isnan(nextX) || x == nextX || nextX == 0)
            nextX = T(std::nexttoward(x, 1.0)); // Denormalize smaller negative to +.
        x = nextX;
        if (x == 0) std::cout << "X reached 0." << std::endl;
    }

    return retStr;
}

So this is not the test itself, but a looping structure example with printing that can be turned into a test. By small exponential decay or exponential growth it quickly produces long display values, but starts with the lowest normalized value.

PS, on the first loop, can get rid of the upLim limit, irrelevant won't even get close. But if want to see whole range, don't limit N or set exceedingly high and it will relatively quickly go through the entire range of exponents. It's like the wonders of compound interest, exponential growth goes through decades of numbers quickly.

GordonLElliott commented 4 years ago

Sorry on length, but here is the output data. @jtv just skip this unless you want to see the detail data, but it shows how the looping above runs through the maximum length strings for both float and double. Just call with typing. Demonstrates that it hits largest mantissa most of the time--just counting down to maximum negative exponent. (Cannot guarantee that the maximum exponent corresponds to a maximum mantissa display size to produce the worst case, but it actually enumerates all the smallest denormalized numbers so it will hit the worst possible with the particular type.) Counts are just the displayable characters, not including any terminating 0. You can see how the denormalizing steps are counting to the very last negative exponent before reaching absolute zero.

Note that this latest run is from the std::to_chars while a previous copy used the from_dumb_stringstream method. The results are different. The to_chars adheres more closely to the rules, and the largest exponents during denormalization actually correspond to small mantissa, but that is only due to the rules used. Other methods may present the entire number of mantissa digits, and thus still need full buffer size.

I have verified that this looping program fails on the old size_buffer in the library, and that the new one (presented below) succeeds when compiled into the library.

(Edit: Show latest with 3 loops.)

doTestForLibpqxx<float>();
Test floating of size 4
Loop1: Up from smallest normal exponent.
x:80800000 -1.17549e-38 res:"-1.1754944e-38" (14)
x:80880000 -1.24896e-38 res:"-1.2489627e-38" (14)
x:80908000 -1.32702e-38 res:"-1.3270229e-38" (14)
x:80998800 -1.40996e-38 res:"-1.4099619e-38" (14)
x:80a32080 -1.49808e-38 res:"-1.4980845e-38" (14)
x:80ad5288 -1.59171e-38 res:"-1.5917147e-38" (14)
x:80b827b0 -1.6912e-38 res:"-1.6911968e-38" (14)
x:80c3aa2b -1.7969e-38 res:"-1.7968967e-38" (14)
x:80cfe4ce -1.9092e-38 res:"-1.9092027e-38" (14)
x:80dce31b -2.02853e-38 res:"-2.0285279e-38" (14)
x:80eab14d -2.15531e-38 res:"-2.155311e-38" (13)
x:80f95c62 -2.29002e-38 res:"-2.2900179e-38" (14)
x:81047914 -2.43314e-38 res:"-2.433144e-38" (13)
x:810cc0a5 -2.58522e-38 res:"-2.5852155e-38" (14)
x:81158caf -2.74679e-38 res:"-2.7467913e-38" (14)
x:811ee57a -2.91847e-38 res:"-2.9184658e-38" (14)
x:8128d3d2 -3.10087e-38 res:"-3.10087e-38" (12)
x:8133610f -3.29467e-38 res:"-3.2946744e-38" (14)
x:813e9720 -3.50059e-38 res:"-3.5005915e-38" (14)
x:814a8092 -3.71938e-38 res:"-3.7193785e-38" (14)
x:8157289b -3.95184e-38 res:"-3.9518396e-38" (14)
x:81649b25 -4.19883e-38 res:"-4.1988297e-38" (14)
x:8172e4d7 -4.46126e-38 res:"-4.4612565e-38" (14)
x:81810992 -4.74008e-38 res:"-4.740085e-38" (13)
x:81891a2b -5.03634e-38 res:"-5.03634e-38" (12)
x:8191abce -5.35111e-38 res:"-5.3511115e-38" (14)
x:819ac68b -5.68556e-38 res:"-5.685556e-38" (13)
x:81a472f4 -6.0409e-38 res:"-6.0409035e-38" (14)
x:81aeba23 -6.41846e-38 res:"-6.41846e-38" (12)
x:81b9a5c5 -6.81961e-38 res:"-6.8196135e-38" (14)
x:81c54021 -7.24584e-38 res:"-7.245839e-38" (13)
x:81d19423 -7.6987e-38 res:"-7.698704e-38" (13)
x:81dead65 -8.17987e-38 res:"-8.179873e-38" (13)
x:81ec983b -8.69111e-38 res:"-8.691115e-38" (13)
x:81fb61bf -9.23431e-38 res:"-9.2343097e-38" (14)
x:82058bed -9.81145e-38 res:"-9.811454e-38" (13)
x:820de4ac -1.04247e-37 res:"-1.042467e-37" (13)
x:8216c2f7 -1.10762e-37 res:"-1.1076212e-37" (14)
x:82202f26 -1.17685e-37 res:"-1.1768474e-37" (14)
x:822a3218 -1.2504e-37 res:"-1.2504004e-37" (14)
x:8234d53a -1.32855e-37 res:"-1.3285504e-37" (14)
Loop2: Now denormalize, starting smallest normal.
x:80800000 -1.17549e-38 res:"-1.1754944e-38" (14)
x:80787878 -1.10635e-38 res:"-1.1063476e-38" (14)
x:80716253 -1.04127e-38 res:"-1.0412683e-38" (14)
x:806ab6e5 -9.80017e-39 res:"-9.800173e-39" (13)
x:80646fe7 -9.22369e-39 res:"-9.223693e-39" (13)
x:805e8770 -8.68112e-39 res:"-8.681122e-39" (13)
x:8058f7f1 -8.17047e-39 res:"-8.170468e-39" (13)
x:8053bc2e -7.68985e-39 res:"-7.689852e-39" (13)
x:804ecf3a -7.23751e-39 res:"-7.237508e-39" (13)
x:804a2c73 -6.81177e-39 res:"-6.811772e-39" (13)
x:8045cf7b -6.41108e-39 res:"-6.411079e-39" (13)
x:8041b438 -6.03396e-39 res:"-6.033958e-39" (13)
x:803dd6cb -5.67902e-39 res:"-5.679018e-39" (13)
x:803a3392 -5.34496e-39 res:"-5.344959e-39" (13)
x:8036c720 -5.03055e-39 res:"-5.03055e-39" (12)
x:80338e3c -4.73463e-39 res:"-4.734634e-39" (13)
x:803085de -4.45613e-39 res:"-4.456126e-39" (13)
x:802dab2b -4.194e-39 res:"-4.194001e-39" (13)
x:802afb74 -3.9473e-39 res:"-3.947295e-39" (13)
x:80287431 -3.7151e-39 res:"-3.715101e-39" (13)
x:80261301 -3.49657e-39 res:"-3.496566e-39" (13)
x:8023d5a7 -3.29089e-39 res:"-3.290886e-39" (13)
x:8021ba07 -3.09731e-39 res:"-3.097305e-39" (13)
x:801fbe25 -2.91511e-39 res:"-2.915111e-39" (13)
x:801de023 -2.74363e-39 res:"-2.743634e-39" (13)
x:801c1e3f -2.58224e-39 res:"-2.582244e-39" (13)
x:801a76d2 -2.43035e-39 res:"-2.430348e-39" (13)
x:8018e84d -2.28739e-39 res:"-2.287386e-39" (13)
x:80177139 -2.15283e-39 res:"-2.152833e-39" (13)
x:80161036 -2.0262e-39 res:"-2.026196e-39" (13)
x:8014c3f7 -1.90701e-39 res:"-1.907009e-39" (13)
x:80138b43 -1.79483e-39 res:"-1.794832e-39" (13)
x:801264f4 -1.68925e-39 res:"-1.689254e-39" (13)
x:80114ff5 -1.58989e-39 res:"-1.589887e-39" (13)
x:80104b41 -1.49636e-39 res:"-1.496364e-39" (13)
x:800f55e3 -1.40834e-39 res:"-1.408343e-39" (13)
x:800e6ef4 -1.3255e-39 res:"-1.3255e-39" (11)
x:800d959a -1.24753e-39 res:"-1.247528e-39" (13)
x:800cc909 -1.17414e-39 res:"-1.174144e-39" (13)
x:800c0881 -1.10508e-39 res:"-1.105077e-39" (13)
x:800b534c -1.04007e-39 res:"-1.040072e-39" (13)
x:800aa8c0 -9.78891e-40 res:"-9.78891e-40" (12)
x:800a083c -9.21309e-40 res:"-9.21309e-40" (12)
x:80097129 -8.67114e-40 res:"-8.67114e-40" (12)
x:8008e2f9 -8.16106e-40 res:"-8.16106e-40" (12)
x:80085d27 -7.68101e-40 res:"-7.68101e-40" (12)
x:8007df34 -7.22919e-40 res:"-7.22919e-40" (12)
x:800768a9 -6.80393e-40 res:"-6.80393e-40" (12)
x:8006f918 -6.40371e-40 res:"-6.40371e-40" (12)
x:80069017 -6.02703e-40 res:"-6.02703e-40" (12)
x:80062d43 -5.6725e-40 res:"-5.6725e-40" (11)
x:8005d03f -5.33882e-40 res:"-5.33882e-40" (12)
x:800578b4 -5.02478e-40 res:"-5.02478e-40" (12)
x:8005264f -4.7292e-40 res:"-4.7292e-40" (11)
x:8004d8c3 -4.45101e-40 res:"-4.45101e-40" (12)
x:80048fc7 -4.1892e-40 res:"-4.1892e-40" (11)
x:80044b16 -3.94278e-40 res:"-3.94278e-40" (12)
x:80040a6f -3.71085e-40 res:"-3.71085e-40" (12)
x:8003cd96 -3.49257e-40 res:"-3.49257e-40" (12)
x:80039451 -3.28712e-40 res:"-3.28712e-40" (12)
x:80035e6a -3.09376e-40 res:"-3.09376e-40" (12)
x:80032baf -2.91177e-40 res:"-2.91177e-40" (12)
x:8002fbf0 -2.74049e-40 res:"-2.74049e-40" (12)
x:8002cf00 -2.57929e-40 res:"-2.57929e-40" (12)
x:8002a4b5 -2.42757e-40 res:"-2.42757e-40" (12)
x:80027ce7 -2.28478e-40 res:"-2.28478e-40" (12)
x:80025770 -2.15038e-40 res:"-2.15038e-40" (12)
x:8002342d -2.02388e-40 res:"-2.02388e-40" (12)
x:800212fd -1.90483e-40 res:"-1.90483e-40" (12)
x:8001f3c1 -1.79278e-40 res:"-1.79278e-40" (12)
x:8001d65b -1.68732e-40 res:"-1.68732e-40" (12)
x:8001bab0 -1.58806e-40 res:"-1.58806e-40" (12)
x:8001a0a6 -1.49465e-40 res:"-1.49465e-40" (12)
x:80018824 -1.40674e-40 res:"-1.40674e-40" (12)
x:80017113 -1.32399e-40 res:"-1.32399e-40" (12)
x:80015b5d -1.2461e-40 res:"-1.2461e-40" (11)
x:800146ee -1.1728e-40 res:"-1.1728e-40" (11)
x:800133b3 -1.10382e-40 res:"-1.10382e-40" (12)
x:80012199 -1.03888e-40 res:"-1.03888e-40" (12)
x:80011090 -9.7777e-41 res:"-9.7777e-41" (11)
x:80010088 -9.20261e-41 res:"-9.2026e-41" (11)
x:8000f171 -8.66129e-41 res:"-8.6613e-41" (11)
x:8000e33d -8.15177e-41 res:"-8.1518e-41" (11)
x:8000d5df -7.67225e-41 res:"-7.6722e-41" (11)
x:8000c94a -7.22089e-41 res:"-7.2209e-41" (11)
x:8000bd73 -6.79616e-41 res:"-6.7962e-41" (11)
x:8000b24e -6.39637e-41 res:"-6.3964e-41" (11)
x:8000a7d1 -6.02012e-41 res:"-6.0201e-41" (11)
x:80009df2 -5.66601e-41 res:"-5.666e-41" (10)
x:800094a8 -5.33278e-41 res:"-5.3328e-41" (11)
x:80008be9 -5.01903e-41 res:"-5.019e-41" (10)
x:800083ae -4.72378e-41 res:"-4.7238e-41" (11)
x:80007bef -4.4459e-41 res:"-4.4459e-41" (11)
x:800074a5 -4.18442e-41 res:"-4.1844e-41" (11)
x:80006dc8 -3.93821e-41 res:"-3.9382e-41" (11)
x:80006753 -3.70657e-41 res:"-3.7066e-41" (11)
x:8000613f -3.48853e-41 res:"-3.4885e-41" (11)
x:80005b87 -3.28338e-41 res:"-3.2834e-41" (11)
x:80005625 -3.09028e-41 res:"-3.0903e-41" (11)
x:80005114 -2.90854e-41 res:"-2.9085e-41" (11)
x:80004c4f -2.73744e-41 res:"-2.7374e-41" (11)
x:800047d2 -2.57643e-41 res:"-2.5764e-41" (11)
x:80004398 -2.42481e-41 res:"-2.4248e-41" (11)
x:80003f9e -2.28215e-41 res:"-2.2822e-41" (11)
x:80003be0 -2.14791e-41 res:"-2.1479e-41" (11)
x:8000385a -2.02151e-41 res:"-2.0215e-41" (11)
x:80003509 -1.90254e-41 res:"-1.9025e-41" (11)
x:800031ea -1.79058e-41 res:"-1.7906e-41" (11)
x:80002efa -1.6852e-41 res:"-1.6852e-41" (11)
x:80002c37 -1.58613e-41 res:"-1.5861e-41" (11)
x:8000299d -1.4928e-41 res:"-1.4928e-41" (11)
x:8000272a -1.40494e-41 res:"-1.405e-41" (10)
x:800024dc -1.32227e-41 res:"-1.3223e-41" (11)
x:800022b1 -1.24449e-41 res:"-1.2445e-41" (11)
x:800020a7 -1.17135e-41 res:"-1.1713e-41" (11)
x:80001ebb -1.1024e-41 res:"-1.1024e-41" (11)
x:80001cec -1.03752e-41 res:"-1.0375e-41" (11)
x:80001b38 -9.76425e-42 res:"-9.764e-42" (10)
x:8000199e -9.18972e-42 res:"-9.19e-42" (9)
x:8000181c -8.64881e-42 res:"-8.649e-42" (10)
x:800016b1 -8.14014e-42 res:"-8.14e-42" (9)
x:8000155b -7.6609e-42 res:"-7.661e-42" (10)
x:80001419 -7.20968e-42 res:"-7.21e-42" (9)
x:800012ea -6.78509e-42 res:"-6.785e-42" (10)
x:800011cd -6.38572e-42 res:"-6.386e-42" (10)
x:800010c1 -6.01017e-42 res:"-6.01e-42" (9)
x:80000fc5 -5.65704e-42 res:"-5.657e-42" (10)
x:80000ed8 -5.32493e-42 res:"-5.325e-42" (10)
x:80000df8 -5.01104e-42 res:"-5.011e-42" (10)
x:80000d26 -4.71677e-42 res:"-4.717e-42" (10)
x:80000c60 -4.43931e-42 res:"-4.44e-42" (9)
x:80000ba6 -4.17867e-42 res:"-4.179e-42" (10)
x:80000af7 -3.93344e-42 res:"-3.933e-42" (10)
x:80000a52 -3.70223e-42 res:"-3.702e-42" (10)
x:800009b7 -3.48503e-42 res:"-3.485e-42" (10)
x:80000925 -3.28044e-42 res:"-3.28e-42" (9)
x:8000089b -3.08706e-42 res:"-3.087e-42" (10)
x:80000819 -2.90489e-42 res:"-2.905e-42" (10)
x:8000079f -2.73393e-42 res:"-2.734e-42" (10)
x:8000072c -2.57278e-42 res:"-2.573e-42" (10)
x:800006c0 -2.42144e-42 res:"-2.421e-42" (10)
x:8000065a -2.27851e-42 res:"-2.279e-42" (10)
x:800005fa -2.14399e-42 res:"-2.144e-42" (10)
x:800005a0 -2.01787e-42 res:"-2.018e-42" (10)
x:8000054b -1.89876e-42 res:"-1.899e-42" (10)
x:800004fb -1.78666e-42 res:"-1.787e-42" (10)
x:800004b0 -1.68156e-42 res:"-1.682e-42" (10)
x:80000469 -1.58207e-42 res:"-1.582e-42" (10)
x:80000427 -1.48958e-42 res:"-1.49e-42" (9)
x:800003e8 -1.4013e-42 res:"-1.401e-42" (10)
x:800003ad -1.31862e-42 res:"-1.319e-42" (10)
x:80000376 -1.24155e-42 res:"-1.242e-42" (10)
x:80000342 -1.16868e-42 res:"-1.169e-42" (10)
x:80000311 -1.10002e-42 res:"-1.1e-42" (8)
x:800002e3 -1.03556e-42 res:"-1.036e-42" (10)
x:800002b8 -9.75304e-43 res:"-9.75e-43" (9)
x:8000028f -9.1785e-43 res:"-9.18e-43" (9)
x:80000268 -8.632e-43 res:"-8.63e-43" (9)
x:80000244 -8.12753e-43 res:"-8.13e-43" (9)
x:80000222 -7.65109e-43 res:"-7.65e-43" (9)
x:80000202 -7.20267e-43 res:"-7.2e-43" (8)
x:800001e4 -6.78228e-43 res:"-6.78e-43" (9)
x:800001c8 -6.38992e-43 res:"-6.39e-43" (9)
x:800001ad -6.01157e-43 res:"-6.01e-43" (9)
x:80000194 -5.66125e-43 res:"-5.66e-43" (9)
x:8000017c -5.32493e-43 res:"-5.32e-43" (9)
x:80000166 -5.01665e-43 res:"-5.02e-43" (9)
x:80000151 -4.72238e-43 res:"-4.72e-43" (9)
x:8000013d -4.44212e-43 res:"-4.44e-43" (9)
x:8000012a -4.17587e-43 res:"-4.18e-43" (9)
x:80000118 -3.92364e-43 res:"-3.92e-43" (9)
x:80000108 -3.69943e-43 res:"-3.7e-43" (8)
x:800000f8 -3.47522e-43 res:"-3.48e-43" (9)
x:800000e9 -3.26503e-43 res:"-3.27e-43" (9)
x:800000db -3.06884e-43 res:"-3.07e-43" (9)
x:800000ce -2.88667e-43 res:"-2.89e-43" (9)
x:800000c2 -2.71852e-43 res:"-2.72e-43" (9)
x:800000b7 -2.56438e-43 res:"-2.56e-43" (9)
x:800000ac -2.41023e-43 res:"-2.41e-43" (9)
x:800000a2 -2.2701e-43 res:"-2.27e-43" (9)
x:80000098 -2.12997e-43 res:"-2.13e-43" (9)
x:8000008f -2.00386e-43 res:"-2e-43" (6)
x:80000087 -1.89175e-43 res:"-1.89e-43" (9)
x:8000007f -1.77965e-43 res:"-1.78e-43" (9)
x:80000078 -1.68156e-43 res:"-1.68e-43" (9)
x:80000071 -1.58347e-43 res:"-1.58e-43" (9)
x:8000006a -1.48538e-43 res:"-1.49e-43" (9)
x:80000064 -1.4013e-43 res:"-1.4e-43" (8)
x:8000005e -1.31722e-43 res:"-1.32e-43" (9)
x:80000058 -1.23314e-43 res:"-1.23e-43" (9)
x:80000053 -1.16308e-43 res:"-1.16e-43" (9)
x:8000004e -1.09301e-43 res:"-1.1e-43" (8)
x:80000049 -1.02295e-43 res:"-1.02e-43" (9)
x:80000045 -9.66896e-44 res:"-9.7e-44" (8)
x:80000041 -9.10844e-44 res:"-9.1e-44" (8)
x:8000003d -8.54792e-44 res:"-8.5e-44" (8)
x:80000039 -7.9874e-44 res:"-8e-44" (6)
x:80000036 -7.56701e-44 res:"-7.6e-44" (8)
x:80000033 -7.14662e-44 res:"-7.1e-44" (8)
x:80000030 -6.72623e-44 res:"-6.7e-44" (8)
x:8000002d -6.30584e-44 res:"-6.3e-44" (8)
x:8000002a -5.88545e-44 res:"-5.9e-44" (8)
x:80000028 -5.60519e-44 res:"-5.6e-44" (8)
x:80000026 -5.32493e-44 res:"-5.3e-44" (8)
x:80000024 -5.04467e-44 res:"-5e-44" (6)
x:80000022 -4.76441e-44 res:"-4.8e-44" (8)
x:80000020 -4.48416e-44 res:"-4.5e-44" (8)
x:8000001e -4.2039e-44 res:"-4.2e-44" (8)
x:8000001c -3.92364e-44 res:"-3.9e-44" (8)
x:8000001a -3.64338e-44 res:"-3.6e-44" (8)
x:80000018 -3.36312e-44 res:"-3.4e-44" (8)
x:80000017 -3.22299e-44 res:"-3.2e-44" (8)
x:80000016 -3.08286e-44 res:"-3.1e-44" (8)
x:80000015 -2.94273e-44 res:"-3e-44" (6)
x:80000014 -2.8026e-44 res:"-2.8e-44" (8)
x:80000013 -2.66247e-44 res:"-2.7e-44" (8)
x:80000012 -2.52234e-44 res:"-2.5e-44" (8)
x:80000011 -2.38221e-44 res:"-2.4e-44" (8)
x:80000010 -2.24208e-44 res:"-2.2e-44" (8)
x:8000000f -2.10195e-44 res:"-2.1e-44" (8)
x:8000000e -1.96182e-44 res:"-2e-44" (6)
x:8000000d -1.82169e-44 res:"-1.8e-44" (8)
x:8000000c -1.68156e-44 res:"-1.7e-44" (8)
x:8000000b -1.54143e-44 res:"-1.5e-44" (8)
x:8000000a -1.4013e-44 res:"-1.4e-44" (8)
x:80000009 -1.26117e-44 res:"-1.3e-44" (8)
x:80000008 -1.12104e-44 res:"-1.1e-44" (8)
x:80000007 -9.80909e-45 res:"-1e-44" (6)
x:80000006 -8.40779e-45 res:"-8e-45" (6)
x:80000005 -7.00649e-45 res:"-7e-45" (6)
x:80000004 -5.60519e-45 res:"-6e-45" (6)
x:80000003 -4.2039e-45 res:"-4e-45" (6)
x:80000002 -2.8026e-45 res:"-3e-45" (6)
x:80000001 -1.4013e-45 res:"-1e-45" (6)
Loop3: Now down from largest positive exponent.
x:ff7fffff -3.40282e+38 res:"-3.4028235e+38" (14)
x:ff70f0f0 -3.20266e+38 res:"-3.2026574e+38" (14)
x:ff62c4a6 -3.01427e+38 res:"-3.0142658e+38" (14)
x:ff556dc9 -2.83696e+38 res:"-2.836956e+38" (13)
x:ff48dfcc -2.67008e+38 res:"-2.6700762e+38" (14)
x:ff3d0ede -2.51301e+38 res:"-2.5130129e+38" (14)
x:ff31efe0 -2.36519e+38 res:"-2.3651886e+38" (14)
x:ff27785a -2.22606e+38 res:"-2.2260598e+38" (14)
x:ff1d9e73 -2.09512e+38 res:"-2.0951151e+38" (14)
x:ff1458e5 -1.97187e+38 res:"-1.9718731e+38" (14)
x:ff0b9ef6 -1.85588e+38 res:"-1.8558806e+38" (14)
x:ff03686f -1.74671e+38 res:"-1.7467112e+38" (14)
x:fef75b2b -1.64396e+38 res:"-1.6439634e+38" (14)
x:fee8ce47 -1.54726e+38 res:"-1.5472597e+38" (14)
x:fedb1c7f -1.45624e+38 res:"-1.4562445e+38" (14)
x:fece38f0 -1.37058e+38 res:"-1.370583e+38" (13)
x:fec21778 -1.28996e+38 res:"-1.2899604e+38" (14)
x:feb6acad -1.21408e+38 res:"-1.2140804e+38" (14)
x:feabedd0 -1.14266e+38 res:"-1.1426639e+38" (14)
x:fea1d0c4 -1.07545e+38 res:"-1.0754484e+38" (14)
x:fe984c04 -1.01219e+38 res:"-1.0121868e+38" (14)
x:fe8f569a -9.52646e+37 res:"-9.526463e+37" (13)
x:fe86e818 -8.96608e+37 res:"-8.966083e+37" (13)
x:fe7df11e -8.43867e+37 res:"-8.438666e+37" (13)
x:fe6f010d -7.94227e+37 res:"-7.9422737e+37" (14)
x:fe60f1ee -7.47508e+37 res:"-7.475081e+37" (13)
x:fe53b686 -7.03537e+37 res:"-7.0353706e+37" (14)
x:fe474260 -6.62153e+37 res:"-6.621525e+37" (13)
x:fe3b89c4 -6.23202e+37 res:"-6.232024e+37" (13)
x:fe3081a9 -5.86543e+37 res:"-5.865434e+37" (13)
x:fe261fae -5.52041e+37 res:"-5.5204084e+37" (14)
x:fe1c5a0d -5.19568e+37 res:"-5.1956784e+37" (14)
x:fe132794 -4.89005e+37 res:"-4.8900504e+37" (14)
x:fe0a7f9a -4.6024e+37 res:"-4.6024e+37" (11)
x:fe0259fa -4.33167e+37 res:"-4.3316706e+37" (14)
x:fdf55e13 -4.07687e+37 res:"-4.0768665e+37" (14)
x:fde6ef21 -3.83705e+37 res:"-3.8370508e+37" (14)
x:fdd95988 -3.61134e+37 res:"-3.6113418e+37" (14)
x:fdcc9080 -3.39891e+37 res:"-3.39891e+37" (12)
x:fdc08800 -3.19897e+37 res:"-3.198974e+37" (13)
x:fdb534b5 -3.0108e+37 res:"-3.0107992e+37" (14)

doTestForLibpqxx<double>();
Test floating of size 8
Loop1: Up from smallest normal exponent.
x:8010000000000000 -2.22507e-308 res:"-2.2250738585072014e-308" (24)
x:8011000000000000 -2.36414e-308 res:"-2.3641409746639015e-308" (24)
x:8012100000000000 -2.5119e-308 res:"-2.5118997855803953e-308" (24)
x:8013310000000000 -2.66889e-308 res:"-2.66889352217917e-308" (22)
x:8014641000000000 -2.8357e-308 res:"-2.835699367315368e-308" (23)
x:8015aa5100000000 -3.01293e-308 res:"-3.0129305777725787e-308" (24)
x:801704f610000000 -3.20124e-308 res:"-3.201238738883365e-308" (23)
x:8018754571000000 -3.40132e-308 res:"-3.401316160063575e-308" (23)
x:8019fc99c8100000 -3.6139e-308 res:"-3.6138984200675486e-308" (24)
x:801b9c6364910000 -3.83977e-308 res:"-3.8397670713217704e-308" (24)
x:801d56299ada1000 -4.07975e-308 res:"-4.079752513279381e-308" (23)
x:801f2b8c3487b100 -4.33474e-308 res:"-4.3347370453593423e-308" (24)
x:80208f227be81608 -4.60566e-308 res:"-4.605658110694301e-308" (23)
x:80219814a3a69768 -4.89351e-308 res:"-4.893511742612695e-308" (23)
x:8022b195ede100de -5.19936e-308 res:"-5.199356226525987e-308" (23)
x:8023dcaf4cbf10ec -5.52432e-308 res:"-5.524315990683862e-308" (23)
x:80251a7a418b01fb -5.86959e-308 res:"-5.869585740101603e-308" (23)
x:80266c21e5a3b21b -6.23643e-308 res:"-6.236434848857954e-308" (23)
x:8027d2e403fded3d -6.62621e-308 res:"-6.626212026911576e-308" (23)
x:80295012443dcc11 -7.04035e-308 res:"-7.04035027859355e-308" (22)
x:802ae5136881a8d2 -7.48037e-308 res:"-7.480372171005647e-308" (23)
x:802c93649f09c35f -7.9479e-308 res:"-7.9478954316935e-308" (21)
x:802e5c9ae8fa5f95 -8.44464e-308 res:"-8.444638896174343e-308" (23)
x:803021324bc502c7 -8.97243e-308 res:"-8.97242882718524e-308" (22)
x:80312345708152f3 -9.53321e-308 res:"-9.533205628884316e-308" (23)
x:80323579c7896822 -1.0129e-307 res:"-1.0129030980689586e-307" (24)
x:803358d16401fea4 -1.07621e-307 res:"-1.0762095416982684e-307" (24)
x:80348e5e7a421e8e -1.14347e-307 res:"-1.1434726380544102e-307" (24)
x:8035d74461e64077 -1.21494e-307 res:"-1.2149396779328108e-307" (24)
x:803734b8a804a47e -1.29087e-307 res:"-1.2908734078036114e-307" (24)
x:8038a8043284eec6 -1.37155e-307 res:"-1.3715529957913372e-307" (24)
x:803a328475ad3db2 -1.45728e-307 res:"-1.4572750580282957e-307" (24)
x:803bd5acbd08118d -1.54835e-307 res:"-1.5483547491550641e-307" (24)
x:803d930788d892a6 -1.64513e-307 res:"-1.6451269209772557e-307" (24)
x:803f6c3801661bd0 -1.74795e-307 res:"-1.747947353538334e-307" (23)
x:8040b17dc0be3ec6 -1.85719e-307 res:"-1.8571940631344798e-307" (24)
x:8041bc959cca22b2 -1.97327e-307 res:"-1.9732686920803846e-307" (24)
x:8042d85ef696c4dd -2.0966e-307 res:"-2.0965979853354086e-307" (24)
x:804405e4e600312b -2.22764e-307 res:"-2.2276353594188717e-307" (24)
x:804546433460343e -2.36686e-307 res:"-2.3668625693825513e-307" (24)
x:80469aa767a63782 -2.51479e-307 res:"-2.5147914799689608e-307" (24)
Loop2: Now denormalize, starting smallest normal.
x:8010000000000000 -2.22507e-308 res:"-2.2250738585072014e-308" (24)
x:800f0f0f0f0f0f0f -2.09419e-308 res:"-2.094187160947954e-308" (23)
x:800e2c4a6886a4c3 -1.971e-308 res:"-1.9709996808921923e-308" (24)
x:800d56dc9e9cd74e -1.85506e-308 res:"-1.8550585231926515e-308" (24)
x:800c8dfcd1848e68 -1.74594e-308 res:"-1.745937433593084e-308" (23)
x:800bd0edf25ea426 -1.64324e-308 res:"-1.6432352316170204e-308" (24)
x:800b1efe114a03e8 -1.54657e-308 res:"-1.546574335639549e-308" (23)
x:800a7785b5eb4ef8 -1.4556e-308 res:"-1.455599374719575e-308" (23)
x:8009d9e741ce6871 -1.36998e-308 res:"-1.369975882089012e-308" (23)
x:8009458e5c0d8f79 -1.28939e-308 res:"-1.2893890654955405e-308" (24)
x:8008b9ef65b268ea -1.21354e-308 res:"-1.2135426498781555e-308" (24)
x:80083686f64d8feb -1.14216e-308 res:"-1.142157788120617e-308" (23)
x:8007bad96048ffec -1.07497e-308 res:"-1.0749720358782275e-308" (24)
x:800746723c80f0de -1.01174e-308 res:"-1.01173838670892e-308" (22)
x:8006d8e3fcb59768 -9.52224e-309 res:"-9.522243639613366e-309" (23)
x:800671c7846eac9e -8.96211e-309 res:"-8.96211166081258e-309" (22)
x:800610bbc7efb186 -8.43493e-309 res:"-8.434928621941253e-309" (23)
x:8005b56570e19806 -7.93876e-309 res:"-7.93875635006236e-309" (22)
x:80055f6e885bda60 -7.47177e-309 res:"-7.47177068241163e-309" (22)
x:80050e8625fc18d3 -7.03225e-309 res:"-7.03225475991683e-309" (22)
x:8004c26023c0175d -6.61859e-309 res:"-6.61859271521584e-309" (22)
x:80047ab4d65a7058 -6.22926e-309 res:"-6.22926373196785e-309" (22)
x:80043740c9be87da -5.86284e-309 res:"-5.8628364536168e-309" (21)
x:8003f7c481a443a0 -5.51796e-309 res:"-5.517963721051105e-309" (23)
x:8003bc043dc7c72d -5.19338e-309 res:"-5.193377619812804e-309" (23)
x:800383c7c1acf7b2 -4.88788e-309 res:"-4.887884818647345e-309" (23)
x:80034eda1fb1da11 -4.60036e-309 res:"-4.600362182256325e-309" (23)
x:80031d09873dfa6a -4.32975e-309 res:"-4.3297526421236e-309" (21)
x:8002ee2715dffabe -4.07506e-309 res:"-4.075061310233974e-309" (23)
x:8002c206ab2d283a -3.83535e-309 res:"-3.83535182139668e-309" (22)
x:8002987ebf398f46 -3.60974e-309 res:"-3.60974289072629e-309" (22)
x:800271683b8177c9 -3.39741e-309 res:"-3.39740507362474e-309" (22)
x:80024c9e561f7fcc -3.19756e-309 res:"-3.197557716352696e-309" (23)
x:800229fe6f2cb484 -3.00947e-309 res:"-3.00946608597901e-309" (22)
x:80020967f02a134f -2.83244e-309 res:"-2.832438669156714e-309" (23)
x:8001eabc2d54c6e1 -2.66582e-309 res:"-2.665824629794555e-309" (23)
x:8001cdde48c842b6 -2.50901e-309 res:"-2.50901141627723e-309" (22)
x:8001b2b31753119c -2.36142e-309 res:"-2.36142250943739e-309" (22)
x:8001992106e4c548 -2.22252e-309 res:"-2.2225153029999e-309" (21)
x:80018110067cf5e9 -2.09178e-309 res:"-2.091779108705786e-309" (23)
x:80016a696f84ab36 -1.96873e-309 res:"-1.96873327878192e-309" (22)
x:80015517f07cdd60 -1.85293e-309 res:"-1.85292543885357e-309" (22)
x:8001410778edfd88 -1.74393e-309 res:"-1.743929824803362e-309" (23)
x:80012e252685a353 -1.64135e-309 res:"-1.64134571746199e-309" (22)
x:80011c5f335099b8 -1.5448e-309 res:"-1.54479596937599e-309" (22)
x:80010ba4e50090ad -1.45393e-309 res:"-1.453925618236227e-309" (23)
x:8000fbe67d2db558 -1.3684e-309 res:"-1.36840058186939e-309" (22)
x:8000ed152a855f62 -1.28791e-309 res:"-1.287906429994723e-309" (23)
x:8000df22fad7e14d -1.21215e-309 res:"-1.212147228230326e-309" (23)
x:8000d202cdf85b94 -1.14084e-309 res:"-1.14084445009913e-309" (22)
x:8000c5a849623813 -1.07374e-309 res:"-1.07373595303448e-309" (22)
x:8000ba07cc98ad3f -1.01058e-309 res:"-1.010575014620685e-309" (23)
x:8000af16663557c3 -9.51129e-310 res:"-9.5112942552535e-310" (21)
x:8000a4c9c99b9de5 -8.95181e-310 res:"-8.95180635788567e-310" (22)
x:80009b1845472b32 -8.42523e-310 res:"-8.42522951330417e-310" (22)
x:800091f8b9ac64e4 -7.92963e-310 res:"-7.92962777722747e-310" (22)
x:8000896290a240d7 -7.46318e-310 res:"-7.4631790844494e-310" (21)
x:8000814db54d6a34 -7.02417e-310 res:"-7.02416855007004e-310" (22)
x:800079b28c8518a9 -6.61098e-310 res:"-6.6109821647718e-310" (21)
x:80007289edaa7190 -6.2221e-310 res:"-6.22210086096167e-310" (22)
x:80006bcd1bebb62d -5.85609e-310 res:"-5.8560949279639e-310" (21)
x:80006575bfece7b2 -5.51162e-310 res:"-5.51161875573075e-310" (22)
x:80005f7de1cfe920 -5.18741e-310 res:"-5.1874058877466e-310" (21)
x:800059dfe396810f -4.88226e-310 res:"-4.88226436493796e-310" (22)
x:800054967bd8f1f0 -4.59507e-310 res:"-4.59507234347103e-310" (22)
x:80004f9cb0cc2f00 -4.32477e-310 res:"-4.32477397032567e-310" (22)
x:80004aedd392ff0f -4.07038e-310 res:"-4.070375501483e-310" (20)
x:800046857bd5a4c3 -3.83094e-310 res:"-3.8309416484546e-310" (21)
x:8000425f839be65d -3.60559e-310 res:"-3.60559213972195e-310" (22)
x:80003e7803658d85 -3.3935e-310 res:"-3.3934984844442e-310" (21)
x:80003acb4e7db25f -3.19388e-310 res:"-3.1938809265357e-310" (21)
x:80003755ef855c96 -3.00601e-310 res:"-3.006005577916e-310" (20)
x:80003414a5323906 -2.82918e-310 res:"-2.82918172039153e-310" (22)
x:800031045f3e53c9 -2.66276e-310 res:"-2.66275926625083e-310" (22)
x:80002e223b85f481 -2.50613e-310 res:"-2.5061263682361e-310" (21)
x:80002b6b8350e61f -2.35871e-310 res:"-2.35870717010455e-310" (22)
x:800028dda8c49c59 -2.21996e-310 res:"-2.21995968951014e-310" (22)
x:80002676447ccf63 -2.08937e-310 res:"-2.0893738254213e-310" (21)
x:8000243313484ab8 -1.96647e-310 res:"-1.9664694827495e-310" (21)
x:80002211f407cdda -1.85079e-310 res:"-1.85079480729363e-310" (22)
x:80002010e5acfdfa -1.74192e-310 res:"-1.74192452451163e-310" (22)
x:80001e2e055785a0 -1.63946e-310 res:"-1.63945837601095e-310" (22)
x:80001c678c8e9be2 -1.54302e-310 res:"-1.5430196480103e-310" (21)
x:80001abbcf95476b -1.45225e-310 res:"-1.45225378636263e-310" (22)
x:800019293bd7cabf -1.36683e-310 res:"-1.3668270930472e-310" (21)
x:800017ae5670bed2 -1.28643e-310 res:"-1.28642549933853e-310" (22)
x:80001649bac4775c -1.21075e-310 res:"-1.21075341114213e-310" (22)
x:800014fa19316148 -1.13953e-310 res:"-1.13953262225144e-310" (22)
x:800013be35d41f53 -1.0725e-310 res:"-1.0725012915308e-310" (21)
x:80001294e75e3b99 -1.00941e-310 res:"-1.00941298026424e-310" (22)
x:8000117d15fe5636 -9.50036e-311 res:"-9.5003574613107e-311" (21)
x:80001075ba58c99c -8.94151e-311 res:"-8.941512904763e-311" (20)
x:80000f7ddc8fcccf -8.41554e-311 res:"-8.415541557424e-311" (20)
x:80000e94935a2a2c -7.92051e-311 res:"-7.9205097011047e-311" (21)
x:80000db90327af38 -7.4546e-311 res:"-7.4545973657453e-311" (21)
x:80000cea5d5286cb -7.01609e-311 res:"-7.0160916383484e-311" (21)
x:80000c27df5cbb19 -6.60338e-311 res:"-6.603380365504e-311" (20)
x:80000b70d2392890 -6.21495e-311 res:"-6.214946226357e-311" (20)
x:80000ac4899f353c -5.84936e-311 res:"-5.849361154218e-311" (20)
x:80000a226368aa93 -5.50528e-311 res:"-5.505281086323e-311" (20)
x:80000989c6f91903 -5.18144e-311 res:"-5.181441022422e-311" (20)
x:800008fa24ae35a8 -4.87665e-311 res:"-4.876650374044e-311" (20)
x:80000872f558aaf8 -4.58979e-311 res:"-4.589788587335e-311" (20)
x:800007f3b9bcdd26 -4.3198e-311 res:"-4.3198010233744e-311" (21)
x:8000077bfa1b2a7e -4.0657e-311 res:"-4.065695080823e-311" (20)
x:8000070b45bf370d -3.82654e-311 res:"-3.8265365466567e-311" (21)
x:800006a13295d976 -3.60145e-311 res:"-3.6014461615595e-311" (21)
x:8000063d5cc94524 -3.3896e-311 res:"-3.38959638735e-311" (19)
x:800005df666313e6 -3.19021e-311 res:"-3.190208364565e-311" (20)
x:80000586f6f3d67e -3.00255e-311 res:"-3.0025490490024e-311" (21)
x:80000533bb3fd8ef -2.82593e-311 res:"-2.825928516708e-311" (20)
x:800004e564f0cc2c -2.6597e-311 res:"-2.65969742749e-311" (19)
x:8000049baa4c0b75 -2.50324e-311 res:"-2.5032446376376e-311" (21)
x:8000045645ed37f6 -2.35599e-311 res:"-2.355994953071e-311" (20)
x:80000414f684e960 -2.21741e-311 res:"-2.217407014655e-311" (20)
x:800003d77e9b3600 -2.08697e-311 res:"-2.0869713079105e-311" (21)
x:8000039da455d878 -1.96421e-311 res:"-1.964208289798e-311" (20)
x:800003673141bcad -1.84867e-311 res:"-1.848666625692e-311" (20)
x:80000333f21fc0a3 -1.73992e-311 res:"-1.739921530063e-311" (20)
x:80000303b6b47912 -1.63757e-311 res:"-1.6375732047654e-311" (21)
x:800002d6519acc4d -1.54125e-311 res:"-1.541245369191e-311" (20)
x:800002ab981938c1 -1.45058e-311 res:"-1.4505838768856e-311" (21)
x:8000028361f99ed4 -1.36526e-311 res:"-1.3652554135395e-311" (21)
x:8000025d8963684f -1.28495e-311 res:"-1.2849462715666e-311" (21)
x:80000239eab7e9b4 -1.20936e-311 res:"-1.2093611967686e-311" (21)
x:800002186470dbf5 -1.13822e-311 res:"-1.138222302841e-311" (20)
x:800001f8d700cf05 -1.07127e-311 res:"-1.071268049733e-311" (20)
x:800001db24b5778c -1.00825e-311 res:"-1.0082522821016e-311" (21)
x:800001bf319bbbcf -9.48943e-312 res:"-9.48943324331e-312" (19)
x:800001a4e3656578 -8.93123e-312 res:"-8.93123128782e-312" (19)
x:8000018c21505f80 -8.40586e-312 res:"-8.40586474148e-312" (19)
x:80000174d40f68f1 -7.9114e-312 res:"-7.91140210963e-312" (19)
x:8000015ee5b42688 -7.44603e-312 res:"-7.44602551494e-312" (19)
x:8000014a419a7e9e -7.00802e-312 res:"-7.008024014063e-312" (20)
x:80000136d4552be0 -6.59579e-312 res:"-6.595787307353e-312" (20)
x:800001248b9b7497 -6.2078e-312 res:"-6.207799818687e-312" (20)
x:800001135637f543 -5.84264e-312 res:"-5.84263512347e-312" (19)
x:8000010323f86e5d -5.49895e-312 res:"-5.498950704443e-312" (20)
x:800000f3e59e85fd -5.17548e-312 res:"-5.175483015945e-312" (20)
x:800000e58cd16f0c -4.87104e-312 res:"-4.871042838535e-312" (20)
x:800000d80c106884 -4.58451e-312 res:"-4.58451090686e-312" (19)
x:800000cb56a60804 -4.31483e-312 res:"-4.31483379469e-312" (19)
x:800000bf609c43c8 -4.06102e-312 res:"-4.061020042064e-312" (20)
x:800000b41eb130bc -3.82214e-312 res:"-3.822136510177e-312" (20)
x:800000a9864c6a1a -3.5973e-312 res:"-3.597304950753e-312" (20)
x:8000009f8d751891 -3.3857e-312 res:"-3.38569877718e-312" (19)
x:800000962ac88f98 -3.18654e-312 res:"-3.186540025583e-312" (20)
x:8000008d55717817 -2.9991e-312 res:"-2.99909649467e-312" (19)
x:80000085051f8016 -2.82268e-312 res:"-2.82267905381e-312" (19)
x:8000007d31ff879c -2.65664e-312 res:"-2.656639109465e-312" (20)
x:80000075d4b44366 -2.50037e-312 res:"-2.500366220674e-312" (20)
x:8000006ee64f4e7e -2.35329e-312 res:"-2.35328585475e-312" (19)
x:80000068604aa43a -2.21486e-312 res:"-2.21485727506e-312" (19)
x:800000623c827c73 -2.08457e-312 res:"-2.084571552997e-312" (20)
x:8000005c752f8430 -1.96195e-312 res:"-1.96194969694e-312" (19)
x:8000005704e16d5a -1.84654e-312 res:"-1.846540891235e-312" (20)
x:80000051e679d055 -1.73792e-312 res:"-1.73792083881e-312" (19)
x:8000004d15275aaa -1.63569e-312 res:"-1.63569020123e-312" (19)
x:800000488c614646 -1.53947e-312 res:"-1.539473130573e-312" (20)
x:8000004447e314f7 -1.44892e-312 res:"-1.4489158876e-312" (18)
x:8000004043a88c34 -1.36369e-312 res:"-1.36368554127e-312" (19)
x:8000003c7be9ed5e -1.28347e-312 res:"-1.283468744726e-312" (20)
x:80000038ed1866ef -1.20797e-312 res:"-1.20797058327e-312" (19)
x:8000003593dabb3b -1.13691e-312 res:"-1.136913490136e-312" (20)
x:800000326d0a19a1 -1.07004e-312 res:"-1.07003622601e-312" (19)
x:8000002f75af272e -1.00709e-312 res:"-1.0070929186e-312" (18)
x:8000002caaff33ef -9.47852e-313 res:"-9.4785215868e-313" (18)
x:8000002a0a599a4a -8.92096e-313 res:"-8.92096149344e-313" (19)
x:80000027914545eb -8.3962e-313 res:"-8.39619905263e-313" (19)
x:800000253d6e5fec -7.9023e-313 res:"-7.9023049907e-313" (18)
x:800000230ca41e0b -7.43746e-313 res:"-7.43746352065e-313" (19)
x:80000020fcd6b2dd -6.99997e-313 res:"-6.9999656665e-313" (18)
x:8000001f0c155d0c -6.5882e-313 res:"-6.5882029802e-313" (18)
x:8000001d388c93cf -6.20066e-313 res:"-6.20066162843e-313" (19)
x:8000001b80844ee1 -5.83592e-313 res:"-5.83591682676e-313" (19)
x:80000019e25e685b -5.49263e-313 res:"-5.49262760164e-313" (19)
x:800000185c9516ec -5.16953e-313 res:"-5.16953186036e-313" (19)
x:80000016edb97efc -4.86544e-313 res:"-4.8654417509e-313" (18)
x:8000001594725966 -4.57924e-313 res:"-4.579239295e-313" (17)
x:800000144f7aae7e -4.30987e-313 res:"-4.30987227763e-313" (19)
x:800000131da0a43a -4.05635e-313 res:"-4.05635037893e-313" (19)
x:80000011fdc45e55 -3.81774e-313 res:"-3.81774153313e-313" (19)
x:80000010eed6ef5f -3.59317e-313 res:"-3.59316850176e-313" (19)
x:8000000fefd959c3 -3.38181e-313 res:"-3.38180564873e-313" (19)
x:8000000effdb9fc7 -3.18288e-313 res:"-3.1828759047e-313" (18)
x:8000000e1dfbe1ac -2.99565e-313 res:"-2.9956479103e-313" (18)
x:8000000d4965891a -2.81943e-313 res:"-2.8194333273e-313" (18)
x:8000000c81508109 -2.65358e-313 res:"-2.65358430805e-313" (19)
x:8000000bc5007972 -2.49749e-313 res:"-2.49749111346e-313" (19)
x:8000000b13c43611 -2.35058e-313 res:"-2.3505798715e-313" (18)
x:8000000a6cf4e798 -2.21231e-313 res:"-2.2123104673e-313" (18)
x:80000009cff58ead -2.08217e-313 res:"-2.08217455746e-313" (19)
x:800000093c32682a -1.95969e-313 res:"-1.95969370113e-313" (19)
x:80000008b1206209 -1.84442e-313 res:"-1.84441760104e-313" (19)
x:800000082e3c9881 -1.73592e-313 res:"-1.73592244804e-313" (19)
x:80000007b30bdad4 -1.63381e-313 res:"-1.63380936287e-313" (19)
x:800000073f1a375e -1.5377e-313 res:"-1.53770292976e-313" (19)
x:80000006d1fa8e77 -1.44725e-313 res:"-1.44724981626e-313" (19)
x:800000066b462bbb -1.36212e-313 res:"-1.3621174741e-313" (18)
x:800000060a9c6565 -1.28199e-313 res:"-1.28199291683e-313" (19)
x:80000005afa24150 -1.20658e-313 res:"-1.2065815688e-313" (18)
x:800000055a021f5a -1.13561e-313 res:"-1.13560618236e-313" (19)
x:80000005096b68cd -1.06881e-313 res:"-1.0688058187e-313" (18)
x:80000004bd924485 -1.00593e-313 res:"-1.0059348882e-313" (18)
x:80000004762f4f8c -9.46762e-314 res:"-9.467622477e-314" (17)
x:8000000432ff59ed -8.9107e-314 res:"-8.9107035076e-314" (18)
x:80000003f3c32776 -8.38654e-314 res:"-8.386544478e-314" (17)
x:80000003b83f3433 -7.89322e-314 res:"-7.8932183323e-314" (18)
x:80000003803b7c6c -7.42891e-314 res:"-7.4289113714e-314" (18)
x:800000034b8347ed -6.99192e-314 res:"-6.991916585e-314" (17)
x:8000000319e4f867 -6.58063e-314 res:"-6.580627374e-314" (17)
x:80000002eb31dabb -6.19353e-314 res:"-6.193531646e-314" (17)
x:80000002bf3dfb0a -5.82921e-314 res:"-5.829206255e-314" (17)
x:8000000295dffb55 -5.48631e-314 res:"-5.4863117695e-314" (18)
x:800000026ef0ec8c -5.16359e-314 res:"-5.1635875477e-314" (18)
x:800000024a4c29ed -4.85985e-314 res:"-4.8598471036e-314" (18)
x:8000000227cf3685 -4.57397e-314 res:"-4.5739737447e-314" (18)
x:8000000207599cb9 -4.30492e-314 res:"-4.3049164654e-314" (18)
x:80000001e8cccfbd -4.05169e-314 res:"-4.051686085e-314" (17)
x:80000001cc0c0ed0 -3.81335e-314 res:"-3.8133516094e-314" (18)
x:80000001b0fc4a2d -3.58904e-314 res:"-3.589036809e-314" (17)
x:8000000197840994 -3.37792e-314 res:"-3.3779169966e-314" (18)
x:800000017f8b544f -3.17922e-314 res:"-3.179215997e-314" (17)
x:8000000168fb9aa5 -2.9922e-314 res:"-2.992203291e-314" (17)
x:8000000153bfa09b -2.81619e-314 res:"-2.816191333e-314" (17)
x:800000013fc369fb -2.65053e-314 res:"-2.650533019e-314" (17)
x:800000012cf42783 -2.49462e-314 res:"-2.494619312e-314" (17)
x:800000011b402530 -2.34788e-314 res:"-2.3478769996e-314" (18)
x:800000010a96b997 -2.20977e-314 res:"-2.209766588e-314" (17)
x:80000000fae83634 -2.07978e-314 res:"-2.0797803183e-314" (18)
x:80000000ec25d8a9 -1.95744e-314 res:"-1.9574402993e-314" (18)
x:80000000de41bcdb -1.8423e-314 res:"-1.842296752e-314" (17)
x:80000000d12ecfdd -1.73393e-314 res:"-1.733926355e-314" (17)
x:80000000c4e0c3a3 -1.63193e-314 res:"-1.631930687e-314" (17)
x:80000000b94c036c -1.53593e-314 res:"-1.535934764e-314" (17)
x:80000000ae65a8de -1.44559e-314 res:"-1.4455856603e-314" (18)
x:80000000a42371c2 -1.36055e-314 res:"-1.36055121e-314" (16)
x:800000009a7bb65c -1.28052e-314 res:"-1.2805187856e-314" (18)
x:8000000091656057 -1.20519e-314 res:"-1.2051941513e-314" (18)
x:8000000088d7e234 -1.1343e-314 res:"-1.134300378e-314" (17)
x:8000000080cb2f40 -1.06758e-314 res:"-1.067576826e-314" (17)
x:800000007937b400 -1.00478e-314 res:"-1.0047781894e-314" (18)
x:8000000072164f0f -9.45674e-315 res:"-9.4567359e-315" (15)
x:800000006b604a68 -8.90046e-315 res:"-8.900457315e-315" (17)
x:80000000650f5517 -8.3769e-315 res:"-8.376901004e-315" (17)
x:800000005f1d7d43 -7.88414e-315 res:"-7.884142123e-315" (17)
x:8000000059852a99 -7.42037e-315 res:"-7.420369054e-315" (17)
x:8000000054411908 -6.98388e-315 res:"-6.983876755e-315" (17)
x:800000004f4c53cb -6.57306e-315 res:"-6.573060474e-315" (17)
x:800000004aa230bf -6.18641e-315 res:"-6.186409857e-315" (17)
x:80000000463e4bff -5.8225e-315 res:"-5.822503395e-315" (17)
x:80000000421c83c3 -5.48e-315 res:"-5.480003196e-315" (17)
x:800000003e38f47b -5.15765e-315 res:"-5.157650065e-315" (17)
x:800000003a8ff528 -4.85426e-315 res:"-4.854258883e-315" (17)
x:80000000371e13e9 -4.56871e-315 res:"-4.56871424e-315" (16)
x:8000000033e012bd -4.29997e-315 res:"-4.299966343e-315" (17)
x:8000000030d2e476 -4.04703e-315 res:"-4.04702715e-315" (16)
x:800000002df3a9d8 -3.80897e-315 res:"-3.808966725e-315" (17)
x:800000002b3faee9 -3.58491e-315 res:"-3.584909857e-315" (17)
x:8000000028b46863 -3.37403e-315 res:"-3.37403281e-315" (16)
x:80000000264f714e -3.17556e-315 res:"-3.17556029e-315" (16)
x:80000000240e88c2 -2.98876e-315 res:"-2.988762625e-315" (17)
x:8000000021ef8fc6 -2.81295e-315 res:"-2.81295306e-315" (16)
x:800000001ff08751 -2.64749e-315 res:"-2.647485234e-315" (17)
x:800000001e0f8e6a -2.49175e-315 res:"-2.491750807e-315" (17)
x:800000001c4ae064 -2.34518e-315 res:"-2.34517723e-315" (16)
x:800000001aa0d331 -2.20723e-315 res:"-2.20722563e-315" (16)
x:80000000190fd5d4 -2.07739e-315 res:"-2.07738883e-315" (16)
x:8000000017966ee6 -1.95519e-315 res:"-1.95518949e-315" (16)
x:8000000016333b33 -1.84018e-315 res:"-1.84017834e-315" (16)
x:8000000014e4ec6c -1.73193e-315 res:"-1.731932556e-315" (17)
x:8000000013aa47ed -1.63005e-315 res:"-1.63005417e-315" (16)
x:8000000012822594 -1.53417e-315 res:"-1.53416863e-315" (16)
x:80000000116b6ea9 -1.44392e-315 res:"-1.443923416e-315" (17)
x:8000000010651cdb -1.35899e-315 res:"-1.358986743e-315" (17)
x:800000000f6e3947 -1.27905e-315 res:"-1.27904635e-315" (16)
x:800000000e85db8e -1.20381e-315 res:"-1.203808327e-315" (17)
x:800000000dab28fe -1.133e-315 res:"-1.13299607e-315" (16)
x:800000000cdd53c2 -1.06635e-315 res:"-1.066349245e-315" (17)
x:800000000c1b9a20 -1.00362e-315 res:"-1.00362282e-315" (16)
x:800000000b6545c4 -9.44586e-316 res:"-9.44586184e-316" (16)
x:800000000ab9ab13 -8.89022e-316 res:"-8.8902229e-316" (15)
x:800000000a18288a -8.36727e-316 res:"-8.3672686e-316" (15)
x:8000000009802628 -7.87508e-316 res:"-7.87507636e-316" (16)
x:8000000008f114da -7.41184e-316 res:"-7.41183656e-316" (16)
x:80000000086a6dfa -6.97585e-316 res:"-6.97584615e-316" (16)
x:8000000007ebb2cd -6.5655e-316 res:"-6.56550225e-316" (16)
x:8000000007746c0c -6.1793e-316 res:"-6.17929623e-316" (16)
x:8000000007042975 -5.81581e-316 res:"-5.81580823e-316" (16)
x:80000000069a815f -5.4737e-316 res:"-5.47370186e-316" (16)
x:8000000006371059 -5.15172e-316 res:"-5.1517194e-316" (15)
x:8000000005d978cc -4.84868e-316 res:"-4.84867705e-316" (16)
x:80000000058162a2 -4.56346e-316 res:"-4.56346076e-316" (16)
x:80000000052e7af3 -4.29502e-316 res:"-4.2950219e-316" (15)
x:8000000004e073b8 -4.04237e-316 res:"-4.04237357e-316" (16)
x:8000000004970380 -3.80459e-316 res:"-3.8045869e-316" (15)
x:800000000451e52d -3.58079e-316 res:"-3.58078766e-316" (16)
x:800000000410d7b2 -3.37015e-316 res:"-3.3701531e-316" (15)
x:8000000003d39dd5 -3.17191e-316 res:"-3.1719088e-316" (15)
x:800000000399fdf6 -2.98533e-316 res:"-2.98532595e-316" (16)
x:800000000363c1d8 -2.80972e-316 res:"-2.8097185e-316" (15)
x:800000000330b671 -2.64444e-316 res:"-2.64444096e-316" (16)
x:800000000300abb6 -2.48889e-316 res:"-2.48888563e-316" (16)
x:8000000002d3746f -2.34248e-316 res:"-2.3424806e-316" (15)
x:8000000002a8e60e -2.20469e-316 res:"-2.2046876e-316" (15)
x:800000000280d886 -2.075e-316 res:"-2.0750001e-316" (15)
x:80000000025b2624 -1.95294e-316 res:"-1.9529413e-316" (15)
x:800000000237ab6d -1.83806e-316 res:"-1.8380624e-316" (15)
x:80000000021646fd -1.72994e-316 res:"-1.72994107e-316" (16)
x:8000000001f6d967 -1.62818e-316 res:"-1.62817985e-316" (16)
x:8000000001d94516 -1.5324e-316 res:"-1.5324046e-316" (15)
x:8000000001bd6e33 -1.44226e-316 res:"-1.44226314e-316" (16)
x:8000000001a33a8a -1.35742e-316 res:"-1.3574241e-316" (15)
x:80000000018a9173 -1.27758e-316 res:"-1.27757565e-316" (16)
x:8000000001735bb8 -1.20242e-316 res:"-1.20242416e-316" (16)
x:80000000015d8380 -1.13169e-316 res:"-1.13169333e-316" (16)
x:800000000148f43c -1.06512e-316 res:"-1.0651231e-316" (15)
x:8000000001359a93 -1.00247e-316 res:"-1.00246883e-316" (16)
x:800000000123644e -9.435e-317 res:"-9.4350007e-317" (15)
x:8000000001124049 -8.88e-317 res:"-8.8800004e-317" (15)
x:8000000001021e63 -8.35765e-317 res:"-8.3576476e-317" (15)
x:8000000000f2ef6c -7.86602e-317 res:"-7.866021e-317" (14)
x:8000000000e4a51a -7.40331e-317 res:"-7.403314e-317" (14)
x:8000000000d731fa -6.96782e-317 res:"-6.9678246e-317" (15)
x:8000000000ca8964 -6.55795e-317 res:"-6.5579527e-317" (15)
x:8000000000be9f6d -6.17219e-317 res:"-6.1721907e-317" (15)
x:8000000000b368df -5.80912e-317 res:"-5.8091206e-317" (15)
x:8000000000a8db2c -5.46741e-317 res:"-5.4674075e-317" (15)
x:80000000009eec66 -5.1458e-317 res:"-5.1457955e-317" (15)
x:8000000000959333 -4.8431e-317 res:"-4.8431017e-317" (15)
x:80000000008cc6c7 -4.55821e-317 res:"-4.5582136e-317" (15)
x:8000000000847ed9 -4.29008e-317 res:"-4.290083e-317" (14)
x:80000000007cb39f -4.03773e-317 res:"-4.0377253e-317" (15)
x:8000000000755dc3 -3.80021e-317 res:"-3.800212e-317" (14)
x:80000000006e765d -3.57667e-317 res:"-3.57667e-317" (13)
x:800000000067f6ee -3.36628e-317 res:"-3.3662777e-317" (15)
x:800000000061d958 -3.16826e-317 res:"-3.168261e-317" (14)
x:80000000005c17da -2.98189e-317 res:"-2.9818927e-317" (15)
x:800000000056ad09 -2.80649e-317 res:"-2.806487e-317" (14)
x:80000000005193cc -2.6414e-317 res:"-2.6413994e-317" (15)
x:80000000004cc757 -2.48602e-317 res:"-2.486023e-317" (14)
x:8000000000484325 -2.33979e-317 res:"-2.3397867e-317" (15)
x:80000000004402f6 -2.20215e-317 res:"-2.2021524e-317" (15)
x:80000000004002c9 -2.07261e-317 res:"-2.072614e-317" (14)
x:80000000003c3edb -1.9507e-317 res:"-1.950695e-317" (14)
x:800000000038b3a1 -1.83595e-317 res:"-1.8359484e-317" (15)
x:8000000000355dc5 -1.72795e-317 res:"-1.7279516e-317" (15)
x:8000000000323a23 -1.62631e-317 res:"-1.6263075e-317" (15)
x:80000000002f45c7 -1.53064e-317 res:"-1.5306425e-317" (15)
x:80000000002c7de8 -1.4406e-317 res:"-1.4406045e-317" (15)
x:800000000029dfe9 -1.35586e-317 res:"-1.355863e-317" (14)
x:8000000000276954 -1.27611e-317 res:"-1.2761063e-317" (15)
x:80000000002517d7 -1.20104e-317 res:"-1.2010415e-317" (15)
x:800000000022e943 -1.13039e-317 res:"-1.130392e-317" (14)
x:800000000020db8a -1.0639e-317 res:"-1.063898e-317" (14)
x:80000000001eecbe -1.00132e-317 res:"-1.001316e-317" (14)
x:80000000001d1b0d -9.42415e-318 res:"-9.42415e-318" (13)
x:80000000001b64c1 -8.86979e-318 res:"-8.86979e-318" (13)
x:800000000019c83d -8.34803e-318 res:"-8.348035e-318" (14)
x:80000000001843fd -7.85697e-318 res:"-7.856973e-318" (14)
x:800000000016d694 -7.3948e-318 res:"-7.3948e-318" (12)
x:8000000000157ea9 -6.95981e-318 res:"-6.95981e-318" (13)
x:8000000000143af9 -6.55041e-318 res:"-6.550406e-318" (14)
x:8000000000130a54 -6.16509e-318 res:"-6.16509e-318" (13)
x:800000000011eb9a -5.80244e-318 res:"-5.802435e-318" (14)
x:800000000010ddbe -5.46112e-318 res:"-5.461115e-318" (14)
x:80000000000fdfc2 -5.13987e-318 res:"-5.139874e-318" (14)
x:80000000000ef0b7 -4.83753e-318 res:"-4.83753e-318" (13)
x:80000000000e0fbb -4.55297e-318 res:"-4.55297e-318" (13)
x:80000000000d3bfb -4.28514e-318 res:"-4.285145e-318" (14)
x:80000000000c74b0 -4.03308e-318 res:"-4.03308e-318" (13)
x:80000000000bb91e -3.79584e-318 res:"-3.795837e-318" (14)
x:80000000000b0895 -3.57255e-318 res:"-3.572554e-318" (14)
x:80000000000a626e -3.3624e-318 res:"-3.362403e-318" (14)
x:800000000009c60d -3.16461e-318 res:"-3.164614e-318" (14)
x:80000000000932df -2.97846e-318 res:"-2.97846e-318" (13)
x:800000000008a859 -2.80325e-318 res:"-2.803254e-318" (14)
x:80000000000825f9 -2.63836e-318 res:"-2.638355e-318" (14)
x:800000000007ab45 -2.48316e-318 res:"-2.48316e-318" (13)
x:80000000000737c8 -2.33709e-318 res:"-2.33709e-318" (13)
x:800000000006cb17 -2.19961e-318 res:"-2.199615e-318" (14)
x:80000000000664ca -2.07022e-318 res:"-2.070224e-318" (14)
x:8000000000060482 -1.94845e-318 res:"-1.948447e-318" (14)
x:800000000005a9e4 -1.83383e-318 res:"-1.833833e-318" (14)
x:800000000005549a -1.72596e-318 res:"-1.72596e-318" (13)
x:8000000000050455 -1.62443e-318 res:"-1.624433e-318" (14)
x:800000000004b8c8 -1.52888e-318 res:"-1.528876e-318" (14)
x:80000000000471ad -1.43894e-318 res:"-1.43894e-318" (13)
x:8000000000042ec1 -1.3543e-318 res:"-1.3543e-318" (12)
x:800000000003efc5 -1.27464e-318 res:"-1.274635e-318" (14)
x:800000000003b47d -1.19966e-318 res:"-1.199656e-318" (14)
x:8000000000037cb2 -1.12909e-318 res:"-1.12909e-318" (13)
x:800000000003482f -1.06267e-318 res:"-1.06267e-318" (13)
x:80000000000316c3 -1.00016e-318 res:"-1.00016e-318" (13)
x:800000000002e83f -9.41328e-319 res:"-9.4133e-319" (12)
x:800000000002bc78 -8.85959e-319 res:"-8.8596e-319" (12)
x:8000000000029344 -8.33844e-319 res:"-8.33844e-319" (13)
x:8000000000026c7c -7.84794e-319 res:"-7.84794e-319" (13)
x:80000000000247fc -7.38628e-319 res:"-7.3863e-319" (12)
x:80000000000225a2 -6.9518e-319 res:"-6.9518e-319" (12)
x:800000000002054d -6.54286e-319 res:"-6.54286e-319" (13)
x:800000000001e6df -6.15798e-319 res:"-6.158e-319" (11)
x:800000000001ca3b -5.79574e-319 res:"-5.79574e-319" (13)
x:800000000001af47 -5.45483e-319 res:"-5.45483e-319" (13)
x:80000000000195e8 -5.13393e-319 res:"-5.13393e-319" (13)
x:8000000000017e08 -4.83196e-319 res:"-4.83196e-319" (13)
x:800000000001678f -4.54773e-319 res:"-4.54773e-319" (13)
x:8000000000015268 -4.28019e-319 res:"-4.2802e-319" (12)
x:8000000000013e80 -4.02841e-319 res:"-4.0284e-319" (12)
x:8000000000012bc4 -3.79146e-319 res:"-3.79146e-319" (13)
x:8000000000011a22 -3.56844e-319 res:"-3.56844e-319" (13)
x:8000000000010989 -3.35851e-319 res:"-3.3585e-319" (12)
x:800000000000f9ea -3.16093e-319 res:"-3.16093e-319" (13)
x:800000000000eb37 -2.97502e-319 res:"-2.975e-319" (11)
x:800000000000dd61 -2.80002e-319 res:"-2.8e-319" (9)
x:800000000000d05b -2.6353e-319 res:"-2.6353e-319" (12)
x:800000000000c419 -2.48026e-319 res:"-2.48026e-319" (13)
x:800000000000b890 -2.33436e-319 res:"-2.33436e-319" (13)
x:800000000000adb5 -2.19706e-319 res:"-2.19706e-319" (13)
x:800000000000a37d -2.06781e-319 res:"-2.0678e-319" (12)
x:80000000000099df -1.94617e-319 res:"-1.94617e-319" (13)
x:80000000000090d2 -1.8317e-319 res:"-1.8317e-319" (12)
x:800000000000884d -1.72394e-319 res:"-1.72394e-319" (13)
x:8000000000008048 -1.62251e-319 res:"-1.6225e-319" (12)
x:80000000000078bc -1.52706e-319 res:"-1.52706e-319" (13)
x:80000000000071a2 -1.43724e-319 res:"-1.43724e-319" (13)
x:8000000000006af3 -1.3527e-319 res:"-1.3527e-319" (12)
x:80000000000064a8 -1.27311e-319 res:"-1.2731e-319" (12)
x:8000000000005ebc -1.19821e-319 res:"-1.1982e-319" (12)
x:8000000000005929 -1.1277e-319 res:"-1.1277e-319" (12)
x:80000000000053ea -1.06135e-319 res:"-1.06135e-319" (13)
x:8000000000004efa -9.98902e-320 res:"-9.989e-320" (11)
x:8000000000004a55 -9.40158e-320 res:"-9.4016e-320" (12)
x:80000000000045f6 -8.84872e-320 res:"-8.8487e-320" (12)
x:80000000000041d8 -8.32797e-320 res:"-8.328e-320" (11)
x:8000000000003df8 -7.83786e-320 res:"-7.838e-320" (11)
x:8000000000003a53 -7.37689e-320 res:"-7.377e-320" (11)
x:80000000000036e5 -6.9431e-320 res:"-6.943e-320" (11)
x:80000000000033aa -6.53451e-320 res:"-6.5345e-320" (12)
x:80000000000030a0 -6.15013e-320 res:"-6.15e-320" (10)
x:8000000000002dc4 -5.78847e-320 res:"-5.7885e-320" (12)
x:8000000000002b13 -5.44806e-320 res:"-5.448e-320" (11)
x:800000000000288a -5.12741e-320 res:"-5.1274e-320" (12)
x:8000000000002628 -4.82603e-320 res:"-4.826e-320" (11)
x:80000000000023e9 -4.54195e-320 res:"-4.542e-320" (11)
x:80000000000021cc -4.27466e-320 res:"-4.2747e-320" (12)
x:8000000000001fcf -4.02318e-320 res:"-4.023e-320" (11)
x:8000000000001df0 -3.78652e-320 res:"-3.7865e-320" (12)
x:8000000000001c2d -3.5637e-320 res:"-3.5637e-320" (12)
x:8000000000001a85 -3.35421e-320 res:"-3.354e-320" (11)
x:80000000000018f6 -3.15708e-320 res:"-3.157e-320" (11)
x:800000000000177e -2.97131e-320 res:"-2.9713e-320" (12)
x:800000000000161c -2.79641e-320 res:"-2.7964e-320" (12)
x:80000000000014cf -2.63189e-320 res:"-2.632e-320" (11)
x:8000000000001396 -2.47725e-320 res:"-2.477e-320" (11)
x:800000000000126f -2.3315e-320 res:"-2.3315e-320" (12)
x:8000000000001159 -2.19415e-320 res:"-2.194e-320" (11)
x:8000000000001054 -2.06519e-320 res:"-2.065e-320" (11)
x:8000000000000f5e -1.94365e-320 res:"-1.9437e-320" (12)
x:8000000000000e77 -1.82953e-320 res:"-1.8295e-320" (12)
x:8000000000000d9d -1.72182e-320 res:"-1.722e-320" (11)
x:8000000000000cd0 -1.62054e-320 res:"-1.6205e-320" (12)
x:8000000000000c0f -1.52518e-320 res:"-1.525e-320" (11)
x:8000000000000b59 -1.43526e-320 res:"-1.4353e-320" (12)
x:8000000000000aae -1.35078e-320 res:"-1.351e-320" (11)
x:8000000000000a0d -1.27123e-320 res:"-1.271e-320" (11)
x:8000000000000976 -1.19663e-320 res:"-1.1966e-320" (12)
x:80000000000008e8 -1.12647e-320 res:"-1.1265e-320" (12)
x:8000000000000862 -1.06026e-320 res:"-1.0603e-320" (12)
x:80000000000007e4 -9.98013e-321 res:"-9.98e-321" (10)
x:800000000000076d -9.39219e-321 res:"-9.39e-321" (10)
x:80000000000006fd -8.83883e-321 res:"-8.84e-321" (10)
x:8000000000000694 -8.32007e-321 res:"-8.32e-321" (10)
x:8000000000000631 -7.83094e-321 res:"-7.83e-321" (10)
x:80000000000005d4 -7.37146e-321 res:"-7.37e-321" (10)
x:800000000000057c -6.93668e-321 res:"-6.937e-321" (11)
x:8000000000000529 -6.52661e-321 res:"-6.527e-321" (11)
x:80000000000004db -6.14124e-321 res:"-6.14e-321" (10)
x:8000000000000492 -5.78057e-321 res:"-5.78e-321" (10)
x:800000000000044d -5.43966e-321 res:"-5.44e-321" (10)
x:800000000000040c -5.11852e-321 res:"-5.12e-321" (10)
x:80000000000003cf -4.81714e-321 res:"-4.817e-321" (11)
x:8000000000000396 -4.53552e-321 res:"-4.536e-321" (11)
x:8000000000000360 -4.26873e-321 res:"-4.27e-321" (10)
x:800000000000032d -4.01675e-321 res:"-4.017e-321" (11)
x:80000000000002fd -3.7796e-321 res:"-3.78e-321" (10)
x:80000000000002d0 -3.55727e-321 res:"-3.557e-321" (11)
x:80000000000002a6 -3.34977e-321 res:"-3.35e-321" (10)
x:800000000000027e -3.15214e-321 res:"-3.15e-321" (10)
x:8000000000000258 -2.96439e-321 res:"-2.964e-321" (11)
x:8000000000000235 -2.79147e-321 res:"-2.79e-321" (10)
x:8000000000000214 -2.62843e-321 res:"-2.63e-321" (10)
x:80000000000001f5 -2.47527e-321 res:"-2.475e-321" (11)
x:80000000000001d8 -2.33199e-321 res:"-2.33e-321" (10)
x:80000000000001bc -2.19365e-321 res:"-2.194e-321" (11)
x:80000000000001a2 -2.06519e-321 res:"-2.065e-321" (11)
x:8000000000000189 -1.94168e-321 res:"-1.94e-321" (10)
x:8000000000000172 -1.82804e-321 res:"-1.83e-321" (10)
x:800000000000015c -1.71935e-321 res:"-1.72e-321" (10)
x:8000000000000148 -1.62054e-321 res:"-1.62e-321" (10)
x:8000000000000135 -1.52666e-321 res:"-1.527e-321" (11)
x:8000000000000123 -1.43773e-321 res:"-1.44e-321" (10)
x:8000000000000112 -1.35374e-321 res:"-1.354e-321" (11)
x:8000000000000102 -1.27469e-321 res:"-1.275e-321" (11)
x:80000000000000f3 -1.20058e-321 res:"-1.2e-321" (9)
x:80000000000000e5 -1.13141e-321 res:"-1.13e-321" (10)
x:80000000000000d8 -1.06718e-321 res:"-1.067e-321" (11)
x:80000000000000cb -1.00295e-321 res:"-1.003e-321" (11)
x:80000000000000bf -9.43665e-322 res:"-9.44e-322" (10)
x:80000000000000b4 -8.89318e-322 res:"-8.9e-322" (9)
x:80000000000000a9 -8.34971e-322 res:"-8.35e-322" (10)
x:800000000000009f -7.85564e-322 res:"-7.86e-322" (10)
x:8000000000000096 -7.41098e-322 res:"-7.4e-322" (9)
x:800000000000008d -6.96633e-322 res:"-6.97e-322" (10)
x:8000000000000085 -6.57107e-322 res:"-6.57e-322" (10)
x:800000000000007d -6.17582e-322 res:"-6.2e-322" (9)
x:8000000000000076 -5.82997e-322 res:"-5.83e-322" (10)
x:800000000000006f -5.48413e-322 res:"-5.5e-322" (9)
x:8000000000000068 -5.13828e-322 res:"-5.14e-322" (10)
x:8000000000000062 -4.84184e-322 res:"-4.84e-322" (10)
x:800000000000005c -4.5454e-322 res:"-4.55e-322" (10)
x:8000000000000057 -4.29837e-322 res:"-4.3e-322" (9)
x:8000000000000052 -4.05134e-322 res:"-4.05e-322" (10)
x:800000000000004d -3.80431e-322 res:"-3.8e-322" (9)
x:8000000000000048 -3.55727e-322 res:"-3.56e-322" (10)
x:8000000000000044 -3.35965e-322 res:"-3.36e-322" (10)
x:8000000000000040 -3.16202e-322 res:"-3.16e-322" (10)
x:800000000000003c -2.96439e-322 res:"-2.96e-322" (10)
x:8000000000000038 -2.76677e-322 res:"-2.77e-322" (10)
x:8000000000000035 -2.61855e-322 res:"-2.6e-322" (9)
x:8000000000000032 -2.47033e-322 res:"-2.47e-322" (10)
x:800000000000002f -2.32211e-322 res:"-2.3e-322" (9)
x:800000000000002c -2.17389e-322 res:"-2.17e-322" (10)
x:8000000000000029 -2.02567e-322 res:"-2.03e-322" (10)
x:8000000000000027 -1.92686e-322 res:"-1.93e-322" (10)
x:8000000000000025 -1.82804e-322 res:"-1.83e-322" (10)
x:8000000000000023 -1.72923e-322 res:"-1.73e-322" (10)
x:8000000000000021 -1.63042e-322 res:"-1.63e-322" (10)
x:800000000000001f -1.5316e-322 res:"-1.53e-322" (10)
x:800000000000001d -1.43279e-322 res:"-1.43e-322" (10)
x:800000000000001b -1.33398e-322 res:"-1.33e-322" (10)
x:8000000000000019 -1.23516e-322 res:"-1.24e-322" (10)
x:8000000000000018 -1.18576e-322 res:"-1.2e-322" (9)
x:8000000000000017 -1.13635e-322 res:"-1.14e-322" (10)
x:8000000000000016 -1.08694e-322 res:"-1.1e-322" (9)
x:8000000000000015 -1.03754e-322 res:"-1.04e-322" (10)
x:8000000000000014 -9.88131e-323 res:"-1e-322" (7)
x:8000000000000013 -9.38725e-323 res:"-9.4e-323" (9)
x:8000000000000012 -8.89318e-323 res:"-9e-323" (7)
x:8000000000000011 -8.39912e-323 res:"-8.4e-323" (9)
x:8000000000000010 -7.90505e-323 res:"-8e-323" (7)
x:800000000000000f -7.41098e-323 res:"-7.4e-323" (9)
x:800000000000000e -6.91692e-323 res:"-7e-323" (7)
x:800000000000000d -6.42285e-323 res:"-6.4e-323" (9)
x:800000000000000c -5.92879e-323 res:"-6e-323" (7)
x:800000000000000b -5.43472e-323 res:"-5.4e-323" (9)
x:800000000000000a -4.94066e-323 res:"-5e-323" (7)
x:8000000000000009 -4.44659e-323 res:"-4.4e-323" (9)
x:8000000000000008 -3.95253e-323 res:"-4e-323" (7)
x:8000000000000007 -3.45846e-323 res:"-3.5e-323" (9)
x:8000000000000006 -2.96439e-323 res:"-3e-323" (7)
x:8000000000000005 -2.47033e-323 res:"-2.5e-323" (9)
x:8000000000000004 -1.97626e-323 res:"-2e-323" (7)
x:8000000000000003 -1.4822e-323 res:"-1.5e-323" (9)
x:8000000000000002 -9.88131e-324 res:"-1e-323" (7)
x:8000000000000001 -4.94066e-324 res:"-5e-324" (7)
Loop3: Now down from largest positive exponent.
x:ffefffffffffffff -1.79769e+308 res:"-1.7976931348623157e+308" (24)
x:ffee1e1e1e1e1e1d -1.69195e+308 res:"-1.6919464798704147e+308" (24)
x:ffec5894d10d4985 -1.59242e+308 res:"-1.5924202163486257e+308" (24)
x:ffeaadb93d39ae9b -1.49875e+308 res:"-1.4987484389163535e+308" (24)
x:ffe91bf9a3091cce -1.41059e+308 res:"-1.410586766038921e+308" (23)
x:ffe7a1dbe4bd4849 -1.32761e+308 res:"-1.3276110739189844e+308" (24)
x:ffe63dfc229407cc -1.24952e+308 res:"-1.2495163048649264e+308" (24)
x:ffe4ef0b6bd69ded -1.17602e+308 res:"-1.1760153457552248e+308" (24)
x:ffe3b3ce839cd0df -1.10684e+308 res:"-1.1068379724755057e+308" (24)
x:ffe28b1cb81b1ef0 -1.04173e+308 res:"-1.0417298564475348e+308" (24)
x:ffe173decb64d1d3 -9.80452e+307 res:"-9.804516295976798e+307" (23)
x:ffe06d0dec9b1fd6 -9.22778e+307 res:"-9.227780043272281e+307" (23)
x:ffdeeb658123ffb1 -8.68497e+307 res:"-8.684969452491559e+307" (23)
x:ffdd19c8f203c379 -8.17409e+307 res:"-8.174088896462643e+307" (23)
x:ffdb638ff2d65d9f -7.69326e+307 res:"-7.693260137847194e+307" (23)
x:ffd9c71e11bab278 -7.24072e+307 res:"-7.240715423856183e+307" (23)
x:ffd842ef1fbec617 -6.81479e+307 res:"-6.814790987158761e+307" (23)
x:ffd6d595c3866016 -6.41392e+307 res:"-6.413920929090599e+307" (23)
x:ffd57dba216f697e -6.03663e+307 res:"-6.036631462673504e+307" (23)
x:ffd43a1897f06349 -5.68154e+307 res:"-5.681535494280945e+307" (23)
x:ffd309808f005d72 -5.34733e+307 res:"-5.347327524029125e+307" (23)
x:ffd1ead35969c15c -5.03278e+307 res:"-5.032778846145058e+307" (23)
x:ffd0dd0326fa1f66 -4.73673e+307 res:"-4.736733031665938e+307" (23)
x:ffcfbe240d221cfc -4.4581e+307 res:"-4.458101676862059e+307" (23)
x:ffcde021ee3e3966 -4.19586e+307 res:"-4.195860401752526e+307" (23)
x:ffcc1e3e0d67bd8d -3.94905e+307 res:"-3.9490450840023775e+307" (24)
x:ffca76d0fd8ed085 -3.71675e+307 res:"-3.716748314355179e+307" (23)
x:ffc8e84c39efd350 -3.49812e+307 res:"-3.49811606056958e+307" (22)
x:ffc77138aeffd5f1 -3.29234e+307 res:"-3.292344527594899e+307" (23)
x:ffc61035596941d4 -3.09868e+307 res:"-3.098677202442258e+307" (23)
x:ffc4c3f5f9cc7a31 -2.9164e+307 res:"-2.916402072886831e+307" (23)
x:ffc38b41dc0bbe4c -2.74485e+307 res:"-2.744849009775841e+307" (23)
x:ffc264f2b0fbfe66 -2.58339e+307 res:"-2.5833873033184387e+307" (24)
x:ffc14ff37965a424 -2.43142e+307 res:"-2.431423344299707e+307" (23)
x:ffc04b3f81509a7c -2.2884e+307 res:"-2.288398441693842e+307" (23)
x:ffbeabc2d54c6e17 -2.15379e+307 res:"-2.1537867686530278e+307" (24)
x:ffbcdde48c842b61 -2.02709e+307 res:"-2.0270934293204967e+307" (24)
x:ffbb2b31753119c5 -1.90785e+307 res:"-1.9078526393604676e+307" (24)
x:ffb992106e4c547d -1.79563e+307 res:"-1.7956260135157342e+307" (24)
x:ffb8110067cf5e94 -1.69e+307 res:"-1.6900009538971616e+307" (24)
x:ffb6a696f84ab35e -1.59059e+307 res:"-1.5905891330796815e+307" (24)

And with the from_dumb_stringstream function, results differ. Only the last of the 2nd loop:

x:800000000000001b -1.33398e-322 res:"-1.3339772437713657e-322" (24)
x:8000000000000019 -1.23516e-322 res:"-1.2351641146031164e-322" (24)
x:8000000000000018 -1.18576e-322 res:"-1.1857575500189917e-322" (24)
x:8000000000000017 -1.13635e-322 res:"-1.1363509854348671e-322" (24)
x:8000000000000016 -1.08694e-322 res:"-1.0869444208507424e-322" (24)
x:8000000000000015 -1.03754e-322 res:"-1.0375378562666177e-322" (24)
x:8000000000000014 -9.88131e-323 res:"-9.8813129168249309e-323" (24)
x:8000000000000013 -9.38725e-323 res:"-9.3872472709836843e-323" (24)
x:8000000000000012 -8.89318e-323 res:"-8.8931816251424378e-323" (24)
x:8000000000000011 -8.39912e-323 res:"-8.3991159793011913e-323" (24)
x:8000000000000010 -7.90505e-323 res:"-7.9050503334599447e-323" (24)
x:800000000000000f -7.41098e-323 res:"-7.4109846876186982e-323" (24)
x:800000000000000e -6.91692e-323 res:"-6.9169190417774516e-323" (24)
x:800000000000000d -6.42285e-323 res:"-6.4228533959362051e-323" (24)
x:800000000000000c -5.92879e-323 res:"-5.9287877500949585e-323" (24)
x:800000000000000b -5.43472e-323 res:"-5.434722104253712e-323" (23)
x:800000000000000a -4.94066e-323 res:"-4.9406564584124654e-323" (24)
x:8000000000000009 -4.44659e-323 res:"-4.4465908125712189e-323" (24)
x:8000000000000008 -3.95253e-323 res:"-3.9525251667299724e-323" (24)
x:8000000000000007 -3.45846e-323 res:"-3.4584595208887258e-323" (24)
x:8000000000000006 -2.96439e-323 res:"-2.9643938750474793e-323" (24)
x:8000000000000005 -2.47033e-323 res:"-2.4703282292062327e-323" (24)
x:8000000000000004 -1.97626e-323 res:"-1.9762625833649862e-323" (24)
x:8000000000000003 -1.4822e-323 res:"-1.4821969375237396e-323" (24)
x:8000000000000002 -9.88131e-324 res:"-9.8813129168249309e-324" (24)
x:8000000000000001 -4.94066e-324 res:"-4.9406564584124654e-324" (24)

This demonstrates that different implementations may in fact use up the largest buffer size.

For comparison, here are the size values for double:

std::numeric_limits<T>::digits10 15
std::numeric_limits<T>::min() 2.22507e-308
std::numeric_limits<T>::max() 1.79769e+308
std::numeric_limits<T>::max_digits10 17
std::numeric_limits<T>::max_exponent10 308

You can see that the denormalizing mantissa really does generate more negative exponent than max_exponent10--your point is basically correct but taken in the negative exponent direction. I have a tested buffer size version below that fixes this issue.

GordonLElliott commented 4 years ago

OK, this version takes into acount all what is learned. I doubt that anywhere on the Internet is as well researched evaluation of the buffer size required. Note simpler because the first exponent maximum (emax) is already adjusted for exponent increase due to the denormalization. (This accounts for any "rollover" of exponent like -99 to -100.) Then just count digits. Works for float and double when dropped ito the library. Still produces 16 and 25 for IEEE float and double, respectively.

(EDIT: That was silly, I don't know why I did a complicated way to find mantissa digits, that is already known. This is improved now and simpler yet. See version in a couple of posts below, exactly same but should work on compilers that have problems.)

template<typename T>
static constexpr std::size_t size_buffer(T const &) noexcept
{
    /* First compute the size of the exponent including 'e' and sign */
    constexpr int emax = /*(Properly typed) maximum exponent with denormalization.*/
        std::numeric_limits<T>::max_exponent10 +
        /* If the type denormalizes, add digits from mantissa.*/
        ((std::numeric_limits<T>::has_denorm==std::denorm_absent)?0:
        std::numeric_limits<T>::max_digits10)
        ;
    constexpr std::size_t en =
        1 +                     /* for 'e' */
        1 +                     /* for exponent sign */
        (emax >= 100000 ? 6 :   /* This is getting out of hand... stop! */
        emax >= 10000 ? 5 :
        emax >= 1000 ? 4 :
        emax >= 100 ? 3 :
        emax >= 10 ? 2 :
        1)                      /* digits in the exponent */
        ;
    /** Includes a sign if needed;the full number of base-10 digits which may be
     needed; a decimal point if needed; the number of characters in the exponent
     and the terminating zero.
     */
    return 1 + std::numeric_limits<T>::max_digits10 + 1 + en + 1;
}

PS: @jtv your original algorithm with mantissa bits added is proving to be correct -- just the direction is toward the negative exponent, and here the math made more precise.

GordonLElliott commented 4 years ago

There is a working assumption in the above:

The compiler gives the correct largest number of digits in the std::numeric_limits<T>::max_exponent10, whether it was a positive or negative exponent, but for normal (not denormalized) numbers. Note that IEEE floating (all sizes) are symetrical on the maximum positive and maximum negative (but not denormalized) exponent. In other words without denormalizing, the IEEE floating points are both + or - same maximum exponent.

Now printouts above demonstrate that for IEEE float and double denormalized negative exponent goes beyond the std::numeric_limits<T>::max_exponent10.

I think that everything that is needed is available:

  1. Working and accurate size_buffer.
  2. Looping structure for test that guarantees to hit the worst cases.
  3. Tested to verify that old size_buffer code fails, and new code succeeds with worst cases.
  4. Demonstrations so can understand the worst cases and observe behavior.

Now if can only figure out why on some compilers (VS2017,VS2019) does not enable the more efficient functions, this issue can be finished soon.

jtv commented 4 years ago

@GordonLElliott thanks for looking into it. I'm very busy at the moment, various crises plus work going on, so it'll be a few days before I can catch up on the more than 20 pages of text that you added. Please try not to add too much or I'll be behind forever!

GordonLElliott commented 4 years ago

@jtv , I'm through except for this update below. Bullets were given last post above, the rest is details. Except fix for less capable compilers....

Oh, the horror of it all! Just in case, here is the same size_buffer, but fixed so it actually compiles in VS 2015 which has more restricted vocabulary. Then set back to C++14 and still compiles. Other compilers may have these problems as well so this is the same calculation but less readable:

/* First emax macro gives size of the maximum exponent */
#define emax ( \
std::numeric_limits<T>::max_exponent10 + \
((std::numeric_limits<T>::has_denorm == std::denorm_absent) ? 0 : \
    std::numeric_limits<T>::max_digits10) \
    )

template<typename T>
static constexpr std::size_t size_buffer(T const &) noexcept
{
    /** Includes a sign if needed;the full number of base-10 digits which may be
    needed; a decimal point if needed; the terminating zero; followed by
    the number of characters in the exponent
    */
    return 1 + std::numeric_limits<T>::max_digits10 + 1 + 1 +
        /* characters in the exponent: */
        1 +                     /* for 'e' */
        1 +                     /* for exponent sign */
        (emax >= 100000 ? 6 :   /* This is getting out of hand... stop! */
            emax >= 10000 ? 5 :
            emax >= 1000 ? 4 :
            emax >= 100 ? 3 :
            emax >= 10 ? 2 :
            1)                      /* digits in the exponent */
        ;
}

float aa_x_float;
char aa_float[size_buffer(aa_x_float)]; // Size 16
double aa_x_double;
char aa_double[size_buffer(aa_x_double)]; // Size 25
jtv commented 4 years ago

@GordonLElliott just read through it all, though there were plenty of bits I didn't understand, just based on linguistic ambiguities and such. I'm impressed with the level of detail you went to.

One thing I'm wondering: are you aware of std::numeric_limits<T>::denorm_min()? It may fill in some of the gaps.

I have no idea what specialised floating-point types might be out there: decimal FP, FP geared towards very big or very small numbers, Intel/Motorola-style 80-it FP... So I don't want to assume that I know exactly how exponents "work," in any given FP type. But yeah, we need it constexpr...

GordonLElliott commented 4 years ago

That's interesting. I get double:

x:8000000000000005   -2.47e-323 res:"-2.4703282292062327e-323" (24)
x:8000000000000004  -1.976e-323 res:"-1.9762625833649862e-323" (24)
x:8000000000000003  -1.482e-323 res:"-1.4821969375237396e-323" (24)
x:8000000000000002  -9.881e-324 res:"-9.8813129168249309e-324" (24)
x:8000000000000001  -4.941e-324 res:"-4.9406564584124654e-324" (24)

scanning down in the 2nd loop, and indeed find

std::numeric_limits<T>::denorm_min() 4.94066e-324

at the end. This is the "dumb" version, the "good" version shortened the mantissa output for the same number. But the loop is exactly same binary values.

Unfortunately knowing the binary floating value with the minimum exponent does not tell me that exponent itself without running through some decimal conversion process. (And need to knokw the size in order to use our particular conversion--so chicken and egg problem.) Does verify that I scan down to the right value.

Likewise float, last step in 2nd loop:

x:80000001   -1.401e-45 res:"-1.40129846e-45" (15)
std::numeric_limits<T>::denorm_min() 1.4013e-45

So it turns out that all three loops are required under different circumstances to guarantee one hits the longest strings. Various cases:

  1. When a floating type was asymetric rather than symetric + vs - exponent, longest might be a negative exponent. (First loop runs through the longest of those).
  2. When (like our "good" printing algorithm is used) it produces short mantissa display on denormalized, then the slightly longer exponents go wtih shorter mantissa and don't reach max. But then it might. (2nd loop spans all the denormalized values.) By the way, loop 2 takes a few steps but guarantees to find denorm_min(), as well as a series of values near that min so we will find the longest strings in that region.
  3. When asymetric, but positive is largest, then may hit longest with the most positive exponents. (3rd loop).

The way my looping works is that we don't know if our starting point will convert as a long mantissa. But we very quickly pass over longest mantissa display in each case, so we just loop over the three cases where longest cases may be found and we will hit that in at least one of them.

My constexpr in comment above makes only assumption that the constants are given correctly, then finds the worst possible size out of all three loops. For all the IEEE floats it will be exactly correct. For others if they gave the constants correctly it will still work, and at most overestimate by one byte.

The value "emax" is the maximum estimated (absolute) exponent, which goes up more with denormalized. (This was your original formula.) So emax overestimates the largest exponent number, by 1 in double and by 2 in floating. But 325 has as many digits as 324 (actual max absolute in double), and 47 has as many digits as 45 (actual max absolute in float). So in both cases the constexpr function gives exact value. Only if it hits a rollover case like a system with a max exponent was actually 999 but the slight overestimate was 1001 would it then have an extra character in the buffer that was not needed. All the IEEE exponents are in the middle of the decimal range so no rollover is possible.

But if the maximum normalized (absolute) exponent has (in some system) an exponent like 998, but the denormalized then ran that up to to something like 1013, then the emax macro accounts for the rollover correctly in the denormalized case and adds a buffer characer.

GordonLElliott commented 4 years ago

... So I don't want to assume that I know exactly how exponents "work," in any given FP type. But yeah, we need it constexpr...

One point is that we don't care how the floating works so much as the how the printing of the floating value works. Thus we are dependent upon the system author giving us the correct constants -- however that floating point hardware/software system does its job. If the maximum exponent has 4 characters, we don't care how we get there we allocate 4 characters for it, and do so because the constants told us that the maximum exponent could be over 1000, for example. Denormalized makes for a slightly more complex problem, and is observed to go outside of the limits given by the maximum exponent constant. But in most cases it can't possibly cause a rollover and in the cases it does we are only finding the number of characters it takes to format that value in decimal format, without any care for how it is represented in binary.

One of the odd consequences is that the denorm_min() gives a value in binary in that very technical floating point format. (It returns a floating value in the machine's representation for that type.) So to analyze it we need to know how it works. But the max_exponent10 and max_digits10 are just integer (or size_t) numbers that describe the maximum exponent as an integer, and the digits in the fixed point portion of the exponential notation. (Here I won't call that fixed point portion the "mantissa" because that is really used for the binary representation in most discussions.) So the constants we are working with are descriptions of how many characters will be formatted, regardless of the internal representation--and we do have to rely on the constants correctly representing that formatting.

And we do know how the formatting of the floating value works. Leading sign. A fixed point representation with a specified number of characters maximum--and we must know that correctly independent of the internal representation of the binary number. Then the decimal point itself. Then the exponent marker 'e'. Then the exponent sign. Then the digits of the exponent--the other number we need to know, how many digits that will be. Otherwise the issue is not about how the internal floating point is represented, but whether the formatting algorithm uses something outside of the normal C++17 rules, like adding spaces before the exponent or something unexpected. That has absolutely nothing to do with the internal representation or how that works.

The only point at which we might have a lack of understanding is how far the exponent (absolute value of the exponent that is) might go up with denormalized representation. (This is the only case observed to go outside of any of the specified limits.) There we are talking only about whether the maximum exponent might take one more character.