Subversion Repositories wimsdev

Rev

Rev 5227 | Rev 5356 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5227 Rev 5283
Line 11... Line 11...
11
Treats a number as string array : no numerical evaluation !
11
Treats a number as string array : no numerical evaluation !
12
(pfffff...)
12
(pfffff...)
13
 
13
 
14
example
14
example
15
!exec sigdigits 1.23 1.230 1.2300 1.23e5 1.23*10^5 1.2300e5 01.23*10^5 1.2.3.4
15
!exec sigdigits 1.23 1.230 1.2300 1.23e5 1.23*10^5 1.2300e5 01.23*10^5 1.2.3.4
16
3,2,1,2,1,0,1
16
3,1,2,1,0,1
17
3,2,1,3,1,0,0
17
4,1,3,1,0,1
18
3,2,1,4,1,0,1
18
5,1,4,1,0,1
19
3,2,1,2,10,5,1
19
3,1,2,10,5,1
20
3,2,1,2,10,5,1
20
3,1,2,10,5,1
21
5,4,1,4,10,5,1
21
5,1,4,10,5,1
22
3,2,2,2,10,5,0
22
3,2,2,10,5,0
23
-1,-1,-1,-1,-1,-1,-1
23
-1,-1,-1,-1,-1,-1
-
 
24
 
24
 
25
 
25
result is
26
result is
26
1 line per input number
27
1 line per input number
27
7 items per line:
28
6 items per line:
28
 
29
 
29
item 1) real number of significant digits in number_x (eg without leading zeros)
30
item 1) real number of significant digits in number_x (eg without leading zeros)
30
 
31
 
31
item 2) real number of "significant decimals" (eg without trailing zero's)
32
item 2) number of digits left from decimal point or if no decimals: total number of digits (length)
32
 
33
 
33
item 3) number of digits left from decimal point (including non-significant)
-
 
34
        or if no decimals: total number of digits (length)
-
 
35
item 4) number of digits right from decimal point (including non-significant)
34
item 3) number of digits right from decimal point
36
 
35
 
37
item 5) exponent base (if not present : 1)
36
item 4) exponent base (if not present : 1)
38
 
37
 
39
item 6) exponent (if not present : 0)
38
item 5) exponent (if not present : 0)
40
 
39
 
41
item 7) indication : is the number correctly written ?  1 or 0  ( 000.1 is not correct...)
40
item 6) indication : is the number correctly written ?  1 or 0  ( 000.1 is not correct...)
42
        scientiffic: [1-9.*] *10^exp : 1.2345*10^5 is OK ... 12.345*10^4 or 0.12345*10^6 is "NOK"
41
        scientiffic: [1-9.*] *10^exp : 1.2345*10^5 is OK ... 12.345*10^4 or 0.12345*10^6 is "NOK"
43
        a*10^b  : 1 <= a <= 9
42
        a*10^b  : 1 <= a <= 9
44
 
43
 
45
remarks:
44
remarks:
46
- exponent: any other base will be tolerated : 4*7^5  base=7 exponent=5 -> 1,0,1,0,7,5,1
45
- exponent: any other base will be tolerated : 4*7^5  base=7 exponent=5 -> 1,0,1,0,7,5,1
47
- if number is 'nonsense' : -1,-1,-1,-1,-1,-1 (1.23.4567  10^1.23.4 ; number will produce NaN in other math software)
46
- if number is 'nonsense' : -1,-1,-1,-1,-1 (1.23.4567  10^1.23.4 ; number will produce NaN in other math software)
48
 
47
 
49
ruleset:
48
ruleset:
50
120.2           : 4 significant digits
49
120.2           : 4 significant digits
51
120.2000        : 4 significant digits
50
120.2000        : 7 significant digits
52
0120.2          : 4 significant digits
51
0120.2          : 4 significant digits
53
scientiffic notation:
52
scientiffic notation:
54
1.202*10^5      : 4 significant digits
53
1.202*10^5      : 4 significant digits
55
1.20200*10^5    : 6 significant digits
54
1.20200*10^5    : 6 significant digits
56
 
55
 
Line 75... Line 74...
75
        exit(0);
74
        exit(0);
76
    }
75
    }
77
    char word[MAX_DIGITS];
76
    char word[MAX_DIGITS];
78
    char *input;
77
    char *input;
79
    char exp[MAX_DIGITS];
78
    char exp[MAX_DIGITS];
80
    int cnt,i,ok,length,zeros,sig1,sig2,found_digit,found_point,dec1,dec2,pow,found_power,found_multiply,points,base_start,base_end;
79
    int cnt,i,ok,length,zeros,sig1,sig2,found_digit,found_point,dec1,pow,found_power,found_multiply,points,base_start,base_end,bracket;
81
    const char *invalid_characters = "\n\"\',!=ABCDFGHIJKLMNOPQRSTUVWXYZabcdfghijklmnopqrstuvwxyz@#$%&()[]{};:~><?/\\|";
80
    const char *invalid_characters = "\n\"\',!=ABCDFGHIJKLMNOPQRSTUVWXYZabcdfghijklmnopqrstuvwxyz@#$%&;:~><?/\\|";
82
    /* Ee +- are allowed : 12.34e+05  12.34e-08  1.234*10^123*/
81
    /* Ee +- are allowed : 12.34e+05  12.34e-08  1.234*10^123*/
83
    cnt = 1;
82
    cnt = 1;
84
    input = argv[cnt];
83
    input = argv[cnt];
85
    while( input != NULL){
84
    while( input != NULL){
86
        if(cnt > MAX_CONV){fprintf(stdout,"error : number of conversions exceeds limit of %d\n",MAX_CONV);return 0;}
85
        if(cnt > MAX_CONV){fprintf(stdout,"error : number of conversions exceeds limit of %d\n",MAX_CONV);return 0;}
Line 102... Line 101...
102
        strncpy( word, input, length );
101
        strncpy( word, input, length );
103
        // reset
102
        // reset
104
        found_digit = 0;
103
        found_digit = 0;
105
        found_point = 0;
104
        found_point = 0;
106
        found_power = 0;
105
        found_power = 0;
-
 
106
        bracket = 0;
107
        found_multiply = 0;
107
        found_multiply = 0;
108
        sig1 = 0; // real significant digits
108
        sig1 = 0; // real significant digits
109
        dec1 = 0; // real "significant decimals" 
-
 
110
        sig2 = 0; // integer part [including leading zeros]
109
        sig2 = 0; // integer part [including leading zeros]
111
        dec2 = 0; // decimal part [including trailing zeros]
110
        dec1 = 0; // decimal part [including trailing zeros]
112
        pow = 0; // exponent
111
        pow = 0; // exponent
113
        zeros = 0; // leading or trailing zeros
112
        zeros = 0; // leading or trailing zeros
114
        points = 0; // number of points in number...
113
        points = 0; // number of points in number...
115
        exp[0]='\0';
114
        exp[0]='\0';
116
        base_start = 0;
115
        base_start = 0;
117
        base_end = 0;
116
        base_end = 0;
118
        ok = 0;
117
        ok = 0;
119
        for( i = length - 1 ; i >= 0 ; i--){ // walk from rightside to left through the 'number'
118
        for( i = length - 1 ; i >= 0 ; i--){ // walk from rightside to left through the 'number'
120
            switch( word[i] ){
119
            switch( word[i] ){
-
 
120
                case '(' : bracket = 1 ;break; //  10^(-4) -> exp= (-4) : remove bracket from exponent.
-
 
121
                case ')' : bracket = 1 ;break;
-
 
122
                case '{' : bracket = 1 ;break;
-
 
123
                case '}' : bracket = 1 ;break;
-
 
124
                case '[' : bracket = 1 ;break;
-
 
125
                case ']' : bracket = 1 ;break;
121
                case '^' : base_start = i;found_power++;break;
126
                case '^' : base_start = i;found_power++;break;
122
                case '*' :
127
                case '*' :
123
                    found_multiply++;
128
                    found_multiply++;
124
                    if(found_power == 1){
129
                    if(found_power == 1){
125
                        base_end = i;
130
                        base_end = i;
126
                        if(found_point == 1){points--;found_point = 0;}  // point in exponent... 10^4.5 (hmmm)
131
                        if(found_point == 1){points--;found_point = 0;}  // point in exponent... 10^4.5 (hmmm)
127
                        pow = length - i;
132
                        pow = length - i;
128
                        sig1 = 0; // reset counting significant digits and all other stuff
133
                        sig1 = 0; // reset counting significant digits and all other stuff
129
                        dec1 = 0;
-
 
130
                        sig2 = 0;
134
                        sig2 = 0;
131
                        dec2 = 0;
135
                        dec1 = 0;
132
                        found_digit = 0;
136
                        found_digit = 0;
133
                        zeros = 0;
137
                        zeros = 0;
134
                    }
138
                    }
135
                    break;
139
                    break;
136
                case 'e' : if(found_point == 1){points--;found_point = 0;} found_power++;pow = length - i;sig1 = 0;dec1 = 0;sig2 = 0;dec2 = 0;found_digit = 0;zeros = 0;found_multiply++;break;
140
                case 'e' : if(found_point == 1){points--;found_point = 0;} found_power++;pow = length - i;sig1 = 0;sig2 = 0;dec1 = 0;found_digit = 0;zeros = 0;found_multiply++;break;
137
                case 'E' : if(found_point == 1){points--;found_point = 0;} found_power++;pow = length - i;sig1 = 0;dec1 = 0;sig2 = 0;dec2 = 0;found_digit = 0;zeros = 0;found_multiply++;break;
141
                case 'E' : if(found_point == 1){points--;found_point = 0;} found_power++;pow = length - i;sig1 = 0;sig2 = 0;dec1 = 0;found_digit = 0;zeros = 0;found_multiply++;break;
138
                case '0' :
142
                case '0' :
139
                    if(i == 0){//last char 
143
                    if(i == 0){//last char 
140
                        sig1 = sig1 - zeros;
144
                        sig1 = sig1 - zeros;
141
                        sig2++;
145
                        sig2++;
142
                        if(found_power == 1){zeros++;}
146
                        if(found_power == 1){zeros++;}
143
                    }
147
                    }
144
                    else
148
                    else
145
                    {              
149
                    {              
146
                        // 1.000*10^5 -> 4 sig
150
                        // 1.000*10^5 -> 4 sig
147
                        if( found_point == 0 && found_power == 1){
151
                        if( found_point == 0 ){
148
                            sig1++;
152
                            sig1++;
149
                        }
153
                        }
150
                        else
154
                        else
151
                        {
155
                        {
-
 
156
                            sig2++;
152
                            if( found_digit == 1 ){ sig1++; }
157
                            if( found_digit == 1 ){ sig1++; }
153
                        }
158
                        }
154
                        if( found_point == 1 ){ sig2++; }
-
 
155
                        zeros++;
159
                        zeros++;
156
                    }
160
                    }
157
                    break;
161
                    break;
158
                case '.' : dec1 = sig1; dec2 = length - i - pow - 1;found_point = 1;points++; break;
162
                case '.' : dec1 = length - i - pow - 1;found_point = 1;points++; break;
159
                case '1' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
163
                case '1' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
160
                case '2' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
164
                case '2' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
161
                case '3' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
165
                case '3' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
162
                case '4' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
166
                case '4' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
163
                case '5' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
167
                case '5' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
Line 165... Line 169...
165
                case '7' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
169
                case '7' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
166
                case '8' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
170
                case '8' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
167
                case '9' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
171
                case '9' : sig1++;if(found_point == 1){sig2++;} found_digit = 1;zeros = 0; break;
168
                default :  break;
172
                default :  break;
169
            }
173
            }
170
            if(found_power == 0){ append(exp,word[i]); } // maybe a power was used ?
174
            if(found_power == 0 && bracket == 0){ append(exp,word[i]); } // maybe a power was used ?
-
 
175
            bracket = 0;
171
        }
176
        }
172
       
177
       
173
        if( found_power > 1 || found_multiply > 1){ // 2*2 10^5^7
178
        if( found_power > 1 || found_multiply > 1){ // 2*2 10^5^7
174
            fprintf(stdout,"error \n");
179
            fprintf(stdout,"error \n");
175
            return 0;
180
            return 0;
176
        }
181
        }
177
 
182
 
178
        if( points > 1){ // "nonsense" number 1.23.45  or 1.23*10^1.5
183
        if( points > 1){ // "nonsense" number 1.23.45  or 1.23*10^1.5
179
            fprintf(stdout,"-1,-1,-1,-1,-1,-1,-1\n");
184
            fprintf(stdout,"-1,-1,-1,-1,-1,-1\n");
180
        }
185
        }
181
        else
186
        else
182
        {
187
        {
183
            // extra check for handling "special cases" 
188
            // extra check for handling "special cases" 
184
            if(found_point == 0 && found_power == 0){ sig2 = length;ok = 1; }   // just a number 12345
189
            if(found_point == 0 && found_power == 0){ sig2 = length;ok = 1; }   // just a number 12345
185
            else
190
            else
186
            if(found_point == 0 && found_multiply == 0 && found_power == 1){ sig1 = 0; dec1 = 0; sig2 = 0 ; dec2 = 0; } // 10^5
191
            if(found_point == 0 && found_multiply == 0 && found_power == 1){ sig1 = 0; sig2 = 0 ; dec1 = 0; }   // 10^5
187
            else
192
            else
188
            if(found_point == 1 && found_multiply == 0 && found_power == 1){ sig1 = 0; dec1 = 0; sig2 = 0 ; dec2 = 0; } // 10^5.1
193
            if(found_point == 1 && found_multiply == 0 && found_power == 1){ sig1 = 0; sig2 = 0 ; dec1 = 0; }   // 10^5.1
189
            else
194
            else
190
            if(found_point == 0 && found_multiply == 1 && found_power == 1){ dec1 = 0; dec2 = 0; sig2 = length - zeros - pow;}  // 3*10^5
195
            if(found_point == 0 && found_multiply == 1 && found_power == 1){ dec1 = 0; sig2 = length - zeros - pow;}    // 3*10^5
191
           
196
           
192
            if( found_power == 1){
197
            if( found_power == 1){
193
                // find out if scientiffic number is correctly written ; ok=0 -> ok=1 
198
                // find out if scientiffic number is correctly written ; ok=0 -> ok=1 
194
                // rule [1-9].[0-9]* x10^exp
199
                // rule [1-9].[0-9]* x10^exp
195
                if( word[0] != '0' && word[1] == '.' ){ //  0.120*10^5 => 1.20*10^4
200
                if( word[0] != '0' && word[1] == '.' ){ //  0.120*10^5 => 1.20*10^4
Line 236... Line 241...
236
                    for(i = s ; i < base_start ; i++){
241
                    for(i = s ; i < base_start ; i++){
237
                        c_base[c] = word[i];
242
                        c_base[c] = word[i];
238
                        c++;
243
                        c++;
239
                    }
244
                    }
240
                    c_base[c] = '\0';
245
                    c_base[c] = '\0';
241
                    fprintf(stdout,"%d,%d,%d,%d,%s,%s,%d\n",sig1,dec1,sig2,dec2,c_base,exponent,ok);
246
                    fprintf(stdout,"%d,%d,%d,%s,%s,%d\n",sig1,sig2,dec1,c_base,exponent,ok);
242
                }
247
                }
243
                else
248
                else
244
                { // base = 10 : used 4e+5
249
                { // base = 10 : used 4e+5
245
                    fprintf(stdout,"%d,%d,%d,%d,10,%s,%d\n",sig1,dec1,sig2,dec2,exponent,ok);
250
                    fprintf(stdout,"%d,%d,%d,10,%s,%d\n",sig1,sig2,dec1,exponent,ok);
246
                }
251
                }
247
            }
252
            }
248
            else
253
            else
249
            {   // no exponent : base = '1' exponent = '0'
254
            {   // no exponent : base = '1' exponent = '0'
250
                //several possible correct way of writing...
255
                //several possible correct way of writing...
251
                if( ok == 0 && ( ( sig1 == sig2 + dec2 ) || ( sig1 + dec1 == sig2 + dec2 ) || ( dec1 == dec2 && sig2 == 1 ) )){ ok  = 1; }
256
                if( ok == 0 && (  sig1 == sig2 + dec1 ) ){ ok  = 1; }
252
                fprintf(stdout,"%d,%d,%d,%d,1,0,%d\n",sig1,dec1,sig2,dec2,ok);
257
                fprintf(stdout,"%d,%d,%d,1,0,%d\n",sig1,sig2,dec1,ok);
253
            }
258
            }
254
        }
259
        }
255
        cnt++;
260
        cnt++;
256
        input = argv[cnt];
261
        input = argv[cnt];
257
    }
262
    }