I recently fixed a problem with kForth-Win32's conversion of decimal
strings to IEEE double precision floats e.g., with rounding mode set to
round nearest (with ties to eve), the string
"1.000 000 000 000 000 111 022 302 462 515 654 042 363 166 809 082 031
251 e0" (spaces added for clarity)
converted to the IEEE 64-bit binary pattern (shown in hex, high-dword
low- dword)
3ff00000 00000000
representing the exact number 1.000 ...
instead of converting to the nearest representable IEEE 754 double
precision number,
3ff00000 00000001
which has the value
1.000 000 000 000 000 222 044 604 925 031 308 084 726 333 618 164 062 500
Thus, the following Forth code should behave as follows:
17 set-precision
ok
1.000000000000000111022302462515654042363166809082031251e0 fs. 1.0000000000000002e+00 ok
instead of printing 1.000000000000000e+00
Note that this is not an output conversion problem with the word "FS."
but an interpreter input conversion problem for the entered floating
point value.
Using double number arithmetic on a 64-bit Forth system, you may easily verify that the correct round to nearest representable floating point
value is the one represented by the binary pattern 3ff00000 00000001 ,
rather than to the exactly representable value of 1.000.... (pattern
3ff00000 00000000):
--
Krishna Myneni
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:...
Using double number arithmetic on a 64-bit Forth system, you may easily
verify that the correct round to nearest representable floating point
value is the one represented by the binary pattern 3ff00000 00000001 ,
rather than to the exactly representable value of 1.000.... (pattern
3ff00000 00000000):
If a number contains an exponent character, denoting a floating point,
I convert this floating point number from the end. This had nothing
to do with 32/64 bit system as it runs in the floating point 8087.
In this case I remember the exponent first.
start with 0,
add 1 , divide by 10
add 5 , 5 divide by 10
..
decimal point, remember the place.
The initial floating point number is 1/10 , the rounding mode
doesn't matter much, because a host of larger numbers have been added.
1.000000000000000111022302462515654042363166809082031251E0 FS.
1.000000000000000110E0
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:
I recently fixed a problem with kForth-Win32's conversion of decimal
strings to IEEE double precision floats e.g., with rounding mode set to
round nearest (with ties to eve), the string
"1.000 000 000 000 000 111 022 302 462 515 654 042 363 166 809 082 031
251 e0" (spaces added for clarity)
converted to the IEEE 64-bit binary pattern (shown in hex, high-dword
low- dword)
3ff00000 00000000
representing the exact number 1.000 ...
instead of converting to the nearest representable IEEE 754 double
precision number,
3ff00000 00000001
which has the value
1.000 000 000 000 000 222 044 604 925 031 308 084 726 333 618 164 062 500
The initial floating point number is 1/10 , the rounding mode
doesn't matter much, because a host of larger numbers have been added.
1.000000000000000111022302462515654042363166809082031251E0 FS.
1.000000000000000110E0
On 7/21/26 04:40, albert@SPENARNC.XS4ALL.NL wrote:...
You have a problem with your output conversion at the least, and maybe
-a 1.000000000000000111022302462515654042363166809082031251E0 FS.
-a 1.000000000000000110E0
also an input conversion problem. The output you show is not a
representable IEEE double precision number. See below. Have you run the fpio-test.4th conversion tests with your Forth system?
Below is the output of a program, exact-double.c, listed further below.
Enter a real number, x: 1.000000000000000111022302462515654042363166809082031251E0
-a-a before: 1
-a-a-a-a-a-a-a x: 1.0000000000000002220446049250313080847263336181640625
-a-a-a after: 1.000000000000000444089209850062616169452667236328125
...
On 7/21/26 04:40, albert@SPENARNC.XS4ALL.NL wrote:
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:...
...
Using double number arithmetic on a 64-bit Forth system, you may easily
verify that the correct round to nearest representable floating point
value is the one represented by the binary pattern 3ff00000 00000001 ,
rather than to the exactly representable value of 1.000.... (pattern
3ff00000 00000000):
If a number contains an exponent character, denoting a floating point,
I convert this floating point number from the end. This had nothing
to do with 32/64 bit system as it runs in the floating point 8087.
In this case I remember the exponent first.
start with 0,
add 1 , divide by 10
add 5 , 5 divide by 10
..
decimal point, remember the place.
The initial floating point number is 1/10 , the rounding mode
doesn't matter much, because a host of larger numbers have been added.
1.000000000000000111022302462515654042363166809082031251E0 FS.
1.000000000000000110E0
I think you misunderstood the referenced paragraph. It has to do with checking the conversion to see which of the adjacent representable
double precision numbers is the nearest one when the rounding mode is
set to nearest. It is possible to do this with integer arithmetic but
one needs double length 64-bit cell numbers to do it for the examples
given above.
--
KM
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:
On 7/21/26 04:40, albert@SPENARNC.XS4ALL.NL wrote:
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:...
...
Using double number arithmetic on a 64-bit Forth system, you may easily >>> verify that the correct round to nearest representable floating point
value is the one represented by the binary pattern 3ff00000 00000001 , >>> rather than to the exactly representable value of 1.000.... (pattern
3ff00000 00000000):
If a number contains an exponent character, denoting a floating point,
I convert this floating point number from the end. This had nothing
to do with 32/64 bit system as it runs in the floating point 8087.
In this case I remember the exponent first.
start with 0,
add 1 , divide by 10
add 5 , 5 divide by 10
..
decimal point, remember the place.
The initial floating point number is 1/10 , the rounding mode
doesn't matter much, because a host of larger numbers have been added.
1.000000000000000111022302462515654042363166809082031251E0 FS.
1.000000000000000110E0
I think you misunderstood the referenced paragraph. It has to do with checking the conversion to see which of the adjacent representable
double precision numbers is the nearest one when the rounding mode is
set to nearest. It is possible to do this with integer arithmetic but
one needs double length 64-bit cell numbers to do it for the examples
given above.
If you set rounding mode to nearest, you expect to get the
nearest result ???
Default is round to nearest.
If you start at the end with the conversion all the intermediate results
are round to nearest.
You process 60 digits and shift 40 digits into oblivion.
The last digit is 1. If this is the 60th decimal it is divided by 10 sixty times. There is nothing left of the poor 1, let alone of its rounding
errors.
I think there is no need to check the end result with my method,
unless I'm thoroughly mistaken.
Groetjes Albert
P.S.
I do not buy that 10e100 FSIN becomes any better if you do the
range reduction with utmost precision.
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:
On 7/21/26 04:40, albert@SPENARNC.XS4ALL.NL wrote:
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:...
...
Using double number arithmetic on a 64-bit Forth system, you may easily >>>> verify that the correct round to nearest representable floating point
value is the one represented by the binary pattern 3ff00000 00000001 , >>>> rather than to the exactly representable value of 1.000.... (pattern
3ff00000 00000000):
If a number contains an exponent character, denoting a floating point,
I convert this floating point number from the end. This had nothing
to do with 32/64 bit system as it runs in the floating point 8087.
In this case I remember the exponent first.
start with 0,
add 1 , divide by 10
add 5 , 5 divide by 10
..
decimal point, remember the place.
The initial floating point number is 1/10 , the rounding mode
doesn't matter much, because a host of larger numbers have been added.
1.000000000000000111022302462515654042363166809082031251E0 FS.
1.000000000000000110E0
I think you misunderstood the referenced paragraph. It has to do with
checking the conversion to see which of the adjacent representable
double precision numbers is the nearest one when the rounding mode is
set to nearest. It is possible to do this with integer arithmetic but
one needs double length 64-bit cell numbers to do it for the examples
given above.
If you set rounding mode to nearest, you expect to get the
nearest result ???
Default is round to nearest.
If you start at the end with the conversion all the intermediate results
are round to nearest.
You process 60 digits and shift 40 digits into oblivion.
The last digit is 1. If this is the 60th decimal it is divided by 10 sixty times. There is nothing left of the poor 1, let alone of its rounding
errors.
I think there is no need to check the end result with my method,
unless I'm thoroughly mistaken.
Groetjes Albert
P.S.
I do not buy that 10e100 FSIN becomes any better if you do the
range reduction with utmost precision.
On Sat, 25 Jul 2026 16:08:35 +0200
albert@SPENARNC.XS4ALL.NL wrote:
I do not buy that 10e100 FSIN becomes any better if you do theso what do you get for 10e100 fsin ?
range reduction with utmost precision.
In my system I get: (using 64 bit floats)
10e100 fsin f. 0.995717064571709700
or to avoid the conversion to decimal
10e100 fsin fh. 0x1.FDCEA088CF298p-1
On 7/25/26 10:07, peter wrote:
On Sat, 25 Jul 2026 16:08:35 +0200...
albert@SPENARNC.XS4ALL.NL wrote:
Using the x87 FSIN instruction with this argument, I obtain NAN.I do not buy that 10e100 FSIN becomes any better if you do theso what do you get for 10e100 fsin ?
range reduction with utmost precision.
In my system I get: (using 64 bit floats)
10e100 fsin f.-a 0.995717064571709700
or to avoid the conversion to decimal
10e100 fsin fh.-a 0x1.FDCEA088CF298p-1
The Problem:
-----------
This is a quality of implementation issue in the decimal string to
floating point conversion implemented in the C library function,
strtod(), for the Digital Mars C/C++ compiler. The conversion is not
simple, and has been studied extensively by a number of people. Of
particular note is the following paper,
--
Krishna Myneni
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:
The Problem:
-----------
This is a quality of implementation issue in the decimal string to
floating point conversion implemented in the C library function,
strtod(), for the Digital Mars C/C++ compiler. The conversion is not
simple, and has been studied extensively by a number of people. Of
particular note is the following paper,
[I think the Forth method would be to have hex floating point numbers
that are exactly related to the internal representation instead of
importing other languages problems. ]
I have try at https://github.com/mynenik/kForth-Win32/tree/master/forth-src
...
Run the fpio-tests for your input conversions to check. In your prior message, you showed me an output which is not even representable in double precision.
I recently fixed a problem with kForth-Win32's conversion of decimal
strings to IEEE double precision floats e.g., with rounding mode set to
round nearest (with ties to eve), the string
"1.000 000 000 000 000 111 022 302 462 515 654 042 363 166 809 082 031
251 e0" (spaces added for clarity)
converted to the IEEE 64-bit binary pattern (shown in hex, high-dword
low- dword)
3ff00000 00000000
representing the exact number 1.000 ...
instead of converting to the nearest representable IEEE 754 double
precision number,
3ff00000 00000001
which has the value
1.000 000 000 000 000 222 044 604 925 031 308 084 726 333 618 164 062 500
Thus, the following Forth code should behave as follows:
17 set-precision
ok
1.000000000000000111022302462515654042363166809082031251e0 fs. 1.0000000000000002e+00 ok
instead of printing 1.000000000000000e+00
--
Krishna Myneni
On 26/07/2026 4:17 am, Krishna Myneni wrote:
...
Run the fpio-tests for your input conversions to check. In your prior message, you showed me an output which is not even representable in double precision.
FWIW running your test on my F87 EXT prec system produced 0 errors;
while F87 DBL prec resulted in 18 errors.
I may try re-writing my input routine to parse from the other end but
my suspicion is it will be the same. It may avoid having to SET-NEAR
but likely that's all.
The IEEE spec for exact conversion was always going to be a high bar.
If one must have that, I'd rather use an EXT prec system and rename
DF@ DF! to F@ F! .
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:
I recently fixed a problem with kForth-Win32's conversion of decimal
strings to IEEE double precision floats e.g., with rounding mode set to
round nearest (with ties to eve), the string
"1.000 000 000 000 000 111 022 302 462 515 654 042 363 166 809 082 031
251 e0" (spaces added for clarity)
converted to the IEEE 64-bit binary pattern (shown in hex, high-dword
low- dword)
3ff00000 00000000
representing the exact number 1.000 ...
instead of converting to the nearest representable IEEE 754 double
precision number,
3ff00000 00000001
which has the value
1.000 000 000 000 000 222 044 604 925 031 308 084 726 333 618 164 062 500
Thus, the following Forth code should behave as follows:
17 set-precision
ok
1.000000000000000111022302462515654042363166809082031251e0 fs.
1.0000000000000002e+00 ok
instead of printing 1.000000000000000e+00
Trying a test of fpio-test.
[ It use REGRESS instead of t{ . The main difference is that it kills, instead of reports. REGRESS is not for testing, but to safeguard. ]
Note that I must convert a 8087 stack item to IEEE by storing
and fetching it with F! and F@.
WANT REGRESS -fp-
REGRESS FINIT S:
REGRESS -1.00000001335143196001808973960578441619873046875E-10 S:
REGRESS HEX FDUP FS. S:
REGRESS PAD F! PAD F@ FDUP FS. S:
REGRESS PAD @ S: BDDB7CDFE0000000
"
hex_t{ r4 L@ -> aedbe6ff }t
hex_t{ r8 2L@ -> bddb7cdf e0000000 }t
" TYPE
The outcome of the test:
$-PREFIX : (WARNING) NOT PRESENT, THOUGH WANTED
-fp- FINIT S: \ PASSED
-fp- -1.00000001335143196001808973960578441619873046875E-10 S: \ PASSED -6.DF37F8000000000000_-9 -fp- HEX FDUP FS. S: \ PASSED -6.DF37F8000000000000_-9 -fp- PAD F! PAD F@ FDUP FS. S: \ PASSED
-fp- PAD @ S: BDDB7CDFE0000000 \ PASSED
}thex_t{ r8 2L@ -> 3ff00000 00000000 }t
}thex_t{ r8 2L@ -> 3ff00000 00000001 }t
My first impression is that trimming the number to IEEE generates the correct result.
On 7/26/26 06:22, albert@SPENARNC.XS4ALL.NL wrote:
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:
I recently fixed a problem with kForth-Win32's conversion of decimal
strings to IEEE double precision floats e.g., with rounding mode set to
round nearest (with ties to eve), the string
"1.000 000 000 000 000 111 022 302 462 515 654 042 363 166 809 082 031
251 e0" (spaces added for clarity)
converted to the IEEE 64-bit binary pattern (shown in hex, high-dword
low- dword)
3ff00000 00000000
representing the exact number 1.000 ...
instead of converting to the nearest representable IEEE 754 double
precision number,
3ff00000 00000001
which has the value
1.000 000 000 000 000 222 044 604 925 031 308 084 726 333 618 164 062 500 >>>
Thus, the following Forth code should behave as follows:
17 set-precision
ok
1.000000000000000111022302462515654042363166809082031251e0 fs.
1.0000000000000002e+00 ok
instead of printing 1.000000000000000e+00
Trying a test of fpio-test.
[ It use REGRESS instead of t{ . The main difference is that it kills,
instead of reports. REGRESS is not for testing, but to safeguard. ]
Note that I must convert a 8087 stack item to IEEE by storing
and fetching it with F! and F@.
WANT REGRESS -fp-
REGRESS FINIT S:
REGRESS -1.00000001335143196001808973960578441619873046875E-10 S:
REGRESS HEX FDUP FS. S:
REGRESS PAD F! PAD F@ FDUP FS. S:
REGRESS PAD @ S: BDDB7CDFE0000000
"
hex_t{ r4 L@ -> aedbe6ff }t
hex_t{ r8 2L@ -> bddb7cdf e0000000 }t
" TYPE
The outcome of the test:
$-PREFIX : (WARNING) NOT PRESENT, THOUGH WANTED
-fp- FINIT S: \ PASSED
-fp- -1.00000001335143196001808973960578441619873046875E-10 S: \ PASSED
-6.DF37F8000000000000_-9 -fp- HEX FDUP FS. S: \ PASSED
-6.DF37F8000000000000_-9 -fp- PAD F! PAD F@ FDUP FS. S: \ PASSED
-fp- PAD @ S: BDDB7CDFE0000000 \ PASSED
That's encouraging. Try these two tests from the rounding section
dec_t{ 1.000000000000000111022302462515654042363166809082031250e+00 !r
}thex_t{ r8 2L@ -> 3ff00000 00000000 }t
dec_t{ 1.000000000000000111022302462515654042363166809082031251e+00 !r
}thex_t{ r8 2L@ -> 3ff00000 00000001 }t
Notice that the two decimal inputs are different by 1 in the last
decimal place. But the round to nearest changes the converted bit
pattern by 1 bit.
My first impression is that trimming the number to IEEE generates the correct
result.
--
KM
Krishna Myneni <krishna.myneni@ccreweb.org> wrote:...
That's encouraging. Try these two tests from the rounding section
dec_t{ 1.000000000000000111022302462515654042363166809082031250e+00 !r
}thex_t{ r8 2L@ -> 3ff00000 00000000 }t
dec_t{ 1.000000000000000111022302462515654042363166809082031251e+00 !r
}thex_t{ r8 2L@ -> 3ff00000 00000001 }t
Notice that the two decimal inputs are different by 1 in the last
decimal place. But the round to nearest changes the converted bit
pattern by 1 bit.
Okay, now I got:
S[ 3FF0000000000000 3FF0000000000001 ] 3FF0000000000001 ?
ciforth ERROR # 41 : REGRESSION TEST FAILS, RETURN VALUE ERROR
This impression is wrong.
My first impression is that trimming the number to IEEE generates the correct
result.
Apparently I do not understand the fine points of this matter.
On 7/25/26 22:15, dxf wrote:
On 26/07/2026 4:17 am, Krishna Myneni wrote:
...
Run the fpio-tests for your input conversions to check. In your prior message, you showed me an output which is not even representable in double precision.
FWIW running your test on my F87 EXT prec system produced 0 errors;
while F87 DBL prec resulted in 18 errors.
That is expected. If you use 80-bit Extended Precision and then convert to 64-bit Double Precision, they should match. However, the tests in fpio-test.4th do not guarantee that the decimal string conversion is good to within 1 ulp for all 64 bits of the significand for the 80-bit format. The tests are specific to double precision format conversions.
I may try re-writing my input routine to parse from the other end but
my suspicion is it will be the same.-a It may avoid having to SET-NEAR
but likely that's all.
The IEEE spec for exact conversion was always going to be a high bar.
If one must have that, I'd rather use an EXT prec system and rename
DF@ DF! to F@ F! .
David Gay's code, dtoa.c, is available to use for anyone interested in doing accurate decimal string to IEEE double precision format conversions and vice-versa. Your executable may grow by about 30--40K. I believe it supports 16 bit systems, but you may have to check.
None of those AFAIK
has made any attempt to achieve exact I/O conversion down to the last bit. I >can fully appreciate their choice. Equally so, C-based forths that need only >call in an existing library.
dxf <dxforth@gmail.com> writes:That trick doesn't work with base 3. It is by virtue of the fact that
None of those AFAIK
has made any attempt to achieve exact I/O conversion down to the last bit. I >>can fully appreciate their choice. Equally so, C-based forths that need only >>call in an existing library.
Gforth's REPRESENT calls glibc's ecvt_r(), and that produces an exact >representation of the number in decimal, if you give it a buffer with
enough size. A few days before the present thread started, I had
developed E.EXACT, which prints every digit in the exact decimal >representation of a binary FP number.
As you will see below, the exact representation can be longer than one
may want. For IEEE double-precision (aka binary64) numbers, the exact >numbers can have around
5e flog 1024e 53e f+ f* f.
i.e., 753 digits, while for 80387 80-bit numbers, the exact
representation can have around
5e flog 16384e 63e f+ f* f.
i.e., 11496 digits.
as a compromise between length and exactness, people tend to
prefer numbers that are close, but not exact. In particular, one can
use the shortest number that, when converted to binary, results in the
same number that one wants to convert to decimal. That needs at most
around 16 digits for IEEE double-precision numbers, and 20 digits for
80387 80-bit numbers. I plan to do that kind of conversion when I get
the time.
Here are the results for current E.EXACT:
0.1e e.exact \ .1000000000000000055511151231257827021181583404541015625e
\ smallest r>0, with 64-bit cells and 64-bit FP.
1 pad ! pad f@ cr e.exact \ output on the next line: >.4940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625e-323
- anton--
--
M. Anton Ertl http://www.complang.tuwien.ac.at/anton/home.html >comp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html
New standard: https://forth-standard.org/
EuroForth 2026 CFP: http://www.euroforth.org/ef26/cfp.html
dxf <dxforth@gmail.com> writes:
None of those AFAIK
has made any attempt to achieve exact I/O conversion down to the last bit. I
can fully appreciate their choice. Equally so, C-based forths that need only
call in an existing library.
Gforth's REPRESENT calls glibc's ecvt_r(), and that produces an exact representation of the number in decimal, if you give it a buffer with
enough size. A few days before the present thread started, I had
developed E.EXACT, which prints every digit in the exact decimal representation of a binary FP number.
...
On 7/31/26 03:35, Anton Ertl wrote:
Gforth's REPRESENT calls glibc's ecvt_r(),
and that produces an exact
representation of the number in decimal, if you give it a buffer with
enough size. A few days before the present thread started, I had
developed E.EXACT, which prints every digit in the exact decimal
representation of a binary FP number.
...
Are you using an existing big number arithmetic package or did you roll
your own?
Krishna Myneni <krishna.myneni@ccreweb.org> writes:
On 7/31/26 03:35, Anton Ertl wrote:
Gforth's REPRESENT calls glibc's ecvt_r(),
Correction: Gforth's REPRESENT calls ecvt_r(), and if that is provided
by a not-too-old glibc, the following holds:
and that produces an exact
representation of the number in decimal, if you give it a buffer with
enough size. A few days before the present thread started, I had
developed E.EXACT, which prints every digit in the exact decimal
representation of a binary FP number.
...
Are you using an existing big number arithmetic package or did you roll
your own?
Neither. I just give a buffer with length 800 (enough for a
double-precision mantissa) to REPRESENT, and the ecvt_r()
implementation produces the decimal string representation of the
mantissa.
glibc must have its own big number functions.
Conversion code in Forth for both directions should be possible to write >using the FSL big number arithmetic package, big.4th.
Krishna Myneni <krishna.myneni@ccreweb.org> writes:
glibc must have its own big number functions.
That's certainly possible.
Conversion code in Forth for both directions should be possible to write
using the FSL big number arithmetic package, big.4th.
Early in the Gforth project I thought about implementing string-to-FP
and FP-to-string conversion myself, remembering the to papers about
theses topics in the PLDI 1990 proceedings. Then I looked at the
papers and found that these topics are very complicated, and need a complicated implementation, and decided to spend my time on other
things.
In the meantime, other papers have been published on the topic, and
maybe some of the complications have been eliminated, but I have not
looked. For now standing on the shoulders of the libc developers is
good enough for me. A student of mine wrote an overview paper of four FP-to-string algorithms <http://www.complang.tuwien.ac.at/Bachelorarbeiten/orlov23.pdf>; it's
in German, but the last page references the original papers, which you
may find interesting.
"Correctly Rounded Binary-Decimal and Decimal-Binary Conversions," David
M. Gay, Numerical Analysis Manuscript 90-10, AT&T Bell Laboratories, 30 November 1990.
and the corresponding code, dtoa.c, link below, which provides a high- quality strtod() replacement function for decimal string to binary
floating point conversions, as well as the inverse function, dtoa().
https://netlib.org/fp/dtoa.c
The kForth system test code, fpio-test.4th, may be used to identify
problems with decimal string conversion to IEEE double floats in other
Forth systems. The test file may be found at the link below.
https://github.com/mynenik/kForth-Win32/blob/master/forth-src/system- test/fpio-test.4th
| Sysop: | Amessyroom |
|---|---|
| Location: | Fayetteville, NC |
| Users: | 74 |
| Nodes: | 6 (1 / 5) |
| Uptime: | 51:10:34 |
| Calls: | 1,101 |
| Calls today: | 1 |
| Files: | 1,339 |
| Messages: | 276,012 |