From: "Nasser M. Abbasi" <nma@12000.org>
Subject: small example, using complex variables in Ada
Date: Wed, 09 Jun 2010 03:49:37 -0700
Date: 2010-06-09T03:49:37-07:00 [thread overview]
Message-ID: <hunrki$ph7$1@speranza.aioe.org> (raw)
I never used complex variables before in Ada, so for the last 3 hrs I
was learning how to do it. I wrote a simple program, to find the DFT of
an array of 3 elements {1,2,3} (DFT=discrete Fourier transform).
The definition of DFT is one equation with summation, here it is, first
equation you'll see:
http://en.wikipedia.org/wiki/Discrete_Fourier_transform
Since I have not programmed in Ada nor in FORTRAN for a looong time, I
am very rusty, I program in Mathematica and sometimes in matlab these
days, but I wanted to try Ada on complex numbers.
I also wrote a FORTRAN equivalent of the small Ada function. Here is
below the Ada code, and the FORTRAN code. Again, do not scream too much
if it is not good code, I just learned this now, I am sure this can be
improved a lot.
And for comparing, I show the Matlab and the Mathematica output just to
make sure.
====== START ADA ============
--
-- dtf.adb, compiled with GNAT 4.3.4 20090804 (release) 1
-- under CYGWIN 1.7.5
-- gnatmake dft.adb
--
-- ./dft.exe
-- ( 6.00000E+00, 0.00000E+00)
-- (-1.50000E+00, 8.66026E-01)
-- (-1.50000E+00,-8.66025E-01)
-- $
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Numerics.Complex_Types; use Ada.Numerics.Complex_Types;
with Ada.Numerics; use Ada.Numerics;
with Ada.Numerics.Complex_Elementary_Functions;
use Ada.Numerics.Complex_Elementary_Functions;
with Ada.Complex_Text_IO; use Ada.Complex_Text_IO;
procedure dft is
N : positive := 3;
J : constant complex :=(0.0,1.0); -- SQRT(-1)
X : array(0 .. N-1) of Complex := (others=>(0.0,0.0));
data : array(0 .. N-1) of float :=(1.0,2.0,3.0);
begin
FOR k in X'range LOOP
FOR m in data'range LOOP
X(k) := X(k) + data(m) * exp(- J*(2.0*Pi)/float(N) *
float(m*k) );
END LOOP;
put(X(k)); new_line;
END LOOP;
end dft;
================== END ADA ==============
======= FORTRAN code ===========
! dtf.f90, compiled with GCC 4.3.4
! under CYGWIN 1.7.5
! gfortran -Wall dft.f90
! ./a.exe
! ( 6.0000000 , 0.0000000 )
! ( -1.4999999 , 0.86602557 )
! ( -1.5000005 ,-0.86602497 )
!
PROGRAM dft
IMPLICIT NONE
INTEGER, PARAMETER :: N = 3
COMPLEX, parameter :: J =(0,1)
REAL, parameter :: Pi = ACOS(-1.0)
INTEGER :: k,m
COMPLEX, dimension(N) :: X
REAL, dimension(N) :: data=(/1.0,2.0,3.0/)
DO k=1,N
X(k)=(0,0)
DO m=1,N
X(k) = X(k) + data(m) * EXP(-1.0*J*2.0*Pi/N *(m-1)*(k-1) )
END DO
print *,X(k)
END DO
END PROGRAM dft
==================================
==== Matlab code ====
EDU>> fft([1,2,3])'
ans =
6.0000
-1.5000 - 0.8660i
-1.5000 + 0.8660i
===============================
=== Mathematica ====
In[5]:= Chop[Fourier[{1, 2, 3}, FourierParameters -> {1, -1}]]
Out[5]= {6., -1.5 + 0.8660254037844386*I, -1.5 - 0.8660254037844386*I}
=========================
Conclusion:
I actually liked the Ada implementation more than FORTRAN because:
1. In Ada, I did not have to change the index of m and k in the
summation to reflect the 1-off per the definition of DFT.
DFT starts from 0 to N-1. In Ada, using 'Range and defining the arrays
to go from 0 .. N-1 solved the problem.
2. In Ada, the compiler complained more times more about types being
mixed up. I placed float() around the places it complained about.
3. It actually took me less time to do the Ada function than the FORTRAN
one, even though I am equally not familiar with both at this time :)
ok, this was a fun learning exercise
--Nasser
next reply other threads:[~2010-06-09 10:49 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-09 10:49 Nasser M. Abbasi [this message]
2010-06-09 11:26 ` small example, using complex variables in Ada Ludovic Brenta
2010-06-09 23:50 ` Jerry
2010-06-10 1:03 ` Jeffrey R. Carter
2010-06-10 15:48 ` Colin Paul Gloster
2010-06-10 14:54 ` Ludovic Brenta
2010-06-10 16:21 ` Colin Paul Gloster
2010-06-10 17:37 ` Adam Beneschan
2010-06-10 17:57 ` Jeffrey R. Carter
2010-06-10 22:32 ` Randy Brukardt
2010-06-11 12:42 ` Colin Paul Gloster
2010-06-11 18:59 ` Randy Brukardt
2010-06-14 19:19 ` Colin Paul Gloster
2010-06-14 19:48 ` Nasser M. Abbasi
2010-06-17 7:44 ` Gautier write-only
2010-06-17 10:33 ` Colin Paul Gloster
2010-06-17 14:39 ` Yannick Duchêne (Hibou57)
2010-06-17 16:36 ` Colin Paul Gloster
2010-06-09 12:43 ` Niklas Holsti
2010-06-10 7:23 ` Stephen Leake
2010-06-10 9:12 ` J-P. Rosen
2010-06-10 11:03 ` Yannick Duchêne (Hibou57)
2010-06-10 13:27 ` J-P. Rosen
2010-06-10 21:15 ` Yannick Duchêne (Hibou57)
2010-06-11 7:22 ` Dmitry A. Kazakov
2010-06-11 8:48 ` J-P. Rosen
2010-06-11 12:00 ` Brian Drummond
2010-06-10 9:34 ` Nasser M. Abbasi
2010-06-10 20:12 ` Simon Wright
2010-06-14 9:33 ` Vincent LAFAGE
2010-06-14 12:29 ` Nasser M. Abbasi
2010-06-14 13:00 ` Vincent LAFAGE
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox