Data update

This commit is contained in:
Ingy döt Net 2025-08-11 18:05:26 -07:00
parent 4d5544505c
commit 4924dd0264
3073 changed files with 55820 additions and 4408 deletions

View file

@ -0,0 +1,30 @@
(import std.Math)
(let a (math:complex 1 1))
(let b (math:complex 3.75 1.25))
(assert
(=
(math:complex-add a b)
(math:complex 4.75 2.25))
"complex add")
(assert
(=
(math:complex-mul a b)
(math:complex 2.5 5))
"complex mul")
(assert
(=
(math:complex-mul (math:complex -1 0) a)
(math:complex -1 -1))
"complex negation")
(assert
(=
(math:complex-div (math:complex 1 0) a)
(math:complex 0.5 -0.5))
"complex inversion")
(assert
(=
(math:complex-conjugate a)
(math:complex 1 -1))
"complex conjugate")

View file

@ -0,0 +1,86 @@
CREATE TYPE COMPLEX AS STRUCT(r REAL, i REAL);
CREATE OR REPLACE FUNCTION isreal(a) AS (
if (try_cast(a as REAL), true, false)
);
CREATE OR REPLACE FUNCTION tocomplex(a) AS (
coalesce( try_cast(a as COMPLEX), {r: a, i:0.0 }::COMPLEX )
);
CREATE OR REPLACE FUNCTION complex_add_(a, b) AS (
{r: a.r + b.r, i:a.i + b.i}
);
CREATE OR REPLACE FUNCTION complex_add(a, b) AS (
complex_add_(tocomplex(a), tocomplex(b))
);
CREATE OR REPLACE FUNCTION complex_mul_(a, b) AS (
{r: a.r * b.r - a.i * b.i, i:a.r * b.i + a.i * b.r}
);
CREATE OR REPLACE FUNCTION complex_mul(a, b) AS (
complex_mul_(tocomplex(a), tocomplex(b))
);
CREATE OR REPLACE FUNCTION complex_mag(a) AS (
case when isreal(a)
then abs(a::REAL)
else sqrt( (a::COMPLEX).r ^ 2 + (a::COMPLEX).i ^2)
end
);
CREATE OR REPLACE FUNCTION complex_conj(a) AS (
case when isreal(a)
then {r: a::REAL, i: 0.0}
else {r: (a::COMPLEX).r, i: - (a::COMPLEX).i}
end
);
CREATE OR REPLACE FUNCTION complex_mag_squared(x) AS (
case when isreal(x)
then x::REAL*x::REAL
else (x::COMPLEX).r ^ 2 + (x::COMPLEX).i ^ 2
end
);
# Oddly, the a.r notation cannot currently be used here
CREATE OR REPLACE FUNCTION complex_div_(a, b) AS (
WITH denom AS (select complex_mag_squared(b) as denom,
a['r'] as ar, a['i'] as ai, b['r'] as br, b['i'] as bi
)
SELECT {r: (ar * br + ai * bi) / denom,
i: (ai * br - ar * bi) / denom }
FROM denom
);
CREATE OR REPLACE FUNCTION complex_div(a, b) AS (
complex_div_(tocomplex(a), tocomplex(b))
);
CREATE OR REPLACE FUNCTION complex_exp_(z) AS (
complex_mul_( {r: exp(z.r), i: 0.0}, {r: cos(z.i), i:sin(z.i) })
);
CREATE OR REPLACE FUNCTION complex_exp(z) AS (
if( isreal(z),
{r:exp(z::REAL), i:0.0},
complex_exp_( tocomplex(z) ) )
);
## Examples
.mode line
CREATE OR REPLACE FUNCTION test(x,y) as table (
select x as "x",
y as "y",
complex_add(x,y) as "add",
complex_mul(x,y) as "mul",
complex_div(1, x) as "1/x",
complex_conj(x) as "conj(x)",
complex_div(x,y).complex_mul(y) as "(x/y)*y"
);
from test({r:1,i:1}, {r:0,i:1} );
select complex_exp( {r:0, i:pi()} ) as "e^iπ";

View file

@ -0,0 +1,71 @@
//
// Arithmetic/Complex
// Using FutureBasic 7.0.34
// August 2025, R.W
include "Tlbx complex.incl"
// through this include file, FB supports the following
// double complex functions (as of August 2025).
// Float and long double complex might be
// available in later versions
//fn creal, cimag, cabs, carg, conj, cproj
//fn csqrt, cexp, clog, cpow
//fn csin, ccos, ctan
//fn casin, cacos, catan
//fn csinh, ccosh, ctanh
//fn casinh,cacosh,catanh
// Below is redefining "I" to Cj since I don't want to lose the
// ability to use "i" as my favorite FOR NEXT / loop variable
BeginCDeclaration
#define Cj I
EndC
system double Cj
local fn PrintComplexNumber( z as double_complex )
double y
print @fn creal( z ) " ";
y = fn cimag( z )
if ( y >= 0.0 ) then print @"+"; : else print @"-";
print @abs( y ) "i"
end fn
window 1,@"Arithmetic/Complex"
double_complex z1, z2, z3, z4, z5, z6
double_complex z7, z8, z9, zs, zn
z1 = 1.5 + 3 * Cj //1.5 + 3i
z2 = 1.5 + 1.5 * Cj //1.5 + 1.5i
// Operations using C99 operators
z3 = z1 + z2 // addition
z4 = z1 - z2 // subtraction
z5 = z1 * z2 // multiplication
z6 = z1 / z2 // division
//----------------
z7 = fn conj(z1) // conjugate
z8 = fn cpow(z1,z2) // power ^
z9 = fn cabs(z1) // norm | magnitude
zs = fn csqrt(z1) // square root
zn = -(z1) // negate
// Extract real/imag parts using creal/cimag
print @
print @" z1 + z2 = "; fn creal(z3); " + "; fn cimag(z3); "i"
print @" z1 - z2 = "; fn creal(z4); " + "; fn cimag(z4); "i"
print @" z1 * z2 = "; fn creal(z5); " + "; fn cimag(z5); "i"
print @" z1 / z2 = "; fn creal(z6); " + "; fn cimag(z6); "i"
print @" Conj z1 = "; fn creal(z7); " "; fn cimag(z7); "i"
print @" Abs z1 = "; fn creal(z9)
print @" z1 ^ z2 = ";
fn PrintComplexNumber(z8)
print @" cSqrt z1= ";
fn PrintComplexNumber(zs)
print @" -(z1) = ";
fn PrintComplexNumber(zn)
print @" z1 real = "; fn creal(z1)
print @" z1 imag = "; fn cimag(z1)
HandleEvents

View file

@ -0,0 +1,15 @@
require "complex"
local fmt = require "fmt"
local x = new complex(1, 3)
local y = new complex(5, 2)
fmt.print("x = %s", x)
fmt.print("y = %s", y)
fmt.print("x + y = %s", x + y)
fmt.print("x - y = %s", x - y)
fmt.print("x * y = %s", x * y)
fmt.print("x / y = %s", x / y)
fmt.print("-x = %s", -x)
fmt.print("1 / x = %s", x:inverse())
fmt.print("x* = %s", x:conj())

View file

@ -1,4 +1,4 @@
-- 19 May 2025
-- 7 Aug 2025
include Settings
say 'COMPLEX ARITHMETIC'
@ -6,48 +6,45 @@ say version
say
a = '1 2'; b = '3 4'; c = '5 6'; d = '7 8'; i = I()
say 'VALUES'
say 'a =' crec2form(a)
say 'b =' crec2form(b)
say 'c =' crec2form(c)
say 'd =' crec2form(d)
say 'a =' Rec2FormC(a)
say 'b =' Rec2FormC(b)
say 'c =' Rec2FormC(c)
say 'd =' Rec2FormC(d)
say
say 'BASICS'
say 'i*i =' crec2form(Csquare(i()))
say 'a+b =' crec2form(Cadd(a,b))
say 'a-b =' crec2form(Csub(a,b))
say 'a*b =' crec2form(Cmul(a,b))
say 'a/b =' crec2form(Cdiv(a,b))
say 'a^2 =' crec2form(Csquare(a,2))
say 'a^5 =' crec2form(Cpow(a,5))
say '-a =' crec2form(Cneg(a))
say '1/a =' crec2form(Cinv(a))
say 'a+b+c+d =' crec2form(Cadd(a,b,c,d))
say 'a-b-c-d =' crec2form(Csub(a,b,c,d))
say 'a*b*c*d =' crec2form(Cmul(a,b,c,d))
say 'a/b/c/d =' crec2form(Cnormal(Cdiv(a,b,c,d)))
say 'i*i =' Rec2FormC(SquareC(i()))
say 'a+b =' Rec2FormC(AddC(a,b))
say 'a-b =' Rec2FormC(SubC(a,b))
say 'a*b =' Rec2FormC(MulC(a,b))
say 'a/b =' Rec2FormC(DivC(a,b))
say 'a^2 =' Rec2FormC(SquareC(a,2))
say 'a^5 =' Rec2FormC(PowC(a,5))
say '-a =' Rec2FormC(NegC(a))
say '1/a =' Rec2FormC(InvC(a))
say 'a+b+c+d =' Rec2FormC(AddC(a,b,c,d))
say 'a-b-c-d =' Rec2FormC(SubC(a,b,c,d))
say 'a*b*c*d =' Rec2FormC(MulC(a,b,c,d))
say 'a/b/c/d =' Rec2FormC(Normal(DivC(a,b,c,d)))
say
say 'FORMULA'
say 'a^2-2ab+3c-4ad^4+5 =' ,
crec2form(Cadd(Csquare(a),Cmul(-2,a,b),Cmul(3,c),Cmul(-4,a,Cpower(d,4)),5))
Rec2FormC(AddC(SquareC(a),MulC(-2,a,b),MulC(3,c),MulC(-4,a,PowerC(d,4)),5))
say
say 'BONUS'
say 'Argument(a) =' Carg(a)+0
say 'Conjugate(a) =' crec2form(Cconj(a))
say 'Imag(a) =' Cim(a)
say 'Modulus(a) =' Cmod(a)+0
say 'Polar(a) =' Cpol2form(Cnormal(Crec2pol(a)))
say 'Real(a) =' Cre(a)
say 'Argument(a) =' ArgC(a)+0
say 'Conjugate(a) =' Rec2FormC(ConjC(a))
say 'Imag(a) =' ImC(a)
say 'Modulus(a) =' ModC(a)+0
say 'Polar(a) =' Pol2FormC(Normal(Rec2PolC(a)))
say 'Real(a) =' ReC(a)
say
say 'MORE'
say 'Arcsin(a) =' crec2form(Cnormal(Carcsin(a)))
say 'Exp(a) =' crec2form(Cnormal(Cexp(a)))
say 'Ln(a) =' crec2form(Cnormal(Cln(a)))
say 'Sin(a) =' crec2form(Cnormal(Csin(a)))
say 'Sqrt(a) =' crec2form(Cnormal(Csqrt(a)))
say 'i^i =' crec2form(Cnormal(Cpower(i,i)))
say 'Arcsin(a) =' Rec2FormC(Normal(ArcSinC(a)))
say 'Exp(a) =' Rec2FormC(Normal(ExpC(a)))
say 'Ln(a) =' Rec2FormC(Normal(LnC(a)))
say 'Sin(a) =' Rec2FormC(Normal(SinC(a)))
say 'Sqrt(a) =' Rec2FormC(Normal(SqRtC(a)))
say 'i^i =' Rec2FormC(Normal(PowerC(i,i)))
exit
include Complex
include Functions
include Constants
include Abend
include Math