Negative "not taking"

M

mdh

Hi All,
I understand atof is in the library, but this is part of my learning
curve.

Given

double atof( char *s){
double d = 0.00;
double sign = 1.00;
double fractprt = 1.00;
/* check for neg number */
if ( *s == '-') {
sign = -1.00;
s++;
}

while (isadigit(*s)){
d=d*10.00 + ('0' - *s++);
}
if (*s == '.'){
s++;
while(isadigit(*s)){
d=d*10.00 + ('0' - *s++);
fractprt *=10;
}
}
return (sign * d / fractprt) ;
}

where s[] equals -36.03, the return I get is 36.03 not -36.03. Is
there a reason why
"return (sign * d / fractprt) ;"

does not seem to multiply by "-1"

Thanks
 
B

Ben Pfaff

mdh said:
d=d*10.00 + ('0' - *s++);

I think you mean *s++ - '0'.
d=d*10.00 + ('0' - *s++);
Ditto.

there a reason why
"return (sign * d / fractprt) ;"

does not seem to multiply by "-1"

Because you get the sign of each digit wrong.
 
L

Lew Pitcher

Hi All,
I understand atof is in the library, but this is part of my learning
curve.

Given

double atof( char *s){
double d = 0.00;
double sign = 1.00;
double fractprt = 1.00;
/* check for neg number */
if ( *s == '-') {
sign = -1.00;
s++;
}

while (isadigit(*s)){
d=d*10.00 + ('0' - *s++);

Consider this: what is the result of ('0' - '3') ?
Hint: it isn't what you think it is.

}
if (*s == '.'){
s++;
while(isadigit(*s)){
d=d*10.00 + ('0' - *s++);

Again, what is the result of ('0' - '3')?
fractprt *=10;
}
}
return (sign * d / fractprt) ;

}

where s[] equals -36.03, the return I get is 36.03 not -36.03. Is
there a reason why
"return (sign * d / fractprt) ;"

does not seem to multiply by "-1"

Think of it this way: what sort of number will give you a positive
value when multiplied by -1?
Thats the sort of number that (d/fractprt) represents.
So, how did you get that sort of number? What part of your function is
suspect? What part(s) produce signed values, where the sign can be
suspect?
 
M

mdh

Think of it this way: what sort of number will give you a positive
value when multiplied by -1?


It was a long day!!! Sometimes I think one gets so caught up in the
"progamming" aspect..esp when learning that one overlooks something
really basic.
thank you
 
M

Mark Bluemel

mdh said:
Hi All,
I understand atof is in the library, but this is part of my learning
curve.

Given

double atof( char *s){ ....
d=d*10.00 + ('0' - *s++); ....

d=d*10.00 + ('0' - *s++);
where s[] equals -36.03, the return I get is 36.03 not -36.03.

Deja Vu all over again. Your name isn't Leonard Shelby by any chance?
(http://tinyurl.com/347zrf)
 
R

Richard

Mark Bluemel said:
mdh said:
Hi All,
I understand atof is in the library, but this is part of my learning
curve.

Given

double atof( char *s){ ...
d=d*10.00 + ('0' - *s++); ...

d=d*10.00 + ('0' - *s++);
where s[] equals -36.03, the return I get is 36.03 not -36.03.

Deja Vu all over again. Your name isn't Leonard Shelby by any chance?
(http://tinyurl.com/347zrf)

99.9999% of questions asked here are deja vu. It's a help group I
thought? my advice to you is to take a break if you are scoffing at the
"usual mistakes".
 

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

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top