NOTE: **use Perl;** is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

Ovid

(email not shown publicly)

http://publius-ovidius.livejournal.com/

**AOL IM:** ovidperl (**Add Buddy, Send Message**)

(email not shown publicly)

http://publius-ovidius.livejournal.com/

Stuff with the Perl Foundation. A couple of patches in the Perl core. A few CPAN modules. That about sums it up.

Friday February 20, 2009

05:08 PM

I suppose I should ask this in a Ruby forum, but since I'm so used to slinging other languages here

To find the N*th* root of number is simple: raise the number to the reciprocal of N. For example, to find the cube root of 8:

$ perl -le 'print 8 ** (1/3)'

2

But you can't quite do that in Ruby:

$ ruby -e 'puts 8 ** (1/3)'

1

But this is a "feature", not a bug (*cough*) because the 1/3 is considered integer math and evaluates to 0, leaving you with 8 to the 0*th* power. Anything raised to the power of 0 results in 1. So far so good.

So to force floating point math, use a floating point number:

$ ruby -e 'puts 8 ** (1/3.0)'

2

And all is good. Except

Let's take the square root of 1:

$ ruby -e 'puts 1 ** (1/2.0)'

1.0

Now let's take the square root of -1:

$ ruby -e 'puts -1 ** (1/2.0)'

-1.0

Huh? The square root of -1 is imaginary (or *i*, if you want to be specific). What's going on here?

Yes, I know about `Math.sqrt`, which at least thoughtfully throws an exception rather than give an incorrect value:

$ ruby -e 'puts Math.sqrt(-1)'

-e:1:in `sqrt': Numerical argument out of domain - sqrt (Errno::EDOM)

from -e:1

Stories, comments, journals, and other submissions on use Perl; are Copyright 1998-2006, their respective owners.

## Precedence (Score:2)

simon@alibi ~ % ruby -e 'puts -1 ** 0.5'

-1.0

simon@alibi ~ % ruby -e 'puts ( (-1) ** 0.5)'

NaN

## Perl is better? (Score:1)

-1

Am I missing something here?

--fREW

http://blog.afoolishmanifesto.com

## Re: (Score:1)

indeed you are:

C:\Users\burak>perl -MO=Deparse -le "print (-1) ** (1/2)"

BEGIN { $/ = "\n"; $\ = "\n"; }

print(-1) ** 0.5;

-e syntax OK

try this instead:

print( (-1) ** (1/2) )

## Re: (Score:1)

--fREW

http://blog.afoolishmanifesto.com

## Re: (Score:1)

`$ ruby -e 'puts ((-1) ** (1/2.0))'`

NaN

## Re: (Score:2)