Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Negative "not taking" (http://www.velocityreviews.com/forums/t550315-negative-not-taking.html)

mdh 11-08-2007 02:46 PM

Negative "not taking"
 
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


Ben Pfaff 11-08-2007 02:55 PM

Re: Negative "not taking"
 
mdh <mdeh@comcast.net> 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

Lew Pitcher 11-08-2007 03:00 PM

Re: Negative "not taking"
 
On Nov 8, 9:46 am, mdh <m...@comcast.net> 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++;
> }
>
> 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?

> Thanks




mdh 11-08-2007 04:07 PM

Re: Negative "not taking"
 
On Nov 8, 7:00 am, Lew Pitcher <lpitc...@teksavvy.com> wrote:
> On Nov 8, 9:46 am, mdh <m...@comcast.net> 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


Mark Bluemel 11-08-2007 04:32 PM

Re: Negative "not taking"
 
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)

Richard 11-08-2007 05:40 PM

Re: Negative "not taking"
 
Mark Bluemel <mark_bluemel@pobox.com> 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".

CBFalconer 11-08-2007 10:11 PM

Re: Negative "not taking"
 
Ben Pfaff wrote:
> mdh <mdeh@comcast.net> 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>
Try the download section.



--
Posted via a free Usenet account from http://www.teranews.com



All times are GMT. The time now is 06:44 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.