# Negative "not taking"

Discussion in 'C Programming' started by mdh, Nov 8, 2007.

1. ### mdhGuest

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++;
}

d=d*10.00 + ('0' - *s++);
}
if (*s == '.'){
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

mdh, Nov 8, 2007

2. ### Ben PfaffGuest

mdh <> writes:

> 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.
--
Ben Pfaff
http://benpfaff.org

Ben Pfaff, Nov 8, 2007

3. ### Lew PitcherGuest

On Nov 8, 9:46 am, mdh <> wrote:
> 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++;
> }
>
> 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++;
> 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?

> Thanks

Lew Pitcher, Nov 8, 2007
4. ### mdhGuest

On Nov 8, 7:00 am, Lew Pitcher <> wrote:
> On Nov 8, 9:46 am, mdh <> wrote:
>
> Think of it this way: what sort of number will give you a positive
> value when multiplied by -1?
>
>
> > Thanks

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

mdh, Nov 8, 2007
5. ### Mark BluemelGuest

mdh wrote:
> 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)

Mark Bluemel, Nov 8, 2007
6. ### RichardGuest

Mark Bluemel <> writes:

> mdh wrote:
>> 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".

Richard, Nov 8, 2007
7. ### CBFalconerGuest

Ben Pfaff wrote:
> mdh <> writes:
>
>> d=d*10.00 + ('0' - *s++);

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

>
> Ditto.

How about "- ('0' - *s++)" in both expressions?

--
Chuck F (cbfalconer at maineline dot net)
<http://cbfalconer.home.att.net>