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 |
|
16 | 3,1,2,1,0,1 |
17 |
|
17 | 4,1,3,1,0,1 |
18 |
|
18 | 5,1,4,1,0,1 |
19 |
|
19 | 3,1,2,10,5,1 |
20 |
|
20 | 3,1,2,10,5,1 |
21 |
|
21 | 5,1,4,10,5,1 |
22 |
|
22 | 3,2,2,10,5,0 |
23 |
|
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 |
|
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) |
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 |
34 | item 3) number of digits right from decimal point |
36 | 35 | ||
37 | item |
36 | item 4) exponent base (if not present : 1) |
38 | 37 | ||
39 | item |
38 | item 5) exponent (if not present : 0) |
40 | 39 | ||
41 | item |
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' : |
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 : |
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 |
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 |
|
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 |
|
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; |
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; |
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 |
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 |
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," |
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 |
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 |
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 |
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," |
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," |
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 && ( |
256 | if( ok == 0 && ( sig1 == sig2 + dec1 ) ){ ok = 1; } |
252 | fprintf(stdout," |
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 | } |