Changeset b2ac656


Ignore:
Timestamp:
May 19, 2019, 6:28:27 PM (2 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
arm-eh, cleanup-dtors, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr
Children:
292642a
Parents:
7b149bc
Message:

fix decimal print for floating point

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/iostream.cfa

    r7b149bc rb2ac656  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 13 12:46:45 2019
    13 // Update Count     : 650
     12// Last Modified On : Sun May 19 10:48:27 2019
     13// Update Count     : 654
    1414//
    1515
     
    2323extern size_t strlen (const char *__s) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
    2424#include <float.h>                                                                              // DBL_DIG, LDBL_DIG
    25 #include <math.h>                                                                               // modff, modf, modlf
     25#include <math.h>                                                                               // isfinite
    2626#include <complex.h>                                                                    // creal, cimag
    2727}
     
    154154        } // ?|?
    155155
     156        static void checkDecPt( ostype & os, const char * buf, int len ) {
     157                for ( int i = 0;; i += 1 ) {
     158                        if ( i == len ) { fmt( os, "." ); break; }
     159                        if ( buf[i] == '.' ) break;
     160                } // for
     161        } // checkDecPt
     162
    156163        ostype & ?|?( ostype & os, float f ) {
    157164                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    158                 fmt( os, "%g", f );
    159                 float tempi;
    160                 if ( isfinite( f ) && modff( f, &tempi ) == 0.0F ) fmt( os, "." ); // always print decimal point
     165                char buf[48];
     166                int len = snprintf( buf, 48, "%g", f );
     167                fmt( os, "%s", buf );
     168                if ( isfinite( f ) ) checkDecPt( os, buf, len ); // always print decimal point
    161169                return os;
    162170        } // ?|?
     
    167175        ostype & ?|?( ostype & os, double d ) {
    168176                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    169                 fmt( os, "%.*lg", DBL_DIG, d );
    170                 // fmt( os, "%lg", d );
    171                 double tempi;
    172                 if ( isfinite( d ) && modf( d, &tempi ) == 0.0D ) fmt( os, "." ); // always print decimal point
     177                char buf[48];
     178                int len = snprintf( buf, 48, "%.*lg", DBL_DIG, d );
     179                fmt( os, "%s", buf );
     180                if ( isfinite( d ) ) checkDecPt( os, buf, len ); // always print decimal point
    173181                return os;
    174182        } // ?|?
     
    179187        ostype & ?|?( ostype & os, long double ld ) {
    180188                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    181                 fmt( os, "%.*Lg", LDBL_DIG, ld );
    182                 // fmt( os, "%Lg", ld );
    183                 long double tempi;
    184                 if ( isfinite( ld ) && modfl( ld, &tempi ) == 0.0L ) fmt( os, "." ); // always print decimal point
     189                char buf[48];
     190                int len = snprintf( buf, 48, "%.*Lg", LDBL_DIG, ld );
     191                fmt( os, "%s", buf );
     192                if ( isfinite( ld ) ) checkDecPt( os, buf, len ); // always print decimal point
    185193                return os;
    186194        } // ?|?
     
    191199        ostype & ?|?( ostype & os, float _Complex fc ) {
    192200                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    193                 float temp = crealf( fc ), tempi;
    194                 fmt( os, "%g", temp );
    195                 if ( isfinite( temp ) && modff( temp, &tempi ) == 0.0F ) fmt( os, "." ); // always print decimal point
    196                 temp = cimagf( fc );
    197                 fmt( os, "%+g", temp );
    198                 if ( isfinite( temp ) && modff( temp, &tempi ) == 0.0F ) fmt( os, "." ); // always print decimal point
     201//              os | crealf( fc ) | nonl;
     202                float f = crealf( fc );
     203                char buf[48];
     204                int len = snprintf( buf, 48, "%g", f );
     205                fmt( os, "%s", buf );
     206                if ( isfinite( f ) ) checkDecPt( os, buf, len ); // always print decimal point
     207                f = cimagf( fc );
     208                len = snprintf( buf, 48, "%+g", f );
     209                fmt( os, "%s", buf );
     210                if ( isfinite( f ) ) checkDecPt( os, buf, len ); // always print decimal point
    199211                fmt( os, "i" );
    200212                return os;
     
    206218        ostype & ?|?( ostype & os, double _Complex dc ) {
    207219                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    208                 double temp = creal( dc ), tempi;
    209                 fmt( os, "%.*lg", DBL_DIG, temp );
    210                 if ( isfinite( temp ) && modf( temp, &tempi ) == 0.0D ) fmt( os, "." ); // always print decimal point
    211                 temp = cimag( dc );
    212                 fmt( os, "%+.*lg", DBL_DIG, temp );
    213                 if ( isfinite( temp ) && modf( temp, &tempi ) == 0.0D ) fmt( os, "." ); // always print decimal point
     220//              os | creal( dc ) | nonl;
     221                double d = creal( dc );
     222                char buf[48];
     223                int len = snprintf( buf, 48, "%.*lg", DBL_DIG, d );
     224                fmt( os, "%s", buf );
     225                if ( isfinite( d ) ) checkDecPt( os, buf, len ); // always print decimal point
     226                d = cimag( dc );
     227                len = snprintf( buf, 48, "%+.*lg", DBL_DIG, d );
     228                fmt( os, "%s", buf );
     229                if ( isfinite( d ) ) checkDecPt( os, buf, len ); // always print decimal point
    214230                fmt( os, "i" );
    215                 // fmt( os, "%lg%+lgi", creal( dc ), cimag( dc ) );
    216231                return os;
    217232        } // ?|?
     
    222237        ostype & ?|?( ostype & os, long double _Complex ldc ) {
    223238                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    224                 long double temp = creall( ldc ), tempi;
    225                 fmt( os, "%.*Lg", LDBL_DIG, temp );
    226                 if ( isfinite( temp ) && modfl( temp, &tempi ) == 0.0L ) fmt( os, "." ); // always print decimal point
    227                 temp = cimagl( ldc );
    228                 fmt( os, "%+.*Lg", LDBL_DIG, cimagl( ldc ) );
    229                 if ( isfinite( temp ) && modfl( temp, &tempi ) == 0.0L ) fmt( os, "." ); // always print decimal point
     239//              os | creall( ldc ) || nonl;
     240                long double ld = creall( ldc );
     241                char buf[48];
     242                int len = snprintf( buf, 48, "%.*Lg", LDBL_DIG, ld );
     243                fmt( os, "%s", buf );
     244                if ( isfinite( ld ) ) checkDecPt( os, buf, len ); // always print decimal point
     245                ld = cimagl( ldc );
     246                len = snprintf( buf, 48, "%+.*Lg", LDBL_DIG, ld );
     247                fmt( os, "%s", buf );
     248                if ( isfinite( ld ) ) checkDecPt( os, buf, len ); // always print decimal point
    230249                fmt( os, "i" );
    231                 // fmt( os, "%Lg%+Lgi", creall( ldc ), cimagl( ldc ) );
    232250                return os;
    233251        } // ?|?
  • tests/.expect/loopctrl.txt

    r7b149bc rb2ac656  
    24242.1 3.8 5.5 7.2 8.9
    252510 8 6 4 2 0
    26 12.1 10.4 8.7 7 5.3 3.6
     2612.1 10.4 8.7 7. 5.3 3.6
    2727
    2828N N N N N N N N N N
  • tests/.expect/math3.txt

    r7b149bc rb2ac656  
    99lgamma:1.79176 1.79175946922805 1.791759469228055
    1010lgamma:1.79176 1 1.79175946922805 1 1.791759469228055 1
    11 tgamma:6 6. 6.
     11tgamma:6. 6. 6.
  • tests/.expect/math4.txt

    r7b149bc rb2ac656  
    1818modf:2. 0.3 2. 0.3 2. 0.3
    1919modf:2., 0.3 2., 0.3 2., 0.3
    20 nextafter:2 2 2
    21 nexttoward:2 2 2
     20nextafter:2. 2. 2.
     21nexttoward:2. 2. 2.
    2222scalbn:16. 16. 16.
    2323scalbln:16. 16. 16.
Note: See TracChangeset for help on using the changeset viewer.