### Author Topic: pow(-2,2)=-4  (Read 3915 times)

0 Members and 1 Guest are viewing this topic.

#### Eros Olmi

• Newbie
• Posts: 16
##### pow(-2,2)=-4
« on: October 20, 2013, 11:16:10 AM »

Hi Charles,

Robbek user at thinBasic forum is using embedded Oxygen for some interesting math.
It seems pow(-2, 2) gives -4

Can it be?

This is the thinBasic script ebmedding Oxygen showing the problem.
Code: [Select]
`  Uses "oxygen"  Dim pp As Single  O2_ASM "          Dim pp At #pp As Single          pp = Pow(-2,2)          "  O2_EXEC  MsgBox 0, pp`

#### kryton9

• Hero Member
• Posts: 721
##### Re: pow(-2,2)=-4
« Reply #1 on: October 20, 2013, 12:00:17 PM »
Hi Eros,

I did a simple test and it works fine here.
See attachments.

.

#### Eros Olmi

• Newbie
• Posts: 16
##### Re: pow(-2,2)=-4
« Reply #2 on: October 20, 2013, 12:09:33 PM »
I think I have an old Oxygen version in thinBasic.
thinBasic has a special version of Oxygen so I need to wait Charles reply.

Thanks Ken

#### Charles Pegge

• Author
• Posts: 3282
##### Re: pow(-2,2)=-4
« Reply #3 on: October 20, 2013, 12:30:02 PM »
Thanks Eros,

I've been sitting on the new thinBasic_Oxygen module for quite a while. I think it is ready to include with thinBasic. It is a very small module that embeds the generic Oxygen.dll.

I've included a few key examples.

#### Eros Olmi

• Newbie
• Posts: 16
##### Re: pow(-2,2)=-4
« Reply #4 on: October 20, 2013, 12:46:45 PM »
Hi Charles,

I'm trying this version and it shows a message box titled "O2H" with message "lib\oxygen.dll"
I suppose because you hard coded "\lib\" directory instead it should be loaded from the same directory where "thinBasic_Oxygen.dll" wrapper DLL is loaded from.

Do you think it can be changed?
Correct path is passed by thinCore.dll to thinBasic_Oxygen.dll in LoadLocalSymbols function as sPath param

Thanks a lot
Eros

#### kryton9

• Hero Member
• Posts: 721
##### Re: pow(-2,2)=-4
« Reply #5 on: October 20, 2013, 01:30:13 PM »
I think I have an old Oxygen version in thinBasic.
thinBasic has a special version of Oxygen so I need to wait Charles reply.

Thanks Ken

That makes sense should of thought of that. I see Charles replied so will leave it in the 2 masters hands.

#### Charles Pegge

• Author
• Posts: 3282
##### Re: pow(-2,2)=-4
« Reply #6 on: October 20, 2013, 01:39:30 PM »
It should work when Oxygen.dll is placed in lib, with the new thinBasic_Oxygen.dll.

This implies that users who use both OxygenBasic and thinBasic as separate systems will have the oxygen.dll in 2 places.

I was able to produce the error you saw by removing oxygen.dll from lib
« Last Edit: October 20, 2013, 01:49:20 PM by Charles Pegge »

#### Eros Olmi

• Newbie
• Posts: 16
##### Re: pow(-2,2)=-4
« Reply #7 on: October 20, 2013, 08:56:56 PM »
For the way thinBasic has been built, having a path hard coded is not good.
DLL must not have any paths hard coded, otherwise it would be a nightmare.

For example:
• during development the modules is into a directory
• when thinBasic is released to users, modules are into another directory
• when a script is embedded into a bundled exe, modules are into another directory dynamically decided at run-time
That's the reason why thinBasic pass to each thinBasic modules the path from which they have been loaded: in order to be aware of it and do the correct assumptions.

Do you think to have a chance to change current behave?

Otherwise the only way I have to make it working is that I will make another wrapper instead of your thinBasic_Oxygen.dll and dynamically load Oxygen.dll at run-time from the same directory of the wrapper.

Ciao
Eros

#### Charles Pegge

• Author
• Posts: 3282
##### Re: pow(-2,2)=-4
« Reply #8 on: October 21, 2013, 12:19:06 AM »

#### John

• Hero Member
• Posts: 2803
##### Re: pow(-2,2)=-4
« Reply #9 on: October 21, 2013, 02:07:37 AM »
Quote from: Eros
Hi Charles,

Robbek user at thinBasic forum is using embedded Oxygen for some interesting math.
It seems pow(-2, 2) gives -4

Can it be?

Code: [Select]
`PRINT -2^2,"\n"`
jrs@laptop:~/sb22\$ scriba testpow.sb
4
jrs@laptop:~/sb22\$

#### Eros Olmi

• Newbie
• Posts: 16
##### Re: pow(-2,2)=-4
« Reply #10 on: October 21, 2013, 10:56:18 AM »
Charles,

thanks a lot!!
It works great now.

Ciao
Eros

#### John

• Hero Member
• Posts: 2803
##### Re: pow(-2,2)=-4
« Reply #11 on: October 21, 2013, 11:08:09 AM »
Eros & Charles,

I'm really happy to see your relationship (O2 & TB) being renewed and enhanced. I think a better job needs to be done to help users understand and use O2 with thinBasic. I see a real opportunity for both TB and O2 as PB struggles with relevance. ThinBasic is PowerBASIC done right and O2 is the hand crafted ASM it lacks. You guys make a great team that can't be beat. Please don't lose sight of that again.

John

#### John

• Hero Member
• Posts: 2803
##### Re: pow(-2,2)=-4
« Reply #12 on: October 21, 2013, 03:23:36 PM »
Quote
Thanks Charles, Eros .. it gives the correct positive value now.

Amazing program Eros, ! -- finally I ran it , very impressing those real-time inter-actions.

This all made me curious about that pow(x,y) function on several programming languages.
I noticed that when y is not an integer, both Thinbasic and the GFA compiler use the closest integer for y to get a real number result in case x < 0. (in case x is a negative number and y contains a fraction the result is a complex number )

In this case both Freebasic and the LISP give respec. QNAN and NAN -- something as "not an available number" iirc.

( .. mm , that NAN could be dangerous incase one gets 1.999999 that sould be 2 or so .... )

best Rob

Code: [Select]
`PRINT FORMAT("%3.6f",-2^.2),"\n"`
jrs@laptop:~/bas2nim/sb2n\$ scriba testpow.sb
-1.148698
jrs@laptop:~/bas2nim/sb2n\$

Code: [Select]
`<?phpecho pow(-2, .2);?>`
jrs@laptop:~/bas2nim/b2n_py\$ php testpow.php
NAN
jrs@laptop:~/bas2nim/b2n_py\$

Code: [Select]
`import mathprint math.pow(-2, .2)`
jrs@laptop:~/bas2nim/b2n_py\$ python testpow.py
Traceback (most recent call last):
File "testpow.py", line 3, in <module>
print math.pow(-2, .2)
ValueError: math domain error
jrs@laptop:~/bas2nim/b2n_py\$

Code: [Select]
`#include <math.h>main(){double a = -2.0;double b = 0.2;printf("%3.6f\n", pow(a,b));}`
jrs@laptop:~/bas2nim/sb2n\$ ./testpow
-nan
jrs@laptop:~/bas2nim/sb2n\$
« Last Edit: October 21, 2013, 04:36:05 PM by John »

#### Charles Pegge

• Author
• Posts: 3282
##### Re: pow(-2,2)=-4
« Reply #13 on: October 22, 2013, 04:42:39 AM »
Hi John,

Yes, there were too many examples in the earlier releases of thinBasic_Oxygen, many of which became outdated. I've cut them right down to a few key examples. I think the need for it will still be quite specialised though.

Eros is always very good to work with. Time is the only obstacle.

#### Charles Pegge

• Author
• Posts: 3282
##### Re: pow(-2,2)=-4
« Reply #14 on: October 22, 2013, 08:22:23 AM »
When dealing with fractional powers of negative numbers, you need complex numbers. A simple number cannot represent the result.

These can be solved using deMoivre's theorem, relating  the power to an angle of rotation in the complex plane

This seems to work:
Code: [Select]
`  /*  http://www.suitcaseofdreams.net/De_Moivre_formula.htm  */  type complex double x,y  function zpower(complex*z, double n)  'Using DeMoivre theorem  double radius,ang,scale  radius = hypot(z.x,z.y)  scale = radius^n  if z.x=0 then    angle=.5*pi '90 degrees    if z.y<0 then angle=1.5*pi  else    angle = atan(z.y,z.x)  end if  angle*=n  z.x  = scale * cos(angle)  z.y  = scale * sin(angle)  end function  complex n={-2.0 , 0.0}  zpower( n, 0.2)  print str(n.x,6) " + " str(n.y,6) "i"`
A good test is -4^.5
expected result: {0 + 2i}
« Last Edit: October 22, 2013, 08:32:21 AM by Charles Pegge »