X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f Received-SPF: none (free.tvtel.pt: domain of cosmos AT tvtel DOT pt does not designate permitted sender hosts) Message-ID: <00e101c561d5$7356bdc0$b40a6652@rui> From: "cosmos" To: References: <1116997063 DOT 905915 DOT 71670 AT z14g2000cwz DOT googlegroups DOT com> <3E3le.7676$M36 DOT 381 AT newsread1 DOT news DOT atl DOT earthlink DOT net> <00bd01c5615f$ce6a7d80$b40a6652 AT rui> <00e301c56166$b7edca60$b40a6652 AT rui> <260f63050525135825d3128c AT mail DOT gmail DOT com> Subject: Re: to check given no. is power of 2 ( formatted text...) Date: Thu, 26 May 2005 10:29:38 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 X-Virus-Scanned: ClamAV version 0.84, clamav-milter version 0.84e on free.tvtel.pt X-Virus-Status: Clean Reply-To: djgpp AT delorie DOT com Dear Larry, I was thinking in what you said...actually, C/C++ is not my strong ( even if I've already made some major complicated calculations ). You might have a point. But, just for the fun, I made a little routine in basic ( knowned as the worst language to work with double precision numbers ). CLS ON ERROR GOTO 100 n = 0 REM Doubles DEFDBL F, V REM Long integer DEFLNG I DO UNTIL F <> 0 n = n + 1 I = 2 ^ n V = LOG(I) / LOG(2) F = V - INT(V) PRINT n, I, F LOOP END 100 RESUME 101 101 PRINT "END CAUSED BY ERROR" END it stopped at n=30, 2^30, or 1073741824 - not because the fraction part wasn't zero but because the variable I ( Long ) was overflow. I've deal with precision numbers in astronomy applications. They are the worst. By bad luck, the linux servers only accept compiled C, and I hate Windows hosting. Also, I don't know if our friend wants numbers over 2^30. Still, I have much to learn in C. And, thinking it over, you might be right. Cheers, Rui Fernandes ----- Original Message ----- From: "Larry Ziegenbein" To: Sent: Wednesday, May 25, 2005 9:58 PM Subject: Re: to check given no. is power of 2 ( formatted text...) > Hi Rui, > > I think when you treat a double as an int, for example comparing > fracpart to 0 in this line -- > > if (fracpart == 0) return 1; > > you will most often be disappointed. Doubles will generally have a > bit of imprecision in the last few placeholders and throw you off > unless you plan for it in advance. Give it a try and step through > this code so you understand. ;-) You could round the result to the > appropriate number of digits and recast it as an int before the > compare maybe to make it work, but the other solutions posted are > pretty nice looking to me!! > > Anyway, this code generally won't work, and it is dangerous to do > things like this, at least for newbies like me, I avoid this like the > plague. But I screw up in other places to make up for it. > > happy hacking, > Larry > > > On 5/25/05, cosmos wrote: > > > > ----- Original Message ----- > > From: "cosmos" > > To: > > Sent: Wednesday, May 25, 2005 8:27 PM > > Subject: Re: to check given no. is power of 2 > > > > > > > Hi, > > > > > > Mathematically, a given number "N" is a power of 2 if "log(N) / log(2)" is > > > an integer, right? So: > > > > > > #include > > > #include > > > double param, fractpart, intpart; > > > > > > param = log(N) / log(2); > > > fractpart = modf (param , &intpart); > > > if (fracpart == 0) return 1; else return 0; > > > > > > Regards, > > > > Rui Fernandes > > > > > > > > > ----- Original Message ----- > > > From: "Martin Ambuhl" > > > Newsgroups: comp.os.msdos.djgpp > > > To: > > > Sent: Wednesday, May 25, 2005 7:39 PM > > > Subject: Re: to check given no. is power of 2 > > > > > > > > > > Gerd Termathe wrote: > > > > > "aveo" schrieb im Newsbeitrag > > > > > news:1116997063 DOT 905915 DOT 71670 AT z14g2000cwz DOT googlegroups DOT com... > > > > > > > > > >>hi all > > > > >>i need a C code that checks given no. is power of 2 or not without > > > > >>checking any condition. > > > > >> > > > > > > > > > > > > > > > int is_power_of_2 (int N) > > > > > { > > > > > if ( N!=0 && (N&(N-1))==0 ) return 1; else return 0; > > > > > } > > > > > > > > Why an if ... else? > > > > Why use uppercase for non-macros? > > > > Why use signed integers? > > > > > > > > inline unsigned is_power_of_2 (unsigned n) > > > > { > > > > return (n && !(n&(n-1))); > > > > } > > > > > > > > > > > > > > > >