Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > sqrtl(), etc. for Cygwin

Reply
Thread Tools

sqrtl(), etc. for Cygwin

 
 
James Dow Allen
Guest
Posts: n/a
 
      11-07-2012
I've been using Cygwin lately, and am largely satisfied.
It has gcc, but lacks sqrtl(), atan2l(), etc.

What's the recommended remedy?
I Googled "source sqrtl" and got to codeforge.com
but only AFTER passing one painful Gotcha test
was I told I'd need another password.

I'd bother with making a free(?) account if I were sure
codeforge.com is the best piece of cheese in the maze,
but it was just a random Google hit and
it seemed wiser to ask the experts here.
(I downloaded Cygwin just a few months ago --
why doesn't its gcc have sqrtl?)

James
 
Reply With Quote
 
 
 
 
Eric Sosman
Guest
Posts: n/a
 
      11-07-2012
On 11/7/2012 1:40 PM, James Dow Allen wrote:
> I've been using Cygwin lately, and am largely satisfied.
> It has gcc, but lacks sqrtl(), atan2l(), etc.
>
> What's the recommended remedy?
> I Googled "source sqrtl" and got to codeforge.com
> but only AFTER passing one painful Gotcha test
> was I told I'd need another password.
>
> I'd bother with making a free(?) account if I were sure
> codeforge.com is the best piece of cheese in the maze,
> but it was just a random Google hit and
> it seemed wiser to ask the experts here.
> (I downloaded Cygwin just a few months ago --
> why doesn't its gcc have sqrtl?)


A web search for "Cygwin long double" suggests that this
lack is a long-standing issue, possibly with roots in licensing
land. Maybe if you grovel through the search results more
thoroughly than I did, you'll find something more helpful ...

--
Eric Sosman
http://www.velocityreviews.com/forums/(E-Mail Removed)d
 
Reply With Quote
 
 
 
 
Keith Thompson
Guest
Posts: n/a
 
      11-07-2012
James Dow Allen <(E-Mail Removed)> writes:
> I've been using Cygwin lately, and am largely satisfied.
> It has gcc, but lacks sqrtl(), atan2l(), etc.
>
> What's the recommended remedy?
> I Googled "source sqrtl" and got to codeforge.com
> but only AFTER passing one painful Gotcha test
> was I told I'd need another password.
>
> I'd bother with making a free(?) account if I were sure
> codeforge.com is the best piece of cheese in the maze,
> but it was just a random Google hit and
> it seemed wiser to ask the experts here.
> (I downloaded Cygwin just a few months ago --
> why doesn't its gcc have sqrtl?)


gcc doesn't have sqrtl() on any system. It's part of the runtime
library, not the compiler. That's not just a quibble; most or all
Linux-based systems use the GNU C library, but Cygwin apparently uses
something else.

I don't know *why* Cygwin's runtime library doesn't provide sqrtl(), but
here's part of the Cygwin man page for sqrt():

PORTABILITY
`sqrt' is ANSI C. `sqrtf' is an extension.

Both sqrtf and sqrtl were added to the ISO C standard in 1999, so the
man page is badly out of date (though apparently no more so than the
runtime library itself).

I know there are problems with the representation of long double; gcc
uses one size, and Microsoft uses another. This causes problems with
the MinGW port of gcc. The Cygwin problem could be related to that.

Of course you can always use sqrt() instead of sqrtl(), at the cost of
some loss of precision (but if you didn't care about that you probably
wouldn't be using long double in the first place).

--
Keith Thompson (The_Other_Keith) (E-Mail Removed) <http://www.ghoti.net/~kst>
Will write code for food.
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
 
Reply With Quote
 
Steven G. Kargl
Guest
Posts: n/a
 
      11-07-2012
On Wed, 07 Nov 2012 12:15:58 -0800, Keith Thompson wrote:

> James Dow Allen <(E-Mail Removed)> writes:
>> I've been using Cygwin lately, and am largely satisfied.
>> It has gcc, but lacks sqrtl(), atan2l(), etc.
>>
>> What's the recommended remedy?
>> I Googled "source sqrtl" and got to codeforge.com
>> but only AFTER passing one painful Gotcha test
>> was I told I'd need another password.
>>
>> I'd bother with making a free(?) account if I were sure
>> codeforge.com is the best piece of cheese in the maze,
>> but it was just a random Google hit and
>> it seemed wiser to ask the experts here.
>> (I downloaded Cygwin just a few months ago --
>> why doesn't its gcc have sqrtl?)

>
>
> Of course you can always use sqrt() instead of sqrtl(), at the cost of
> some loss of precision (but if you didn't care about that you probably
> wouldn't be using long double in the first place).


As long as one is disinteresting in x = inf, NaN, and possibly -0. You
can do

#include <math.h>
long double
foo_sqrtl(long double x)
{
long double r;
r = sqrt((double)x);
return ((r + (x / r))/2);
}

The tricky part is making the above compliant with IEEE 754.

--
steve
 
Reply With Quote
 
glen herrmannsfeldt
Guest
Posts: n/a
 
      11-07-2012
Steven G. Kargl <(E-Mail Removed)> wrote:

(snip)

> As long as one is disinteresting in x = inf, NaN, and possibly -0. You
> can do


> #include <math.h>
> long double
> foo_sqrtl(long double x)
> {
> long double r;
> r = sqrt((double)x);
> return ((r + (x / r))/2);
> }


I might have done two rounds to be sure.

Also, the last one should be

return(x/r+(r-x/r)/2);

if you might be on a non-base2 system, such as
IBM hex floating point or decimal floating point.

> The tricky part is making the above compliant with IEEE 754.


-- glen
 
Reply With Quote
 
ImpalerCore
Guest
Posts: n/a
 
      11-07-2012
On Nov 7, 1:40*pm, James Dow Allen <(E-Mail Removed)> wrote:
> I've been using Cygwin lately, and am largely satisfied.
> It has gcc, but lacks sqrtl(), atan2l(), etc.
>
> What's the recommended remedy?
> I Googled "source sqrtl" and got to codeforge.com
> but only AFTER passing one painful Gotcha test
> was I told I'd need another password.
>
> I'd bother with making a free(?) account if I were sure
> codeforge.com is the best piece of cheese in the maze,
> but it was just a random Google hit and
> it seemed wiser to ask the experts here.
> (I downloaded Cygwin just a few months ago --
> why doesn't its gcc have sqrtl?)


\code
#include <stdio.h>
#define c_sizeof_array(arr) (sizeof (arr) / sizeof ((arr)[0]))

const double tolerance = 0.0000001;
const int max_iterations = 10;

double heron_sqrt( double x );

int main( void )
{
size_t idx;
char tmp_str[40];

double input[] = {
0, 1, 10, 100, 1000, 10000, 0.1, 0.25, -1
};

for ( idx = 0; idx < c_sizeof_array (input); ++idx )
{
snprintf( tmp_str, sizeof (tmp_str), "sqrt( %.2f )", input[idx] );
printf( "%-20s = %.10f\n", tmp_str, heron_sqrt( input[idx] ) );
}

return 0;
}

double heron_sqrt( double x )
{
/*
* The algorithm used to calculate the square root 'x' of number 'S'
* is based on Heron's method.
*
* Let x(0) be an arbitrary positive number.
* Let x(n+1) be the average of x(n) and 'S / x(n)'
* Repeat until the desired accuracy is achieved.
*
* The closer x(0) is to the square root value, the fewer number
* of iterations are needed to converge to the accuracy required.
*
* The global variable 'max_iterations' allows the person to
* limit the accuracy of the result.
*/

double sqrt_x = 0;
double guess = 0;
double error = 0;
int itr = 0;

if ( x == 0.0 ) {
sqrt_x = 0;
}
else
{
sqrt_x = x * 0.5;

do
{
guess = sqrt_x;
sqrt_x = 0.5 * ( guess + x / guess );
error = sqrt_x * sqrt_x - x;
error = error < 0 ? -error : error;
++itr;
} while ( error > tolerance && itr < max_iterations );
}

return sqrt_x;
}
\endcode

There are some issues, like how you want to deal with negative
numbers, but you should be able to patch the algorithm up to create a
workable substitute for 'sqrtl' by replacing the type with 'long
double'.

Best regards,
John D.
 
Reply With Quote
 
Steven G. Kargl
Guest
Posts: n/a
 
      11-07-2012
On Wed, 07 Nov 2012 20:52:33 +0000, glen herrmannsfeldt wrote:

> Steven G. Kargl <(E-Mail Removed)> wrote:
>
> (snip)
>
>> As long as one is disinteresting in x = inf, NaN, and possibly -0. You
>> can do

>
>> #include <math.h>
>> long double
>> foo_sqrtl(long double x)
>> {
>> long double r;
>> r = sqrt((double)x);
>> return ((r + (x / r))/2);
>> }

>
> I might have done two rounds to be sure.


To be sure of what? OP is using cygwin. sqrt()
will be a 53-bit double precision result, and OP
wants long double sqrtl() which is a 64-bit
floating point type. One round would give
106-bit.

> Also, the last one should be
>
> return(x/r+(r-x/r)/2);


I beg to differ.

#include <stdio.h>
#include <math.h>
long double foo_sqrtl(long double x)
{
long double r;
r = sqrt((double)x);
return ((r + (x / r))/2);
}

int main(void)
{
long double x;
x = M_PI / M_LN2;
printf("%.18Le\n%.18Le\n", sqrtl(x), foo_sqrtl(x));
return (0);
}

% cc -o foo foo.c -lm && ./foo
2.128934038862452440e+00
2.128934038862452440e+00

> if you might be on a non-base2 system, such as
> IBM hex floating point or decimal floating point.


OP is using cygwin.

--
steve
 
Reply With Quote
 
James Dow Allen
Guest
Posts: n/a
 
      11-07-2012
Thanks for the responses. I thought of "rolling"
my own sqrtl(), but it seemed too much of a detour
to also do atan2l(), sinl(), etc.

Anyway, my immediate "problem"
http://domino.research.ibm.com/Comm/...ember2012.html
is now handled. By *pondering* a bit, I realized
I only needed a *single* high-precision sqrt(),
so I just used 'bc ; scale = 60' ::whack::

James
 
Reply With Quote
 
glen herrmannsfeldt
Guest
Posts: n/a
 
      11-07-2012
Steven G. Kargl <(E-Mail Removed)> wrote:
>> Steven G. Kargl <(E-Mail Removed)> wrote:


(snip)
>>> #include <math.h>
>>> long double
>>> foo_sqrtl(long double x)
>>> {
>>> long double r;
>>> r = sqrt((double)x);
>>> return ((r + (x / r))/2);
>>> }


>> I might have done two rounds to be sure.


> To be sure of what? OP is using cygwin. sqrt()
> will be a 53-bit double precision result, and OP
> wants long double sqrtl() which is a 64-bit
> floating point type. One round would give
> 106-bit.


I thought that there were some systems with software 128 bit
floating point for long double. Yes that should be fine to
get from 53 to 64 bits.

>> Also, the last one should be


>> return(x/r+(r-x/r)/2);


> I beg to differ.


(snip)

>> if you might be on a non-base2 system, such as
>> IBM hex floating point or decimal floating point.


> OP is using cygwin.


Well, much of GNU libc in general was mentioned in the thread.

There seem to be very few hardware implementations of 128 bit
floating point, other than IBM (back to the 360/85 and continuing
to present day processors) and VAX H-float (microcode on some systems).

Single precision sqrt for S/360:

DE FR0,BUFF GIVE TWO PASSES OF NEWTON-RAPHSON
AU FR0,BUFF ITERATION
HER FR0,FR0
DER FR2,FR0 (X/Y1+Y1)/2 = (Y1-X/Y1)/2+X/Y1 TO GUARD
AU FR0,ROUND LAST DIGIT-. ADD ROUNDING FUDGE
SER FR0,FR2
HER FR0,FR0
AER FR0,FR2

-- glen
 
Reply With Quote
 
Bill Cunningham
Guest
Posts: n/a
 
      11-07-2012
Keith Thompson wrote:

[snip]

> gcc doesn't have sqrtl() on any system. It's part of the runtime
> library, not the compiler. That's not just a quibble; most or all
> Linux-based systems use the GNU C library, but Cygwin apparently uses
> something else.

[...]

Just for my own information and for future reference. Are functions like
this sqrtl and other GNU C function OT here? Isn't this group restricted to
ANSI and ISO C ?

Bill


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
diff between pc-msvc pc-cygwin and svg-GDI - which is fastest vc Firefox 10 02-28-2004 01:05 AM
confirm unsubscribe from cygwin@cygwin.com cygwin-help@cygwin.com Python 0 09-05-2003 04:42 PM
WELCOME to cygwin@cygwin.com cygwin-help@cygwin.com Python 1 09-05-2003 07:46 AM
confirm unsubscribe from cygwin-announce@cygwin.com cygwin-announce-help@cygwin.com Python 0 09-05-2003 01:29 AM
confirm unsubscribe from cygwin@cygwin.com cygwin-help@cygwin.com Python 0 09-04-2003 06:34 PM



Advertisments