„Komplex számok a programozásban” változatai közötti eltérés
a (→Java) |
(→C#) |
||
(7 közbenső módosítás ugyanattól a szerkesztőtől nincs mutatva) | |||
3. sor: | 3. sor: | ||
== C == | == C == | ||
− | Nyelvi szinten támogatva van | + | Nyelvi szinten a c99 szabványtól támogatva van. |
<source lang="C"> | <source lang="C"> | ||
34. sor: | 34. sor: | ||
return 0; | return 0; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Ha régebbi, például ansi C-t vagy C90 szabványt ismerő fordító esetén a nyelvi támogatás hiányában például az alábbi komplex számokat kezelő függvényekkel tudunk számolni: | ||
+ | |||
+ | <source lang="c"> | ||
+ | #include <math.h> | ||
+ | |||
+ | typedef struct _complex { | ||
+ | float real; | ||
+ | float imag; | ||
+ | } Complex; | ||
+ | |||
+ | Complex cadd(Complex a, Complex b) { | ||
+ | Complex res; | ||
+ | res.real = a.real + b.real; | ||
+ | res.imag = a.imag + b.imag; | ||
+ | return res; | ||
+ | } | ||
+ | |||
+ | Complex cmul(Complex a, Complex b) { | ||
+ | Complex res; | ||
+ | res.real = a.real * b.real - a.imag * b.imag; | ||
+ | res.imag = a.real * b.imag + b.real * a.imag; | ||
+ | return res; | ||
+ | } | ||
+ | |||
+ | // (a.real + a.imag) / (b.real + b.imag) | ||
+ | // ---> szorozzuk a nevező konjugáltjával, azaz (b.real - b.imag) értékkel | ||
+ | Complex cdiv(Complex a, Complex b) { | ||
+ | Complex res, tmp; | ||
+ | tmp.real = b.real * b.real + b.imag * b.imag; // keresztszorzatok kiesnek | ||
+ | res.real = (a.real * b.real + a.imag * b.imag)/tmp.real; | ||
+ | res.imag = (a.imag * b.real - a.real * b.imag)/tmp.real; | ||
+ | return res; | ||
+ | } | ||
+ | |||
+ | float magnitude(Complex a) { | ||
+ | return sqrt(a.real*a.real + a.imag * a.imag); | ||
+ | } | ||
+ | |||
+ | float phase(Complex a) { | ||
+ | return atan2(a.imag, a.real); | ||
} | } | ||
</source> | </source> | ||
== C# == | == C# == | ||
+ | |||
+ | A C# nagyrészben támogatja a komplex aritmetikát. Sajnos inicializáláskor az ''a = 5 + 3i'' formátumot nem fogadja el, így kizárólag konstruktorhívással lehet változót deklarálni. | ||
+ | |||
+ | apt-get install libmono-system-numerics4.0-cil | ||
+ | mcs -r:System.Numerics complex_teszt.cs | ||
+ | |||
+ | <source lang="csharp"> | ||
+ | using System; | ||
+ | using System.Numerics; | ||
+ | |||
+ | public class Example { | ||
+ | public static void Main() { | ||
+ | Complex a = new Complex(5, 3); | ||
+ | Complex b = new Complex(3, 2); | ||
+ | Complex r; | ||
+ | |||
+ | Console.WriteLine(a.ToString()); | ||
+ | Console.WriteLine(b.ToString()); | ||
+ | |||
+ | Console.WriteLine(a.Real); | ||
+ | Console.WriteLine(a.Imaginary); | ||
+ | |||
+ | Console.WriteLine(Complex.Abs(a)); | ||
+ | Console.WriteLine(a.Magnitude); // Abs másképpen | ||
+ | Console.WriteLine(a.Phase); | ||
+ | |||
+ | r = a + b; | ||
+ | Console.WriteLine(r.ToString()); | ||
+ | |||
+ | r = a * b; | ||
+ | Console.WriteLine(r.ToString()); | ||
+ | |||
+ | r = a / b; | ||
+ | Console.WriteLine(r.ToString()); | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | == Go == | ||
+ | |||
+ | Szintén nyelvi elemekkel támogatja a komplex számokat. | ||
+ | |||
+ | <source lang="go"> | ||
+ | package main | ||
+ | |||
+ | import "fmt" | ||
+ | import "math/cmplx" | ||
+ | |||
+ | func main() { | ||
+ | var a = 5 + 3i; | ||
+ | var b = 3 + 2i; | ||
+ | |||
+ | fmt.Printf("a.re: %v\n", real(a)); | ||
+ | fmt.Printf("a.im: %v\n", imag(a)); | ||
+ | |||
+ | fmt.Printf("a: %v\n", a); | ||
+ | fmt.Printf("b: %v\n", b); | ||
+ | |||
+ | fmt.Printf("Magnit: %v\n", cmplx.Abs(a)); | ||
+ | fmt.Printf("Phase: %v\n", cmplx.Phase(a)); | ||
+ | var magnit, phase = cmplx.Polar(a) | ||
+ | fmt.Printf("Polar: %v %v\n", magnit, phase); | ||
+ | |||
+ | fmt.Printf("a+b: %v\n", a+b); | ||
+ | fmt.Printf("a*b: %v\n", a*b); | ||
+ | fmt.Printf("a/b: %v\n", a/b); | ||
+ | } | ||
+ | </source> | ||
== Java == | == Java == | ||
− | Nyelvi elemként nem ismeri a komplex számokat, azonban számtalan | + | Nyelvi elemként nem ismeri a komplex számokat, azonban számtalan komplex függvényeket tartalmazó osztály letölthető hozzá. |
== Javascript == | == Javascript == | ||
48. sor: | 159. sor: | ||
Példa: http://mathjs.org/examples/complex_numbers.js.html | Példa: http://mathjs.org/examples/complex_numbers.js.html | ||
+ | |||
+ | == Lua == | ||
+ | |||
+ | Nyelvi elemei nincsenek rá, komplex aritmetikát támogató függvény gyűjteményt innen lehet letölteni: http://lua-users.org/wiki/ComplexNumbers | ||
== Octave == | == Octave == | ||
75. sor: | 190. sor: | ||
szor = a*b | szor = a*b | ||
per = a/b | per = a/b | ||
+ | </source> | ||
+ | |||
+ | == Perl == | ||
+ | |||
+ | A PERL szintén nyelvi elemekkel segíti a komplex számokkal való számolást. | ||
+ | |||
+ | <source lang="perl"> | ||
+ | #!/usr/bin/perl | ||
+ | |||
+ | use Math::Complex; | ||
+ | |||
+ | $a = 5 + 3*i; | ||
+ | $b = 3 + 2*i; | ||
+ | |||
+ | print Re($a), "\n"; | ||
+ | print Im($a), "\n"; | ||
+ | |||
+ | print $a, "\n"; | ||
+ | print $b, "\n"; | ||
+ | |||
+ | print abs($a), "\n"; | ||
+ | print atan2(Im($a), Re($a)), "\n"; | ||
+ | |||
+ | print $a+$b, "\n"; | ||
+ | print $a*$b, "\n"; | ||
+ | print $a/$b, "\n"; | ||
</source> | </source> | ||
A lap jelenlegi, 2014. november 30., 20:46-kori változata
Láttuk, hogy a komplex számok RLC körök váltakozóáramú viselkedésének leírásánál fontos szerephez jutnak. Jelen szócikk azt vizsgálja, mely programnyelveken hogyan lehet komplex számokkal számításokat csinálni.
C
Nyelvi szinten a c99 szabványtól támogatva van.
<source lang="C">
- include <stdio.h>
- include <complex.h>
void kiir(const char *s, float complex a) {
printf("%s: %f + %fj\n", s, creal(a), cimag(a) );
}
int main() {
float complex a, b;
a = 5 + 3i; // de akár 5 + 3j vagy 5 + 3*I alakban is megadható. b = 3 + 2i;
// creal(a), cimag(a) - lásd kiír függvényben.
kiir("a: ", a); kiir("b: ", b);
// vektorhossz; cabs: double, cabsf: float, cabsl: long double printf("cabs(a): %f\n", cabs(a) ); // fázis; carg: double, cargf: float, cargl: long double printf("carg(a): %f\n", carg(a) ); // radiánban
kiir("a+b: ", a + b); kiir("a*b: ", a * b); kiir("a/b: ", a / b);
return 0;
} </source>
Ha régebbi, például ansi C-t vagy C90 szabványt ismerő fordító esetén a nyelvi támogatás hiányában például az alábbi komplex számokat kezelő függvényekkel tudunk számolni:
<source lang="c">
- include <math.h>
typedef struct _complex {
float real; float imag;
} Complex;
Complex cadd(Complex a, Complex b) {
Complex res; res.real = a.real + b.real; res.imag = a.imag + b.imag; return res;
}
Complex cmul(Complex a, Complex b) {
Complex res; res.real = a.real * b.real - a.imag * b.imag; res.imag = a.real * b.imag + b.real * a.imag; return res;
}
// (a.real + a.imag) / (b.real + b.imag) // ---> szorozzuk a nevező konjugáltjával, azaz (b.real - b.imag) értékkel Complex cdiv(Complex a, Complex b) {
Complex res, tmp; tmp.real = b.real * b.real + b.imag * b.imag; // keresztszorzatok kiesnek res.real = (a.real * b.real + a.imag * b.imag)/tmp.real; res.imag = (a.imag * b.real - a.real * b.imag)/tmp.real; return res;
}
float magnitude(Complex a) {
return sqrt(a.real*a.real + a.imag * a.imag);
}
float phase(Complex a) {
return atan2(a.imag, a.real);
} </source>
C#
A C# nagyrészben támogatja a komplex aritmetikát. Sajnos inicializáláskor az a = 5 + 3i formátumot nem fogadja el, így kizárólag konstruktorhívással lehet változót deklarálni.
apt-get install libmono-system-numerics4.0-cil mcs -r:System.Numerics complex_teszt.cs
<source lang="csharp"> using System; using System.Numerics;
public class Example {
public static void Main() { Complex a = new Complex(5, 3); Complex b = new Complex(3, 2); Complex r;
Console.WriteLine(a.ToString()); Console.WriteLine(b.ToString());
Console.WriteLine(a.Real); Console.WriteLine(a.Imaginary);
Console.WriteLine(Complex.Abs(a)); Console.WriteLine(a.Magnitude); // Abs másképpen Console.WriteLine(a.Phase);
r = a + b; Console.WriteLine(r.ToString());
r = a * b; Console.WriteLine(r.ToString());
r = a / b; Console.WriteLine(r.ToString()); }
} </source>
Go
Szintén nyelvi elemekkel támogatja a komplex számokat.
<source lang="go"> package main
import "fmt" import "math/cmplx"
func main() {
var a = 5 + 3i; var b = 3 + 2i;
fmt.Printf("a.re: %v\n", real(a)); fmt.Printf("a.im: %v\n", imag(a));
fmt.Printf("a: %v\n", a); fmt.Printf("b: %v\n", b);
fmt.Printf("Magnit: %v\n", cmplx.Abs(a)); fmt.Printf("Phase: %v\n", cmplx.Phase(a)); var magnit, phase = cmplx.Polar(a) fmt.Printf("Polar: %v %v\n", magnit, phase);
fmt.Printf("a+b: %v\n", a+b); fmt.Printf("a*b: %v\n", a*b); fmt.Printf("a/b: %v\n", a/b);
} </source>
Java
Nyelvi elemként nem ismeri a komplex számokat, azonban számtalan komplex függvényeket tartalmazó osztály letölthető hozzá.
Javascript
Nyelvi elemként nem támogatja, azonban a komplex számokat kezelő függvénygyűjtemény itt található rá: http://mathjs.org/
Példa: http://mathjs.org/examples/complex_numbers.js.html
Lua
Nyelvi elemei nincsenek rá, komplex aritmetikát támogató függvény gyűjteményt innen lehet letölteni: http://lua-users.org/wiki/ComplexNumbers
Octave
Az Octave egy matematikai program, jól szkriptelhető, egyszerű a nyelvezete. Műszaki számításokra kifejezetten alkalmas. Amennyiben ;-vel zárjuk a sort, akkor annak a sornak az eredménye nem kerül ki a képernyőre.
A komplex számok nyelvi szinten vannak támogatva.
<source lang="octave">
- !/usr/bin/octave
a = 5 + 3i b = 3 + 2i
disp "a: Real, imag:" re = real(a) im = imag(a)
disp "a: magnit, phase:" magnit = abs(a) phase = arg(a)
disp "a+b, a*b, a/b:" plusz = a+b szor = a*b per = a/b </source>
Perl
A PERL szintén nyelvi elemekkel segíti a komplex számokkal való számolást.
<source lang="perl">
- !/usr/bin/perl
use Math::Complex;
$a = 5 + 3*i; $b = 3 + 2*i;
print Re($a), "\n"; print Im($a), "\n";
print $a, "\n"; print $b, "\n";
print abs($a), "\n"; print atan2(Im($a), Re($a)), "\n";
print $a+$b, "\n"; print $a*$b, "\n"; print $a/$b, "\n"; </source>
PHP
Alapból nincs támogatva, azonban a feltelepíthető a Complex csomag (jelenleg béta). Sajnos ezzel sem olyan kényelmes a komplex számokkal való számolás. Szerencsés lenne itt is nyelvi elemként beintegrálni.
pear install Math_Complex # illetve ha nem települ fel, akkor: pear install Math_Complex channel://pear.php.net/Math_Complex-0.8.6
Példa: https://github.com/pear/Math_Complex/blob/master/docs/examples/using_complexop.php
Próbáim során a ComplexOp problémás volt, így a Complex lett csak behívva, amiben még nincs összeadás, szorzás, osztás.
<source lang="php"> <?php require_once 'Math/Complex.php';
$a = new Math_Complex(5, 3); // a = 5 + 3j $b = new Math_Complex(3, 2); // b = 3 + 2j
echo "a: ", $a->toString(), "\n"; echo "b: ", $b->toString(), "\n";
echo "real(a): ", $a->getReal(), "\n"; echo "imag(a): ", $a->getIm(), "\n";
echo "magnit: ", $a->abs(), "\n"; echo "phase: ", $a->angle(), "\n";
// alábbi nekem a ComplexOp modul hibájával elszállt
require_once 'Math/ComplexOp.php';
$r = Math_ComplexOp::add($a. $b); echo "a+b: ", $r->toString(), "\n";
$r = Math_ComplexOp::mult($a. $b); echo "a*b: ", $r->toString(), "\n";
$r = Math_ComplexOp::div($a. $b); echo "a/b: ", $r->toString(), "\n"; ?> </source>
Python
A komplex számok nyelvi szinten támogatva vannak.
<source lang="python">
- !/usr/bin/python
import cmath
a = 5 + 3j b = 3 + 2j
print "real(a): ", a.real print "imag(a): ", a.imag
print "a:", a print "b:", b
print "abs:", abs(a) print "phase:", cmath.phase(a) print "polar:", cmath.polar(a)
print "a+b:", a+b print "a*b:", a*b print "a/b:", a/b </source>
Ruby
A Ruby szintén nyelvi szinten támogatja a komplex számokkal való műveleteket.
<source lang="ruby">
- !/usr/bin/ruby
a = 5 + 3i b = 3 + 2i
print a.real print a.imag
print a print b
print a.abs() print a.phase() print a.polar()
print a+b print a*b print a/b </source>