1. text.e bugs?
- Posted by irv Jan 09, 2015
- 2522 views
I'd appreciate anyone trying the program below and letting us know whether you have the same results. I've looked into text.e - where the problem lies, I think, but that is a huge amount of code to wade thru.
include std/console.e sequence numbers = {32, 1.2, 1.23, -1.23, -45.60, -45.61, 1499.459, -267.456, 1234567.893 ,-1234567.894} for i = 1 to length(numbers) do printf(1,"%2d Printf: %12.2f ",{i,numbers[i]}) display("Fmt A: [(,,:12.2] Fmt B: [,,:12.2] Raw: [] ",{numbers[i],numbers[i],numbers[i]}) end for /* 1 Printf: 32.00 Fmt A: 32.00 Fmt B: 32.00 Raw: 32 2 Printf: 1.20 Fmt A: 1.20 Fmt B: 1.20 Raw: 1.2 3 Printf: 1.23 Fmt A: 1.23 Fmt B: 1.23 Raw: 1.23 4 Printf: -1.23 Fmt A: (1.2) Fmt B: -1.23 Raw: -1.23 5 Printf: -45.60 Fmt A: (45.6) Fmt B: -45.60 Raw: -45.6 6 Printf: -45.61 Fmt A: (45.6) Fmt B: -45.61 Raw: -45.61 7 Printf: 1499.46 Fmt A: 1,499.45 Fmt B: 1,499.45 Raw: 1499.459 8 Printf: -267.46 Fmt A: (267.4) Fmt B: -,267.45 Raw: -267.456 9 Printf: 1234567.89 Fmt A: 1,234,567.89 Fmt B: 1,234,567.89 Raw: 1234567.893 10 Printf: -1234567.89 Fmt A: 1,234,567.8) Fmt B: 1,234,567.89 Raw: -1234567.894 */
2. Re: text.e bugs?
- Posted by _tom (admin) Jan 09, 2015
- 2512 views
I get identical results on 32bit Mint17, o[4.1
_tom
3. Re: text.e bugs?
- Posted by cargoan Jan 09, 2015
- 2522 views
- Last edited Jan 10, 2015
Eu4.1 on Archlinux64
field size = 12
[$]: eui prutext.ex 1 Printf: 32.00 Fmt A: 32.00 Fmt B: 32.00 Raw: 32 2 Printf: 1.20 Fmt A: 1.20 Fmt B: 1.20 Raw: 1.2 3 Printf: 1.23 Fmt A: 1.23 Fmt B: 1.23 Raw: 1.23 4 Printf: -1.23 Fmt A: (1.23) Fmt B: -1.23 Raw: -1.23 5 Printf: -45.60 Fmt A: (45.60) Fmt B: -45.60 Raw: -45.6 6 Printf: -45.61 Fmt A: (45.61) Fmt B: -45.61 Raw: -45.61 7 Printf: 1499.46 Fmt A: 1,499.45 Fmt B: 1,499.45 Raw: 1499.459 8 Printf: -267.46 Fmt A: (267.45) Fmt B: -,267.45 Raw: -267.456 9 Printf: 1234567.89 Fmt A: 1,234,567.89 Fmt B: 1,234,567.89 Raw: 1234567.893 10 Printf: -1234567.89 Fmt A: ,234,567.89) Fmt B: 1,234,567.89 Raw: -1234567.894
field size = 14
[$]: eui prutext.ex 1 Printf: 32.00 Fmt A: 32.00 Fmt B: 32.00 Raw: 32 2 Printf: 1.20 Fmt A: 1.20 Fmt B: 1.20 Raw: 1.2 3 Printf: 1.23 Fmt A: 1.23 Fmt B: 1.23 Raw: 1.23 4 Printf: -1.23 Fmt A: (1.23) Fmt B: -1.23 Raw: -1.23 5 Printf: -45.60 Fmt A: (45.60) Fmt B: -45.60 Raw: -45.6 6 Printf: -45.61 Fmt A: (45.61) Fmt B: -45.61 Raw: -45.61 7 Printf: 1499.46 Fmt A: 1,499.45 Fmt B: 1,499.45 Raw: 1499.459 8 Printf: -267.46 Fmt A: (267.45) Fmt B: -,267.45 Raw: -267.456 9 Printf: 1234567.89 Fmt A: 1,234,567.89 Fmt B: 1,234,567.89 Raw: 1234567.893 10 Printf: -1234567.89 Fmt A: (1,234,567.89) Fmt B: -1,234,567.89 Raw: -1234567.894in format function (std/text.e, line approx. 1870)
if atom(currargv) then if find('e', argtext) = 0 then -- Only applies to non-scientific notation. if decs != -1 then pos = find('.', argtext) if pos then if decs = 0 then argtext = argtext [1 .. pos-1 ] else -- added -------------------------------------------------------------------------------- integer pflag = 0 -- parenthesis flag if msign and currargv < 0 then pflag = 1 -- argtext = "(dd...d.dd...)" end if -- -------------------------------------------------------------------------------------- -- -- pos = length(argtext) - pos pos = length(argtext) - pos - pflag -- without closing parenthesis if pos > decs then argtext = argtext[ 1 .. $ - pos + decs ] elsif pos < decs then -- -- argtext = argtext & repeat('0', decs - pos) argtext = argtext[ 1 .. $ - pflag ] & repeat('0', decs - pos) -- except closing parenthesis -- added -------------------------------------------------------------------------------- if pflag then argtext &= ')' -- add closing parenthesis end if -- -------------------------------------------------------------------------------------- end if end if elsif decs > 0 then argtext = argtext & '.' & repeat('0', decs) end if end if end if end if
6. Re: text.e bugs?
- Posted by irv Jan 10, 2015
- 2431 views
Had to add one more patch to eliminate the -,267.45 shown in line 8b
Around line 1956 of text.e:
dpos -= dist if dpos > 1 then argtext = argtext[1.. dpos - 1] & tsep & argtext[dpos .. $] end if end while if bracketed then argtext = '(' & argtext & ')' end if end if end if -- patch by irv ---------------------------- if match("-,",argtext) = 1 then argtext = '-'&argtext[3..$] end if -------------------------------------------- if width <= 0 then width = length(argtext) end if if width < length(argtext) then if align = '>' then argtext = argtext[ $ - width + 1 .. $] elsif align = 'c' then pos = length(argtext) - width
8. Re: text.e bugs?
- Posted by cargoan Jan 10, 2015
- 2341 views
I found this:
while dpos > dist do dpos -= dist -- if dpos > 1 then -- take account sign character '+' and '-', '(' removed above if dpos > 1 + (currargv < 0) * not msign + (currargv > 0) * psign then argtext = argtext[1.. dpos - 1] & tsep & argtext[dpos .. $] end if end while if bracketed then argtext = '(' & argtext & ')' end if end if end if -- patch by irv ---------------------------- don't works if argtext = "+,..." -- if match("-,",argtext) = 1 then -- argtext = '-'&argtext[3..$] -- end if --------------------------------------------
9. Re: text.e bugs?
- Posted by cargoan Jan 11, 2015
- 2340 views
I posted a pastey with my proposal for format function with some modifications.
11. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 11, 2015
- 2343 views
Created patch.
I was going to commit this, but there's a bug with this patch according to tests/t_text.e
Can you look into this?
<pre> failed: format 'F', expected: "The answer is 1.234500" but got: "The answer is 1.234500.00" 178 tests run, 177 passed, 1 failed, 99% success </pre>
12. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 11, 2015
- 2315 views
Created patch.
I was going to commit this, but there's a bug with this patch according to tests/t_text.e
Can you look into this?
<pre> failed: format 'F', expected: "The answer is 1.234500" but got: "The answer is 1.234500.00" 178 tests run, 177 passed, 1 failed, 99% success </pre>
I've commited a version of the patch that doesn't have this issue.
14. Re: text.e bugs?
- Posted by cargoan Jan 11, 2015
- 2276 views
- Last edited Jan 12, 2015
But.
include std/console.e include std/text.e display("Fmt A: [,,:14.2] Fmt B: [,,:14.2] Raw: []", {-123456.789, -123456.789, -123456.789}) display("Fmt A: [+,,:14.2] Fmt B: [+,,:14.2] Raw: []\n", { 123456.789, 123456.789, 123456.789}) display("Fmt A: [,,:14.2] Fmt B: [,,:14.2] Raw: []", {-267.4, -267.4, -267.4}) display("Fmt A: [+,,:14.2] Fmt B: [+,,:14.2] Raw: []\n", { 267.4, 267.4, 267.4}) display("Fmt A: [(,,:14.2] Fmt B: [,,:14.2] Raw: []", {-267.4, -267.4, -267.4}) display("Fmt A: [+(,,:14.2] Fmt B: [+,,:14.2] Raw: []\n", { 267.4, 267.4, 267.4}) /* output Fmt A: -,123,456.78 Fmt B: -,123,456.78 Raw: -123456.789 Fmt A: +,123,456.78 Fmt B: +,123,456.78 Raw: 123456.789 Fmt A: -,267.40 Fmt B: -,267.40 Raw: -267.4 Fmt A: +,267.40 Fmt B: +,267.40 Raw: 267.4 Fmt A: (267.4) Fmt B: -,267.40 Raw: -267.4 Fmt A: +,267.40 Fmt B: +,267.40 Raw: 267.4 */
15. Re: text.e bugs?
- Posted by cargoan Jan 11, 2015
- 2305 views
- Last edited Jan 12, 2015
patch
--- text.e 2015-01-12 08:14:42.156966000 +0100 +++ text.e.new 2015-01-12 08:13:40.122966000 +0100 @@ -1923,6 +1923,7 @@ if binout or hexout then dist = 4 + psign = 0 else dist = 3 end if @@ -1940,7 +1941,7 @@ end if while dpos > dist do dpos -= dist - if dpos > 1 then + if dpos > 1 + (currargv < 0) * not msign + (currargv > 0) * psign then argtext = argtext[1.. dpos - 1] & tsep & argtext[dpos .. $] end if end while
Sorry, inexplicably forgotten.
16. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 12, 2015
- 2267 views
patch
--- text.e 2015-01-12 08:14:42.156966000 +0100 +++ text.e.new 2015-01-12 08:13:40.122966000 +0100
I have applied this patch as well.
BTW, for easeof use the patch really should read like this:
--- text.e 2015-01-12 08:14:42.156966000 +0100 +++ text.e 2015-01-12 08:13:40.122966000 +0100
17. Re: text.e bugs?
- Posted by cargoan Jan 12, 2015
- 2246 views
another:
--- text.e 2015-01-12 08:48:35.229966000 +0100 +++ text.e 2015-01-12 08:13:40.122966000 +0100 @@ -1892,12 +1892,11 @@ if pos > decs then argtext = argtext[ 1 .. $ - pos + decs ] elsif pos < decs then - argtext = argtext[ 1 .. $ - pflag ] & repeat('0', decs - pos) - --if pflag then - --argtext = argtext[ 1 .. $ - 1 ] & repeat('0', decs - pos) & ')' - --else - --argtext = argtext & repeat('0', decs - pos) - --end if + if pflag then + argtext = argtext[ 1 .. $ - 1 ] & repeat('0', decs - pos) & ')' + else + argtext = argtext & repeat('0', decs - pos) + end if end if end if elsif decs > 0 then
19. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 12, 2015
- 2248 views
another:
This one causes a test in t_text.e to fail. I'm not committing this until that issue is corrected.
20. Re: text.e bugs?
- Posted by cargoan Jan 12, 2015
- 2273 views
Sorry, I changed commented lines so patch not applied.
--- text.e 2015-01-12 09:22:20.992966000 +0100 +++ text.e 2015-01-12 09:26:31.060966000 +0100 @@ -1892,12 +1892,11 @@ if pos > decs then argtext = argtext[ 1 .. $ - pos + decs ] elsif pos < decs then - argtext = argtext[ 1 .. $ - pflag ] & repeat('0', decs - pos) - --if pflag then - --argtext = argtext[ 1 .. $ - 1 ] & '.' & repeat('0', decs - pos) & ')' - --else - --argtext = argtext & '.' & repeat('0', decs - pos) - --end if + if pflag then + argtext = argtext[ 1 .. $ - 1 ] & repeat('0', decs - pos) & ')' + else + argtext = argtext & repeat('0', decs - pos) + end if end if end if elsif decs > 0 then
[$]: eutest t_text.e interpreting t_text.e: Test results summary: Files (run: 1) (failed: 0) (100% success)
21. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 12, 2015
- 2244 views
Sorry, I changed commented lines so patch not applied.
--- text.e 2015-01-12 09:22:20.992966000 +0100 +++ text.e 2015-01-12 09:26:31.060966000 +0100
[$]: eutest t_text.e interpreting t_text.e: Test results summary: Files (run: 1) (failed: 0) (100% success)
Now I'm getting this:
failed: format 'F', expected: "The answer is 1.234500" but got: "The answer is 1.23450000" 178 tests run, 177 passed, 1 failed, 99% success
22. Re: text.e bugs?
- Posted by cargoan Jan 12, 2015
- 2218 views
Check passes for me.??? (Arch Linux 64)
[cargoan@HP-s3733es ~]$ eui -v Euphoria Interpreter v4.1.0 development 64-bit Linux, Using System Memory Revision Date: 2014-10-01 13:26:40, Id: 6258:f0054b3a8f8b [cargoan@HP-s3733es ~]$ cd Fuentes/mercurial/euphoria/ [cargoan@HP-s3733es euphoria]$ hg pull pulling from http://scm.openeuphoria.org/hg/euphoria searching for changes no changes found [cargoan@HP-s3733es euphoria]$ hg id f0054b3a8f8b (struct) [cargoan@HP-s3733es euphoria]$ hg update default 48 files updated, 0 files merged, 7 files removed, 0 files unresolved [cargoan@HP-s3733es euphoria]$ cp include/std/text.e "$EUINC/std/text.e" [cargoan@HP-s3733es euphoria]$ cd "$EUINC/std/" [cargoan@HP-s3733es std]$ diff -u text.e text.e.new > changes [cargoan@HP-s3733es std]$ patch < changes patching file text.e [cargoan@HP-s3733es std]$ eutest "$EUDIR/tests/t_text.e" interpreting /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e: Test results summary: Files (run: 1) (failed: 0) (100% success) [cargoan@HP-s3733es std]$ cat changes --- text.e 2015-01-12 10:27:00.977966000 +0100 +++ text.e.new 2015-01-12 10:18:10.010966000 +0100 @@ -1892,12 +1892,11 @@ if pos > decs then argtext = argtext[ 1 .. $ - pos + decs ] elsif pos < decs then - argtext = argtext[ 1 .. $ - pflag ] & repeat('0', decs - pos) - --if pflag then - --argtext = argtext[ 1 .. $ - 1 ] & '.' & repeat('0', decs - pos) & ')' - --else - --argtext = argtext & '.' & repeat('0', decs - pos) - --end if + if pflag then + argtext = argtext[ 1 .. $ - 1 ] & repeat('0', decs - pos) & ')' + else + argtext = argtext & repeat('0', decs - pos) + end if end if end if elsif decs > 0 then [cargoan@HP-s3733es std]$
???????...
23. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 12, 2015
- 2219 views
Check passes for me.??? (Arch Linux 64)
What issue is this patch intended to fix?
24. Re: text.e bugs?
- Posted by cargoan Jan 12, 2015
- 2226 views
This:
include std/console.e include std/text.e display("Fmt A: [(,,:14.2] Fmt B: [,,:14.2] Raw: []", { 267.4, 267.4, 267.4}) display("Fmt A: [+(,,:14.2] Fmt B: [+,,:14.2] Raw: []\n", {-267.4, -267.4, -267.4}) /* output Fmt A: 267.40 Fmt B: 267.40 Raw: 267.4 Fmt A: (267.4) Fmt B: -267.40 Raw: -267.4 */ -- eucode
25. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 12, 2015
- 2194 views
This:
include std/console.e include std/text.e display("Fmt A: [(,,:14.2] Fmt B: [,,:14.2] Raw: []", { 267.4, 267.4, 267.4}) display("Fmt A: [+(,,:14.2] Fmt B: [+,,:14.2] Raw: []\n", {-267.4, -267.4, -267.4}) /* output Fmt A: 267.40 Fmt B: 267.40 Raw: 267.4 Fmt A: (267.4) Fmt B: -267.40 Raw: -267.4 */ -- eucode
This is the output that I get from what is currently checked in...
Fmt A: 267.400 Fmt B: 267.400 Raw: 267.4 Fmt A: (267.40) Fmt B: -267.400 Raw: -267.4
26. Re: text.e bugs?
- Posted by cargoan Jan 12, 2015
- 2205 views
patched: Fmt A: 267.40 Fmt B: 267.40 Raw: 267.4 Fmt A: (267.40) Fmt B: -267.40 Raw: -267.4
27. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 12, 2015
- 2175 views
patched: Fmt A: 267.40 Fmt B: 267.40 Raw: 267.4 Fmt A: (267.40) Fmt B: -267.40 Raw: -267.4
Understood. That patch has now been committed as well.
28. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 12, 2015
- 2229 views
Sorry, I changed commented lines so patch not applied.
--- text.e 2015-01-12 09:22:20.992966000 +0100 +++ text.e 2015-01-12 09:26:31.060966000 +0100
[$]: eutest t_text.e interpreting t_text.e: Test results summary: Files (run: 1) (failed: 0) (100% success)
Now I'm getting this:
failed: format 'F', expected: "The answer is 1.234500" but got: "The answer is 1.23450000" 178 tests run, 177 passed, 1 failed, 99% success
I understand what happened here. I missed a line of the patch. My fault, sorry.
29. Re: text.e bugs?
- Posted by cargoan Jan 12, 2015
- 2210 views
Actually it was my mistake. I had to delete a line in the first patch that should be commented
This one:
argtext = argtext[ 1 .. $ - pflag ] & repeat('0', decs - pos)
Then jim comments the other and left that, when it should be the opposite. Although they had the error of a dot insertion (copy/paste stuff)
Thank you for everything!
30. Re: text.e bugs?
- Posted by cargoan Jan 13, 2015
- 2148 views
I found this:
printf(1, "%.6f\n", 2.6758787874) ==> 2.675879 printf(1, "%.6g\n", 2.6758787874) ==> 2.67588
printf general format bug?
31. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 13, 2015
- 2147 views
I found this:
printf(1, "%.6f\n", 2.6758787874) ==> 2.675879 printf(1, "%.6g\n", 2.6758787874) ==> 2.67588
printf general format bug?
Probably. I get identical results from the following C code, so it's a C library issue, not an Euphoria issue.
#include <stdio.h> int main(int argc, char ** argv) { printf("%.6f\n", 2.6758787874); printf("%.6g\n", 2.6758787874); return 0; }
32. Re: text.e bugs?
- Posted by petelomax Jan 13, 2015
- 2151 views
printf general format bug?
Probably. I get identical results from the following C code, so it's a C library issue, not an Euphoria issue.
It has nothing to do with the C library. If you increase the number of digits before the decimal point:
2.6758787874 ==> 2.675879 2.6758787874 ==> 2.67588 12.6758787874 ==> 12.675879 12.6758787874 ==> 12.6759 123.6758787874 ==> 123.675879 123.6758787874 ==> 123.676 1234.6758787874 ==> 1234.675879 1234.6758787874 ==> 1234.68I think the ".6" has a different meaning for f (six decimal paces?) and g (six digits?).
If anyone finds somewhere this is explained properly, please post a link here.
Pete
33. Re: text.e bugs?
- Posted by cargoan Jan 13, 2015
- 2193 views
... I think the ".6" has a different meaning for f (six decimal paces?) and g (six digits?).
If anyone finds somewhere this is explained properly, please post a link here.
Pete
The ‘%g’ and ‘%G’ conversions print the argument in the style of ‘%e’ or ‘%E’ (respectively) if the exponent would be less than -4 or greater than or equal to the precision; otherwise they use the ‘%f’ style. A precision of 0, is taken as 1. Trailing zeros are removed from the fractional portion of the result and a decimal-point character appears only if it is followed by a digit.
34. Re: text.e bugs?
- Posted by cargoan Jan 13, 2015
- 2089 views
- Last edited Jan 14, 2015
Please! Ignore this patch.
I put later other with the amendments and 64 bits support.
And more
include std/text.e puts(1, format("Fmt A: [(,,:018.2] Fmt B: [,,:018.2] Raw: []", { 1267.4, 1267.4, 1267.4}) & 10) puts(1, format("Fmt A: [(,,:018.2] Fmt B: [,,:018.2] Raw: []", {-1267.4, -1267.4, -1267.4}) & 10) puts(1, format("Fmt A: [+(,,:018.2] Fmt B: [+,,:018.2] Raw: []", { 1267.4, 1267.4, 1267.4}) & 10) puts(1, format("Fmt A: [+(,,:018.2] Fmt B: [+,,:018.2] Raw: []\n", {-1267.4, -1267.4, -1267.4}) & 10) puts(1, format("Fmt A: [z,,:18] Fmt B: [,,:018.2] Raw: []", { 1267.4, 1267.4, 1267.4}) & 10) puts(1, format("Fmt A: [z,,:18] Fmt B: [,,:018.2] Raw: []", {-1267.4, -1267.4, -1267.4}) & 10) puts(1, format("Fmt A: [+z,,:18] Fmt B: [+,,:018.2] Raw: []", { 1267.4, 1267.4, 1267.4}) & 10) puts(1, format("Fmt A: [+z,,:18] Fmt B: [+,,:018.2] Raw: []", {-1267.4, -1267.4, -1267.4}) & 10)
[$]: eui ~/prutext.ex Fmt A: 000000000001267.40 Fmt B: 000000000001267.40 Raw: 1267.4 Fmt A: 00000000001267.40) Fmt B: 000000000001267.40 Raw: -1267.4 Fmt A: 000000000001267.40 Fmt B: 000000000001267.40 Raw: 1267.4 Fmt A: 00000000001267.40) Fmt B: 000000000001267.40 Raw: -1267.4 Fmt A: 0000000000001267.4 Fmt B: 000000000001267.40 Raw: 1267.4 Fmt A: -000000000001267.4 Fmt B: 000000000001267.40 Raw: -1267.4 Fmt A: +000000000001267.4 Fmt B: 000000000001267.40 Raw: 1267.4 Fmt A: -000000000001267.4 Fmt B: 000000000001267.40 Raw: -1267.4 [$]: cd $EUINC/std; diff -u text.e text.e.new | patch; eutest "$EUDIR/tests/t_text.e"; patching file text.e interpreting /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e: Test results summary: Files (run: 1) (failed: 0) (100% success) [$]: eui ~/prutext.ex Fmt A: 000000000001267.40 Fmt B: 000000000001267.40 Raw: 1267.4 Fmt A: (0000000001267.40) Fmt B: -00000000001267.40 Raw: -1267.4 Fmt A: +00000000001267.40 Fmt B: +00000000001267.40 Raw: 1267.4 Fmt A: (0000000001267.40) Fmt B: -00000000001267.40 Raw: -1267.4 Fmt A: 0000000000001267.4 Fmt B: 000000000001267.40 Raw: 1267.4 Fmt A: -000000000001267.4 Fmt B: -00000000001267.40 Raw: -1267.4 Fmt A: +000000000001267.4 Fmt B: +00000000001267.40 Raw: 1267.4 Fmt A: -000000000001267.4 Fmt B: -00000000001267.40 Raw: -1267.4
patch:
--- text.e 2015-01-14 09:02:11.151693000 +0100 +++ text.e 2015-01-14 08:53:20.514693000 +0100 @@ -1441,7 +1441,9 @@ integer ep integer pflag integer count - + sequence fmt + atom argval + if atom(arg_list) then arg_list = {arg_list} end if @@ -1548,7 +1550,7 @@ end if width = width * 10 + pos - 1 if width = 0 then - zfill = '0' + zfill = 1 end if end while @@ -1760,7 +1762,19 @@ end if end if else - argtext = trim(sprintf("%15.15g", arg_list[argn])) + argval = arg_list[argn] + if argval < 0 then + argval = -argval + end if + if decs < 0 then + fmt = "%.15g" + elsif argval >= 1e15 or + argval < 1e-4 then + fmt = sprintf("%%.%de", decs) + else + fmt = sprintf("%%.%df", decs) + end if + argtext = trim(sprintf(fmt, arg_list[argn])) -- Remove any leading 0 after e+ while ep != 0 with entry do argtext = remove(argtext, ep+2) @@ -1770,7 +1784,11 @@ if zfill != 0 and width > 0 then if width > length(argtext) then if argtext[1] = '-' then - argtext = '-' & repeat('0', width - length(argtext)) & argtext[2..$] + if msign then + argtext = '-' & repeat('0', width - length(argtext) - 1) & argtext[2..$] + else + argtext = '-' & repeat('0', width - length(argtext)) & argtext[2..$] + end if else argtext = repeat('0', width - length(argtext)) & argtext end if @@ -1790,7 +1808,7 @@ argtext = '(' & argtext[2..$] & ')' else if argtext[2] = '0' then - argtext = '(' & argtext[3..$] & ')' + argtext = '(' & argtext[2..$] & ')' else argtext = argtext[2..$] & ')' end if
35. Re: text.e bugs?
- Posted by petelomax Jan 13, 2015
- 2135 views
... I think the ".6" has a different meaning for f (six decimal paces?) and g (six digits?).
If anyone finds somewhere this is explained properly, please post a link here.
Pete
The ‘%g’ and ‘%G’ conversions print the argument in the style of ‘%e’ or ‘%E’ (respectively) if the exponent would be less than -4 or greater than or equal to the precision; otherwise they use the ‘%f’ style. A precision of 0, is taken as 1. Trailing zeros are removed from the fractional portion of the result and a decimal-point character appears only if it is followed by a digit.
Thanks.
The precision specifies how many digits follow the decimal-point character for the ‘%f’, ‘%e’, and ‘%E’ conversions. For these conversions, the default precision is 6. If the precision is explicitly 0, this suppresses the decimal point character entirely. For the ‘%g’ and ‘%G’ conversions, the precision specifies how many significant digits to print.
I think I'll probably just add a see also("external link") to that from my help file.
36. Re: text.e bugs?
- Posted by cargoan Jan 14, 2015
- 2060 views
- Last edited Jan 16, 2015
Same as previous plus 64bits support.
Tests fails in 4.1 version, expected a floating (1.2345e+17) but it is an integer in 64 bits, and expected a 32 bits sequence in binary format.
I use only Euphoria 4.1.
[$]: eutest "$EUDIR/tests/t_text.e"; interpreting /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e: failed: format 'I', expected: "The answer is 1.2345e+17" but got: "The answer is 123450000000000000.0000" failed: format 'AH', expected: "11111111111111111111111101001111" but got: "1111111111111111111111111111111111111111111111111111111101001111" 178 tests run, 176 passed, 2 failed, 99% success FAILURE: /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e program died with status 1 Test results summary: FAIL: /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e Files (run: 1) (failed: 1) (0% success)
Patch:
--- text.e 2015-01-16 16:51:23.272149000 +0100 +++ text.e 2015-01-16 16:49:52.882149000 +0100 @@ -1408,6 +1408,22 @@ -- See Also: -- [[:sprintf]] -- +ifdef EU4_1 then + constant MAX_BITS = 64 + constant MAX_DIGS = 18 + constant MAX_INT = 0x3FFF_FFFF_FFFF_FFFF + constant MIN_INT = -0x4000_0000_0000_0000 +elsedef + constant MAX_BITS = 32 + constant MAX_DIGS = 15 + constant MAX_INT = 0x3FFF_FFFF + constant MIN_INT = -0x4000_0000 +end ifdef + +constant MAX_UCS4 = 0xFFFF_FFFF +constant MAX_IFMT = 0x3FFF_FFFF +constant MIN_IFMT = -0x4000_0000 + public function format(sequence format_pattern, object arg_list = {}) sequence result @@ -1441,7 +1457,9 @@ integer ep integer pflag integer count - + sequence fmt + atom argval + if atom(arg_list) then arg_list = {arg_list} end if @@ -1548,7 +1566,7 @@ end if width = width * 10 + pos - 1 if width = 0 then - zfill = '0' + zfill = 1 end if end while @@ -1677,18 +1695,18 @@ argtext = arg_list[argn] end if - elsif integer(arg_list[argn]) - -- for consistent formatting, we need to test in case of 64-bit euphoria - and arg_list[argn] <= 0x3fff_ffff - and arg_list[argn] >= -0x4000_0000 then + elsif integer(arg_list[argn]) + -- for consistent formatting, we need to test in case of 64-bit euphoria + and arg_list[argn] <= MAX_IFMT + and arg_list[argn] >= MIN_IFMT then if istext then - argtext = {and_bits(0xFFFF_FFFF, math:abs(arg_list[argn]))} + argtext = {and_bits(MAX_UCS4, math:abs(arg_list[argn]))} elsif bwz != 0 and arg_list[argn] = 0 then argtext = repeat(' ', width) elsif binout = 1 then - argtext = stdseq:reverse( convert:int_to_bits(arg_list[argn], 32)) + '0' + argtext = stdseq:reverse( convert:int_to_bits(arg_list[argn], MAX_BITS)) + '0' if zfill != 0 and width > 0 then if width > length(argtext) then argtext = repeat('0', width - length(argtext)) & argtext @@ -1749,7 +1767,7 @@ elsif atom(arg_list[argn]) then if istext then - argtext = {and_bits(0xFFFF_FFFF, math:abs(floor(arg_list[argn])))} + argtext = {and_bits(MAX_UCS4, math:abs(floor(arg_list[argn])))} else if hexout then @@ -1760,7 +1778,19 @@ end if end if else - argtext = trim(sprintf("%15.15g", arg_list[argn])) + argval = arg_list[argn] + if argval < 0 then + argval = -argval + end if + if decs < 0 then + fmt = sprintf("%%.%dg", MAX_DIGS) + elsif argval >= power(10, MAX_DIGS) or + argval < 1e-4 then + fmt = sprintf("%%.%de", decs) + else + fmt = sprintf("%%.%df", decs) + end if + argtext = sprintf(fmt, arg_list[argn]) -- Remove any leading 0 after e+ while ep != 0 with entry do argtext = remove(argtext, ep+2) @@ -1770,7 +1800,7 @@ if zfill != 0 and width > 0 then if width > length(argtext) then if argtext[1] = '-' then - argtext = '-' & repeat('0', width - length(argtext)) & argtext[2..$] + argtext = '-' & repeat('0', width - length(argtext) - msign) & argtext[2..$] else argtext = repeat('0', width - length(argtext)) & argtext end if @@ -1790,7 +1820,7 @@ argtext = '(' & argtext[2..$] & ')' else if argtext[2] = '0' then - argtext = '(' & argtext[3..$] & ')' + argtext = '(' & argtext[2..$] & ')' else argtext = argtext[2..$] & ')' end if @@ -1821,7 +1851,7 @@ argtext = tempv elsif integer(tempv) then if istext then - argtext = {and_bits(0xFFFF_FFFF, math:abs(tempv))} + argtext = {and_bits(MAX_UCS4, math:abs(tempv))} elsif bwz != 0 and tempv = 0 then argtext = repeat(' ', width) @@ -1831,20 +1861,23 @@ elsif atom(tempv) then if istext then - argtext = {and_bits(0xFFFF_FFFF, math:abs(floor(tempv)))} + argtext = {and_bits(MAX_UCS4, math:abs(floor(tempv)))} elsif bwz != 0 and tempv = 0 then argtext = repeat(' ', width) else - argtext = trim(sprintf("%15.15g", tempv)) + fmt = sprintf("%%%d.%dg", {MAX_DIGS, MAX_DIGS}) + argtext = trim(sprintf(fmt, tempv)) end if else + fmt = sprintf("%%.%dg", MAX_DIGS) argtext = pretty:pretty_sprint( tempv, - {2,0,1,1000,"%d","%.15g",32,127,1,0} + {2,0,1,1000,"%d",fmt,32,127,1,0} ) end if else + fmt = sprintf("%%.%dg", MAX_DIGS) argtext = pretty:pretty_sprint( arg_list[argn], - {2,0,1,1000,"%d","%.15g",32,127,1,0} + {2,0,1,1000,"%d",fmt,32,127,1,0} ) end if -- Remove any leading 0 after e+
Thank you everyone for your patience.
37. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 22, 2015
- 2049 views
Can you just send me your finished version of text.e , with all patches already applied?
38. Re: text.e bugs?
- Posted by cargoan Jan 23, 2015
- 2002 views
Can you just send me your finished version of text.e , with all patches already applied?
Done.
http://openeuphoria.org/pastey/264.wc
interpreting /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e: failed: format 'AH', expected: "11111111111111111111111101001111" but got: "1111111111111111111111111111111111111111111111111111111101001111" 178 tests run, 177 passed, 1 failed, 99% success FAILURE: /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e program died with status 1 Test results summary: FAIL: /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e Files (run: 1) (failed: 1) (0% success)and this:
puts(1, format("[X,_]", {-2})) -- prints FFFF_FFFF_FFFF_FFFE
64 bit integers.
39. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 23, 2015
- 1954 views
Can you just send me your finished version of text.e , with all patches already applied?
Done.
http://openeuphoria.org/pastey/264.wc
interpreting /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e: failed: format 'AH', expected: "11111111111111111111111101001111" but got: "1111111111111111111111111111111111111111111111111111111101001111" 178 tests run, 177 passed, 1 failed, 99% success FAILURE: /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e program died with status 1 Test results summary: FAIL: /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e Files (run: 1) (failed: 1) (0% success)
Hmm. That file is giving me the following failures on 32bit:
failed: format 'AA', expected: "seq is {1.2,5,\"abcdef\",{3}}" but got: "seq is {1.19999999999999996,5,\"abcdef\",{3}}" failed: format 'AH', expected: "11111111111111111111111101001111" but got: "0" failed: format 'AO', expected: "+00117.2" but got: "00000003" failed: format 'AP', expected: "-00117.2" but got: "00000003" failed: format 'AT', expected: "+117.2" but got: "+117.200000000000003" failed: format 'AU', expected: "-117.2" but got: "-117.200000000000003" failed: format 'AV', expected: "(117.2)" but got: "(117.200000000000003)" failed: format 'AW', expected: "(0117.2)" but got: "0000003)" failed: format 'BA', expected: "117.2" but got: "117.200000000000003" failed: format 'BL', expected: "5.5004)" but got: "000013)" 178 tests run, 168 passed, 10 failed, 94% success
40. Re: text.e bugs?
- Posted by cargoan Jan 23, 2015
- 1951 views
I don't know. I have only 64 bits.
If I do this then pass all tests.
--ifdef EU4_1 then -- constant MAX_BITS = 64 -- constant MAX_DIGS = 18 -- constant MAX_INT = 0x3FFF_FFFF_FFFF_FFFF -- constant MIN_INT = -0x4000_0000_0000_0000 --elsedef constant MAX_BITS = 32 constant MAX_DIGS = 15 constant MAX_INT = 0x3FFF_FFFF constant MIN_INT = -0x4000_0000 --end ifdef constant MAX_UCS4 = 0xFFFF_FFFF constant MAX_IFMT = 0x3FFF_FFFF constant MIN_IFMT = -0x4000_0000
[$]: eutest "$EUDIR/tests/t_text.e" interpreting /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e: Test results summary: Files (run: 1) (failed: 0) (100% success)
41. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 23, 2015
- 1949 views
I don't know. I have only 64 bits.
If I do this then pass all tests.
--ifdef EU4_1 then -- constant MAX_BITS = 64 -- constant MAX_DIGS = 18 -- constant MAX_INT = 0x3FFF_FFFF_FFFF_FFFF -- constant MIN_INT = -0x4000_0000_0000_0000 --elsedef constant MAX_BITS = 32 constant MAX_DIGS = 15 constant MAX_INT = 0x3FFF_FFFF constant MIN_INT = -0x4000_0000 --end ifdef constant MAX_UCS4 = 0xFFFF_FFFF constant MAX_IFMT = 0x3FFF_FFFF constant MIN_IFMT = -0x4000_0000
[$]: eutest "$EUDIR/tests/t_text.e" interpreting /home/cargoan/euphoria-LINUX-4.1.0/tests/t_text.e: Test results summary: Files (run: 1) (failed: 0) (100% success)
I think I figured it out. I've committed a fixed version.
42. Re: text.e bugs?
- Posted by irv Jan 23, 2015
- 1946 views
Just downloaded and compiled. Only one question remains, should text:format round in the same manner as printf, or is this better left as an option for the programmer?
7 Printf: 1499.46 Fmt A: 1,499.45 Fmt B: 1,499.45 Raw: 1499.459 8 Printf: -267.46 Fmt A: (267.45) Fmt B: -267.45 Raw: -267.456
43. Re: text.e bugs?
- Posted by cargoan Jan 24, 2015
- 1935 views
- Last edited Jan 26, 2015
Just downloaded and compiled. Only one question remains, should text:format round in the same manner as printf, or is this better left as an option for the programmer?
7 Printf: 1499.46 Fmt A: 1,499.45 Fmt B: 1,499.45 Raw: 1499.459 8 Printf: -267.46 Fmt A: (267.45) Fmt B: -267.45 Raw: -267.456
Something like that? (adding 'r' to decs):
[$]: cat ~/pru2.ex; eui ~/pru2.ex include std/text.e puts(1, format("Fmt A: [(,,:12.2] Fmt B: [,,:12.2] Raw: []\n", {-267.456,-267.456,-267.456})) puts(1, format("Fmt A: [(,,:12.2r] Fmt B: [,,:12.2r] Raw: []\n", {-267.456,-267.456,-267.456})) puts(1, format("Fmt A: [(,,:12.] Fmt B: [,,:12.] Raw: []\n", {-267.56,-267.56,-267.56})) puts(1, format("Fmt A: [(,,:12.] Fmt B: [,,:12.r] Raw: []\n", {-267.56,-267.56,-267.56})) puts(1, format("The answer is [.4]\n", {1.234567e17})) puts(1, format("The answer is [.4r]\n", {1.234567e17})) puts(1, format("The answer is [.]\n", {1.567234e17})) puts(1, format("The answer is [.r]\n", {1.567234e17})) Fmt A: (267.45) Fmt B: -267.45 Raw: -267.456 Fmt A: (267.46) Fmt B: -267.46 Raw: -267.456 Fmt A: (267) Fmt B: -267 Raw: -267.56 Fmt A: (267) Fmt B: -268 Raw: -267.56 The answer is 1.2345e+17 The answer is 1.2346e+17 The answer is 1e+17 The answer is 2e+17
with this patch:
--- text.e 2015-01-26 09:35:20.466148000 +0100 +++ text.e 2015-01-26 09:22:46.022148000 +0100 @@ -1412,18 +1412,16 @@ ifdef BITS64 then constant MAX_BITS = 64 constant MAX_DIGS = 18 - constant MAX_INT = 0x3FFF_FFFF_FFFF_FFFF - constant MIN_INT = -0x4000_0000_0000_0000 elsedef constant MAX_BITS = 32 constant MAX_DIGS = 15 - constant MAX_INT = 0x3FFF_FFFF - constant MIN_INT = -0x4000_0000 end ifdef constant MAX_UCS4 = 0xFFFF_FFFF constant MAX_IFMT = 0x3FFF_FFFF constant MIN_IFMT = -0x4000_0000 +constant MAX_FFMT = power(10, 15) +constant MIN_FFMT = power(10, -4) public function format(sequence format_pattern, object arg_list = {}) sequence result @@ -1456,6 +1454,7 @@ object envvar integer ep integer pflag + integer round integer count sequence fmt atom argval @@ -1572,12 +1571,17 @@ case '.' then decs = 0 + round = 0 while i < length(format_pattern) do i += 1 tch = format_pattern[i] pos = find(tch, "0123456789") if pos = 0 then - i -= 1 + if tch = 'r' then + round = MAX_DIGS + else + i -= 1 + end if exit end if decs = decs * 10 + pos - 1 @@ -1783,14 +1787,31 @@ argval = -argval end if if decs < 0 then - fmt = sprintf("%%.%dg", MAX_DIGS) -- default '%g' format precision - elsif argval >= power(10, 15) or - argval < 1e-4 then - fmt = sprintf("%%.%de", decs) + fmt = sprintf("%%.%dg", MAX_DIGS) + elsif argval >= MAX_FFMT or + argval < MIN_FFMT then + fmt = sprintf("%%.%de", decs + MAX_DIGS - round) else - fmt = sprintf("%%.%df", decs) + fmt = sprintf("%%.%df", decs + MAX_DIGS - round) end if argtext = sprintf(fmt, arg_list[argn]) + pos = find('e', argtext) + if pos = 0 then + if decs >= 0 then + argtext = argtext[ 1 .. $ - MAX_DIGS + round ] + end if + if argtext[$] = '.' then + argtext = argtext[ 1 .. $ - 1 ] + end if + else + sequence arg1 = argtext[ 1 .. pos - 1 - MAX_DIGS + round ] + if decs >= 0 then + if arg1[$] = '.' then + arg1 = arg1[ 1 .. $ - 1 ] + end if + end if + argtext = arg1 & argtext[ pos .. $ ] + end if -- Remove any leading 0 after e+ while ep != 0 with entry do argtext = remove(argtext, ep+2)
44. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 25, 2015
- 1882 views
Just downloaded and compiled. Only one question remains, should text:format round in the same manner as printf, or is this better left as an option for the programmer?
7 Printf: 1499.46 Fmt A: 1,499.45 Fmt B: 1,499.45 Raw: 1499.459 8 Printf: -267.46 Fmt A: (267.45) Fmt B: -267.45 Raw: -267.456
Something like that? (adding 'r' to decs):
Do we need to take a vote on this new feature, or can someone just roll this into the 4.1 branch?
45. Re: text.e bugs?
- Posted by cargoan Jan 25, 2015
- 1860 views
Sorry, I just do not understand all that well. I don't know english.
It was only a proposal to the question raised irv. If who wants to use it, use it.
(patch for rev. c99132075957)
Greets.
46. Re: text.e bugs?
- Posted by euphoric (admin) Jan 26, 2015
- 1814 views
Do we need to take a vote on this new feature, or can someone just roll this into the 4.1 branch?
I don't even know what this "new feature" is. ELI5?
47. Re: text.e bugs?
- Posted by jimcbrown (admin) Jan 26, 2015
- 1817 views
Do we need to take a vote on this new feature, or can someone just roll this into the 4.1 branch?
I don't even know what this "new feature" is. ELI5?
Adding a new qualifier to the format() routine, 'r', which provides the option to round numbers the same way that printf() does.