Ada Programlama Dili Temelleri

Bölüm 3

Standard Pakette Tanımlanan Öntanımlı Veri Tipleri

Öntanımlı Gerçek Sayı Veri Tipleri

Bölüm 3 Sayfa 9

3.3.7.4 - Sabit Ondalıklı Veri Tiplerine Uygulanabilen Nitelikler (devam)

Bir genel sabit ondalıklı tipin S'Aft niteliğinin belirlenmesi, aşağıdaki uygulamada gerçekleştirilmektedir.

with Ada.Text_IO;

with Ada.Integer_Text_IO;

procedure b3_3_7_4_uyg_4 is

   type TL is delta 1.0E-2 range 0.0 .. 1.00E8;
   
begin

   Ada.Text_IO.Put(Item => "Aft değeri : ");

   
   Ada.Integer_Text_IO.Put(Item => TL'Aft);
   
   
   
end b3_3_7_4_uyg_4;

Bu Prosedürün Sonucu :

Aft değeri :           2

olmaktadır.
		

Yukarıdaki prosedürde, alınan sonuç, N tamsayı değişkeninin (10**N)*S'Delta ifadesinin 1 den büyük olması için alması gereken en küçük tamsayı değeridir. N = 1 olduğunda, (10**N)*S'Delta = 0.2 yani kriteryum sağlanamamakta, N = 2 olduğunda (10**N)*S'Delta = 2 olarak kriteryum sağlanabilmektedir.

S'Fore niteliğinin değerinden, S'aft ile birlikte bir sabit ondalıklı tipin görüntülenmesi için yararlanılabilir. Aşağıda, görülen prosedürde bu yöntem uygulanmıştır.

with Ada.Text_IO;

with Ada.Integer_Text_IO;

procedure b3_3_7_4_uyg_5 is

   type Para_Birimi is delta 1.0E-2 range 0.0 ..1.0E9;
   
   package Ödeme_IO is new Ada.Text_IO.Fixed_IO(num => Para_Birimi);
   
   Saat_Ücreti : Para_Birimi := 40.00;
   
   Brüt_Ücret : Para_Birimi;
   
   Çalışılan_Saat , Tamsayı , Ondalık : Natural;
   
   
begin

   Tamsayı := Para_Birimi'Fore;
   
   Ondalık := Para_Birimi'Aft;

   Ada.Text_IO.Put(Item => "Lütfen Tamsayı Olarak Çalışılan Saati Giriniz :  ");
   
   Ada.Integer_Text_IO.Get(Item => Çalışılan_Saat);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "Haftalık Çalışılan Saat :  " & Integer'Image(Çalışılan_Saat) & "  Saat  , "  &   "    Brüt Ücret  : ");
   
   Brüt_Ücret := Çalışılan_Saat * Saat_Ücreti;
   
   Ödeme_IO.Put(Item => Brüt_Ücret , Fore =>  Tamsayı , Aft => Ondalık , Exp => 0);
   
   Ada.Text_IO.Put(Item => "     T.L.");
   
end b3_3_7_4_uyg_5;

Bu Prosedürün Sonucu :

Lütfen Tamsayı Olarak Çalışılan Saati Giriniz :  40
Haftalık Çalışılan Saat :   40  Saat  ,     Brüt Ücret  :        1600.00     T.L.

olmaktadır.
		

Aşağıda görülen prosedürde, sabit ondalıklı bir alt veri tipinin skalası sorgulanmaktadır.

with Ada.Text_IO;

with Ada.Integer_Text_IO;

with Ada. Float_Text_Io;

procedure b3_3_7_4_uyg_6 is

   type Desimal_Alt_Tip is delta 1.0E-14  digits 18;
   
   package Desimal_Alt_Tip_IO is new Ada.Text_IO.Decimal_IO(num => Desimal_Alt_Tip);
    
   
begin

   Ada.Text_IO.Put(Item => "Desimal_Alt_Tip Veri Tipinin Kapsam Alt Sınırı :  ");
   
   Desimal_Alt_Tip_IO.Put(Item => Desimal_Alt_Tip'First , Fore => Desimal_Alt_Tip'Fore , Aft => Desimal_Alt_Tip'Aft , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "Desimal_Alt_Tip Veri Tipinin Kapsam Üst Sınırı :  ");
   
   Desimal_Alt_Tip_IO.Put(Item => Desimal_Alt_Tip'Last , Fore => Desimal_Alt_Tip'Fore , Aft => Desimal_Alt_Tip'Aft , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "Desimal_Alt_Tip Veri Tipinin Anlamlı Ondalık Sayısı (Skalası)  :       ");
   
   Ada.Integer_Text_IO.Put(Item => Desimal_Alt_Tip'Scale);
   
end b3_3_7_4_uyg_6;
   
Bu Prosedürün Sonucu :

Desimal_Alt_Tip Veri Tipinin Kapsam Alt Sınırı :  -9999.99999999999999
Desimal_Alt_Tip Veri Tipinin Kapsam Üst Sınırı :   9999.99999999999999
Desimal_Alt_Tip Veri Tipinin Anlamlı Ondalık Sayısı (Skalası)  :               14

olmaktadır.
		

Yukarıdaki prosedürde, alınan sonuçlardan, yeni yaratılan desimal sabit ondalıklı kullanıcı alt tipi olan, Desimal_Alt_Tip veri tipinin yüksek delta ve digits değerlerine karşın, çok kısıtlı bir kapsam alanına sahip olabildiği görülmektedir. Bu olgu tüm desimal sabit ondalıklı tipler için geçerlidir. Yüksek delta ve digits değerleri, düşük kapsam alanına neden olacaktır.

S'Scale nitelik değeri ile S'Aft nitelik değerleri her zaman aynı olmayabilir. Örnek olarak, S'Delta = 1 ise, S'Aft = 1 iken S'Scale = 0 değerini almaktadır.

Öntanımlı Duration adi sabit ondalıklı veri tipi için yerleştirme değerleri, Aşağıda görülen prosedürde sorgulanmaktadır.

   with Ada.Text_IO;
   
    procedure b3_3_7_4_uyg_7 is
    
    package Duration_IO is new Ada.Text_IO.Fixed_IO(num => Duration);
    
   begin
   
      Ada.Text_IO.Put(Item => " Duration Small : " );
      
      Duration_IO.Put(Item =>Duration'Small , Fore => 0, Aft => 2 , Exp => 2);
      
      Ada.Text_IO.New_Line;
   
      Ada.Text_IO.Put(Item => " Duration Delta : " );
      
      Duration_IO.Put(Item =>Duration'Delta , Fore => 0, Aft => 2 , Exp => 2);
      
      Ada.Text_IO.New_Line;
      
      Ada.Text_IO.Put(Item => " Duration First : " );
      
      Duration_IO.Put(Item =>Duration'First , Fore => Duration'Fore ,  Aft => Duration'Aft , Exp => 0);
      
      Ada.Text_IO.Set_Col(To => 60);
      
      Ada.Text_IO.Put(Item => "Eksponansiyel olarak : " );
      
      Duration_IO.Put(Item =>Duration'First , Fore => Duration'Fore ,  Aft => Duration'Aft , Exp => 2);
      
      Ada.Text_IO.New_Line;
      
      Ada.Text_IO.Put(Item => " Duration Last :   " );
      
      Duration_IO.Put(Item =>Duration'Last , Fore => Duration'Fore ,  Aft => Duration'Aft , Exp => 0);
      
      Ada.Text_IO.Set_Col(To => 61);
      
      Ada.Text_IO.Put(Item => "Eksponansiyel olarak :  " );
      
      Duration_IO.Put(Item =>Duration'Last , Fore => Duration'Fore , Aft => Duration'Aft , Exp => 2);
   
      
   end b3_3_7_4_uyg_7;

Bu Prosedürün Sonucu :

 Duration Small : 1.00E-9
 Duration Delta : 1.00E-9
 Duration First :   -9223372036.854775808                  Eksponansiyel olarak :            -9.223372037E+9
 Duration Last :     9223372036.854775807                  Eksponansiyel olarak :             9.223372037E+9

olmaktadır.
		

Yukarıdaki prosedürde alınan sonuçlar, GNAT 2012 derleyicisinin sistemimizdeki yerleşiminde verilmiş olan Duration Small : 1.00E-9 ve Duration kapsam alanının -8400.00 .. 8400.00 arası olacağı konusunda vermiş olduğu değerlerin uygulanmış olduğunu belirtmektedir. Kapsam konusunda ise, belirtilenden çok daha fazla bir kapsam alanı sağlanmıştır.

Sabit ondalıklı sayı tiplerine uygulanabilen diğer skaler, ayrık, sayılabilir verilere ait niteliklerin uygulanması daha önce incelediğimiz tiplerde olduğu gibidir. Bu konudaki yapılamış uygulamalar, sabit ondalıklı veri tipleri için de yol gösterici olacaktır.

Diğer tpilerde olduğu gibi, sabit ondalıklı veri tiplerinin sistem ve model özelliklerinin sorgulanmasına yönelik niteliklerin sonuçları aslında, normal kullanıcıları ilgilendirmemekte ve uzmanlık alanı bu konular olan sınırlı sayıda araştırıcıya yönelik olmaktadır. Bu nedenle ilk aşamada bu nitelikler incelenmemiştir. Fakat isteyen kullanıcılar, nitelikler listesinden bu nitellikleri bularak uygulayabilirler.

3.3.7.5 - Sabit Ondalıklı Veri Tipleri için Tanımlı İşlemciler

Sabit ondalıklı veri tiplerinin işlemcileri Standart pakette değil, Ada 2012 spesifikasyonu Annex G.2.3 de ve 3.5.10 da tanımlanmışlardır.

Sabit Ondalıklı tipler için, atama, kalifikasyon, üyelik testleri, ve diğer sayısal veri tiplerine doğru ve diğer sayısal veri tiplerinden açık tip dönüştürme işlemleri tanımlıdır. Aynı zamanda, ilişkisel işlemciler, ile tekli +, - ve abs işlemcileri ile, ikili +, - * / işlemcileri tanımlıdır. Bu listede üstel işlemci ** bulunmadığı ve sabit ondalıklı tipler için üstel işlemcinin tanımlı olmadığına dikkat edilmelidir.

Sabit ondalıklı veri tipleri için geçerli olan, toplama-çıkarma, mutlak değer (abs) ve karşılaştırma işlemcilerinin işlenenleri aynı tipten sabit ondalıklı sayılar olmalıdır. Bu işlemlerin sonuçları kesin (exact) yani üstünde hata payı olmayan sonuçlar verirler.

Muhasebe işlemleri için sabit ondalıklı sayıların niçin tercih edildikleri buradan daha iyi anlaşılabilmektedir, çünkü muhasebeciler, yuvarlatma hatalarından hiç hoşlanmazlar.

Çarpma ve bölme işlemcilerinin işlenenleri, her tipten sabit ondalıklı sayılar, Integer veri tipi ve alt tipinden tamsayılar, universal_integer veya universal_real tipinden değerler, (tamsayı veya gerçek sayı literal veya sabitler) olabilir. Bu işlemlerin sonuçları, işlenenlerin ve sonucun tipine ve işlemin kendisine bağlıdır. Desimal tipler için, yuvarlatma yöntemi, T'Round niteleği ile belirtilebilir. İşlemin sonucu, en uygun (perfect) sonuçlar kümesine veya en yakın sonuçlar kümesine ait olabilir. Çoğunlukla desimal tipler için, en uygun sonuçlar kümesi sadece tek bir elemandan oluşur. Bu şekilde desimal sistemlerin işlemleri daima tam olarak belirgin (fully specified) olur.

Bu bilgilerden, üstünde hata payı en az olacak sonucun desimal tiplerle alınabileceği ve sonucun işlemin türü ile derleyicinin çalıştığı sisteme bağlı olacağı sonucu çıkarılabilir.

Matematiksel ifadelerin hesaplanmasında, en yüksek duyarlık Long_Long_Float, veri tipi ile gerçekleşir. Fakat, bu konuda, belki desimal tipler de kullanılabilir. Desimal veri tipinin cebirsel işlemlerdeki sayısal yeteneği, aşağıda görülen prosedürde denenmiştir.

with Ada.Text_IO;

procedure b3_3_7_5_uyg_1 is

   type Desimal is delta 1.0E-14 digits 18 range -9500.0 .. 9500.0;
   
   package Desimal_IO is new Ada.Text_IO.Decimal_IO(num => Desimal);
   
   Veri1 , Veri2 , Veri3 , Veri4 , Veri5 , Veri6 , Veri7 ,Veri8 , Sonuç  :  Desimal;
   

begin
   
   Veri1 := 1000.0;
    
   Veri2 := 9499.9;
    
   Veri3 := -6.6;
    
   Veri4 := 0.000023;
    
   Veri5 := 487.788888;
    
   Veri6 := 487.888888;
    
   Veri7 := 23.55;
    
   Veri8 := 23.66;
   
   Sonuç := ((Veri1 - Veri2) / (Veri3 - Veri4) - (Veri5 - Veri6) / (Veri7 - Veri8)) * 5;

   Ada.Text_IO.Put(Item => "Sonuç : ");

   
   Desimal_IO.Put(Item => Sonuç , Fore => Desimal'Fore ,  Aft => Desimal'Aft ,  Exp => 0);
   
   
end b3_3_7_5_uyg_1;

Bu Prosedürün Sonucu :

Sonuç :  6434.75028730271780

olmaktadır.
		

Yukarıdaki prosedürde, bir desimal sabit ondalıklı veri tipi kullanılması ile 6434.75028730271780 olarak hesaplanan algoritma, Log_Long_Float veri tipi kullanılarak hesaplandığında, yine 6434.75028730271780 olarak bulunmuştur. Mathcad 14 de aynı algoritma için 6434.75028730271700 sonucunu vermektedir. Doğal olarak, her üç sonucun da üzerinde bir hata payı vardır ve hangisinde bu hata payının daha az olduğunun saptanması olanağı yoktur. Eğer sadece her üç sonucun da birbirini desteklediği 12 ondalık sayısı veya daha azına gereksinme varsa, her üç sonuç da birbirbirinden farksız kabul edilebilir. Bu durumda, matematiksel ifadelerin hesaplanmasında, desimal sabit ondalııklı veri tipinin de kullanılabileceği şeklinde bir düşünce oluşabilir. Bu düşünce her durumda geçerli değildir.

Matematiksel ifadelerin hesaplanmasında, genellikle yapılan uygulama, daha az ondalığa gereksinme duyulurken, daha yüksek ondalık sayısı ile hesap yaptırmak ve gereksinmenin olduğu ondalık sayısını güvenilir alanda tutmaya çalışmaktır. Bu durumda, Yukarıdaki prosedürde olduğu gibi, yeterince düşük bir delta ve yeterince yüksek bir digits değerli desimal bir tip ile Long_Long_Float tipinin vermiş olduğu sonucun birbiribirinden farksız olabileceği düşünülebilir. Bu durumda Long_Long_Float tipi yerine desimal bir tipin kullanılabilmiş olması, her durumda Long_Long_Float tipi yerine desimal tip kullanılabilir anlamına gelmemektedir. Long_Long_Float veri tipi en yüksek duyarlık ve en yüksek kapsam alanına sahip olan veri tipidir. Matematik hesaplamalar için kuşkusuz olarak ilk olarak tercih edilmesi gereken veri tipidir. Desimal veri tipinde ise, delta azalıp digits arttıkça, kapsam alanı da giderek sınırlanmaktadır. Yani istenilen yüksek duyarlıkta bir desimal tipin kapsam alanının hesaplanması istenen sonucu kapsaması olasılığı giderek azalmaktadır. Bu durumda bile desimal tipin duyarlığı ya Long_Long_Float veri tipine eşit ya da büyük bir olasılıkla ondan daha az olacaktır. Yani pratik açıdan, tüm matematik ifadeler için desimal tiplerin kullanılması olanağı yoktur. Bu çalışmalar için Long_Long_Float veri tipi kesin olarak ilk ve belki de sadece uygulanacak olan veri tipidir. Sabit ondalıklı veri tipleri, çarpma ve bölme işlemlerinde, tamsayı veya gerçek sayı literal ve sabitlerle işlem yapılabilen tek veri tipidir. Bu kolaylık bu veri tipini muhasebe, stok kontrol gibi, matematik olarak fazla yoğun olmayan fakat toplama-çıkarma işlemlerinde kesin doğruluk gerektiren, ve fazla yoğun olmamakla birlikte sık sık tamsayı veya gerçek sayı literal ve sabitlerle çarpma-bölme işlemleri yapılan çalışmalar için çok uygun hale getirmektedir. Sabit ondalıklı veri tipleri, bu konularda geniş ölçüde kullanılmaktadır.