char -> int

E

ern

Anybody know a quick and dirty function for going from "547.6458679" to
the integer version 548 ?

i.e.

int returnIntegerEquivalent(char * charNum){
int intNum;
//Do some stuff...
return intNum;
}

I was using the Windows stuff before (ie _gcvt() and atof()).
Thanks,
 
J

John Bode

ern said:
Anybody know a quick and dirty function for going from "547.6458679" to
the integer version 548 ?

i.e.

#include <stdlib.h>
#include said:
int returnIntegerEquivalent(char * charNum){
int intNum;

double dNum = strtod(charNum, NULL);
if (ceil(dNum) - dNum > 0.5)
intNum = (int) floor(dNum);
else
intNum = (int) ceil(dNum);
 
A

Alexei A. Frounze

ern said:
Anybody know a quick and dirty function for going from "547.6458679" to
the integer version 548 ?

rounding to +infinity is done with ceil()
examples:
547.6 -> 548
547.4 -> 548
547 -> 547
-547.4 -> -547
-547.6 -> -547

rounding to -infinity is done with floor()
examples:
547.6 -> 547
547.4 -> 547
547 -> 547
-547.4 -> -548
-547.6 -> -548

truncating the fractional part is done by converting/casting to integer
type:
547.6 -> 547
547.4 -> 547
547 -> 547
-547.4 -> -547
-547.6 -> -547

rounding to the nearest integer can be achieved from truncating if 0.5 is
first [added to]/[subtracted from] the number being rounded:
547.6+0.5 -> 548
547.4+0.5 -> 547
547+0.5 -> 547
-547.4-0.5 -> -547
-547.6-0.5 -> -548

Something like that,
Alex
 
T

tedu

ern said:
Anybody know a quick and dirty function for going from "547.6458679" to
the integer version 548 ?

i.e.

int returnIntegerEquivalent(char * charNum){
int intNum;
//Do some stuff...

intNum = atof(charNum) + 0.5;
 
C

Charles M. Reinke

ern said:
Anybody know a quick and dirty function for going from "547.6458679" to
the integer version 548 ?

i.e.

int returnIntegerEquivalent(char * charNum){
int intNum;
//Do some stuff...
return intNum;
}

I was using the Windows stuff before (ie _gcvt() and atof()).
Thanks,

I'm not sure how "dirty" (or quick, for that matter) it is, but you'll
probably want to look into the strtol() function:
http://ccs.ucsd.edu/c/stdlib.html#strtol. More intuitively, you could
convert the string to a (double) using the related strtod() function
(http://ccs.ucsd.edu/c/stdlib.html#strtod), and then cast the result to an
(int), especially since you have to do that anyway with strtol() unless you
declare "intNUM" of type (long).

-Charles
 
M

Martin Ambuhl

ern said:
Anybody know a quick and dirty function for going from "547.6458679" to
the integer version 548 ?

i.e.

int returnIntegerEquivalent(char * charNum){
int intNum;
//Do some stuff...
return intNum;
}

I was using the Windows stuff before (ie _gcvt() and atof()).
Thanks,
#include <errno.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

/* making no assumption that s represents an value in the range of an
int, but accepting that some initial portion is supposed to represent
a legal double value. 0 is returned (with errno set) if a problem occurs
with the string to float conversion. */

double floatingstring2floatingint(const char *s)
{
double x, fp, ip;
int sign = 1;
errno = 0;
x = strtod(s, 0);
if (errno)
return 0;
if (x < 0) {
sign = -1;
x = -x;
}
fp = modf(x, &ip);
if (fp >= .5)
ip++;
return sign * ip;
}

int main(void)
{
char s[] = "547.6458679";
char t[] = "-547.6458679";
printf("The initial string (s) is \"%s\n", s);
printf("floatingstring2floatingint(s) returns %g\n",
floatingstring2floatingint(s));
printf("The initial string (t) is \"%s\n", t);
printf("floatingstring2floatingint(t) returns %g\n",
floatingstring2floatingint(t));
return 0;
}



The initial string (s) is "547.6458679
floatingstring2floatingint(s) returns 548
The initial string (t) is "-547.6458679
floatingstring2floatingint(t) returns -548
 
C

Charles M. Reinke

Charles M. Reinke said:
I'm not sure how "dirty" (or quick, for that matter) it is, but you'll
probably want to look into the strtol() function:
http://ccs.ucsd.edu/c/stdlib.html#strtol. More intuitively, you could
convert the string to a (double) using the related strtod() function
(http://ccs.ucsd.edu/c/stdlib.html#strtod), and then cast the result to an
(int), especially since you have to do that anyway with strtol() unless you
declare "intNUM" of type (long).

-Charles

After sending my inital response I realized that the proper solution could
be a little complicated, hence the following code:
holomask>cat h.c
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int returnIntegerEquivalent(char *charNum) {
int intNum;
char *str_test;

intNum = floor(strtod(charNum, &str_test)+0.5);
if(charNum==str_test)
printf("Error converting string.\n");

return intNum;
} /* returnIntegerEquivalent */

int main(void) {
int intNum;
char charNum[]="547.6458679";

intNum = returnIntegerEquivalent(charNum);
printf("test string: %s\ninteger value: %d\n", charNum, intNum);

return 0;
} /* main */
holomask>gcc -Wall -ansi -pedantic -lm -o h.exe h.c
holomask>h.exe
test string: 547.6458679
integer value: 548
 
A

A. Sinan Unur

intNum = floor(strtod(charNum, &str_test)+0.5);
if(charNum==str_test)
printf("Error converting string.\n");

In cases like this, it might be more useful to test that the string
contained nothing other than a valid number. For example, the test above
would not raise an error if

"547.64.58679"

was passed to it.

Thus, a test like

if( *str_test ) {
/* error */
}

might be more useful in practice.

Sinan
 
C

Charles M. Reinke

A. Sinan Unur said:
In cases like this, it might be more useful to test that the string
contained nothing other than a valid number. For example, the test above
would not raise an error if

"547.64.58679"

was passed to it.
Agreed.

Thus, a test like

if( *str_test ) {
/* error */
}

might be more useful in practice.

Sinan

Point well taken. ;-)

-Charles
 
B

Baxter

Yep. That's the quick and dirty method.

What I find interesting is that in none of the other examples in this thread
to they address the additional rounding rules if the value is .5 - as in
"547.500". As I recall, round up on even, down on odd.
 
J

Jack Klein

intNum = atof(charNum) + 0.5;

No, very bad! Seriously undefined behavior possible, for two reasons.

First the ato... functions are all old hacks that should never be
used. They produce undefined behavior if the converted result is
outside the range of the destination type. That's why the C standard
added the strto... functions that have defined behavior with any input
other than a null pointer.

Second, even if the value doesn't overflow and atof() returns a valid
double, the integer part of that double might be outside the range
that can be represented in a signed int. Boom, undefined behavior.

Finally there is the minor point that this does 5/4 rounding to a
greater magnitude for positive numbers but to a lesser magnitude for
negative ones.
 
A

Alexei A. Frounze

Baxter said:
What I find interesting is that in none of the other examples in this thread
to they address the additional rounding rules if the value is .5 - as in
"547.500". As I recall, round up on even, down on odd.

Not many know or simply remember (if ever learned) this Gauss
correction-on-rounding rule.
The rule is to round a number having the fractional equal to 0.5 to the
nearest even integer.
Examples:
2.5 -> 2 (not 3)
3.5 -> 4
-3.5 -> -4
-2.5 -> -2 (not -3)
It's perfectly OK to change this to the opposite (rount to the nearest odd
integer):
2.5 -> 3
3.5 -> 3 (not 4)
-3.5 -> -3 (not -4)
-2.5 -> -3
The absolute value of the rounding error is the same in both cases (0.5),
but if this additional correction is enforced, rounding errors of such
numbers tend to compensate each other on summation/subtraction.

Alex
 
N

Netocrat

]
[T]his Gauss correction-on-rounding rule... is to round a number having
the fractional equal to 0.5 to the nearest even integer.
[R]ounding errors of such numbers tend to compensate each other on
summation/subtraction.

Beauty in effective simplicity.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top