Ada Programlama Dili Temelleri

Bölüm 3

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

Bölüm 3 Sayfa 7

3.3.3.1 - Float Veri Tipine Uygulanabilen Nitelikler (Devam)

Gerçek sayıların bölme işlemlerinin sonucunda oluşam kalan sayı kısmı öntanımlı Remainder (Kalan) fonksiyonu yani, başka bir deyişle, öntanımlı S'Remainder niteliğinin döndürdüğü değer yardımı ile sorgulanabilir. Bu fonksiyonun tanımı aşağıda görülmektedir.

Bu niteliğin değerini belirlemek için aşağıda görülen program uygulanabilir:


with Ada.Text_IO;

procedure b3_3_3_1_uyg_13 is

X : Float :=  23.0;

Y : Float :=  -2.0;

begin

Ada.Text_IO.Put(Item => "  X/ Y nin Remainder  Değeri: " & Float'Image(Float'Remainder(X, Y)));

end b3_3_3_1_uyg_13;

Bu programın sonucu,

  X/ Y nin Remainder  Değeri: -1.00000E+00

olmaktadır.
		

Hesapların yürüyüşünü kontrol edelim: X/Y = -11.5 ve -12.0 < -11.5 < -11.0 , çift sayı olan -12.0 ı yeğliyoruz. r = X - n * Y, r = 23.0 - [(-12.0)*(-2.0)] = -1.0

Skaler bir veri tipi olan Float veri tipine tanımı daha önce incelenmiş olan Max ve Min fonksiyonları uygulanarak, iki Float verisinin hangisinin büyük veya küçük olduğu saptanabilir. Bu fonksiyonların kullanımı, S'Max (veya S'Min) (Arg1 , Arg2 S'Base) return S'Base şeklinde olmaktadır. Bu konuda bir örnek aşağıda görülmektedir:

with Ada.Text_IO;
with Ada.Float_Text_IO;

procedure b3_3_3_1_uyg_14 is

   X : Float :=  486.455878;

   Y : Float :=  486.455879;

begin

   Ada.Text_IO.Put(Item => "  X Değişkeni Değeri: ");
   
   Ada.Text_IO.Set_Col(To => 42);
   
   Ada.Float_Text_IO.Put(Item => X , Fore => 3 , Aft => 6 , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "  Y Değişkeni Değeri:  ");
   
   Ada.Text_IO.Set_Col(To => 42);
   
   Ada.Float_Text_IO.Put(Item => Y , Fore => 3 , Aft => 6 , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "  En Büyük Olan  Değişken : ");
   
   Ada.Text_IO.Set_Col(To => 37);
   
   Ada.Float_Text_IO.Put(Item => Float'Max(X , Y) , Fore => 3 , Aft => 6 , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "  En Küçük Olan  Değişken : ");
   
   Ada.Text_IO.Set_Col(To => 37);
   
   Ada.Float_Text_IO.Put(Item => Float'Min(X , Y) , Fore => 3 , Aft => 6 , Exp => 0);
   
end b3_3_3_1_uyg_14;

Bu programın sonucu,

  X Değişkeni Değeri:                    486.455872
  Y Değişkeni Değeri:                    486.455872
  En Büyük Olan  Değişken :          486.455872
  En Küçük Olan  Değişken :          486.455872

olmaktadır.
		

Yukarıdaki prosedürde, alınan sonuç hiç tatminkar değil ve bunun nedeni Float öntanımlı gerçek sayı veri tipinin ondalık sayısının sadece 6 ondalık ile sınırlı olmasıdır. Veriler, ondalık sınırında olduğunda, alınan sonuçların son ondalık değerlerinde belirsizlik ortaya çıkmaktadır. Düşük ondalık sayılarında sorun olmayan bu durum, ondalık sayısı tanım sınırında olan verilerde sorun yaratmaktadır.

Bu sorunun aşılması, ondalık sayısı daha yüksek olan Long_Float veya Long_Long_Float veri tiplerine geçilmesi veya daha da iyisi, çalışmalara uygun bir ondalık sayısı olan özgün bir veri tipi yaratılmasıdır. Bunu ileride kolaylıkla uygulayabileceğiz. Şu anda, ilk yapabileceğimiz şey, verileri Long_Float veri tipi ile değerlendirmeye çalışmaktır. Bunu için aşağıda görülen prosedür uygulanabilir.

with Ada.Text_IO;
with Ada.Long_Float_Text_IO;

procedure b3_3_3_1_uyg_15 is

   X : Long_Float :=  486.455878;

   Y : Long_Float :=  486.455879;

begin

   Ada.Text_IO.Put(Item => "  X Değişkeni Değeri: ");
   
   Ada.Text_IO.Set_Col(To => 42);
   
   Ada.Long_Float_Text_IO.Put(Item => X , Fore => 3 , Aft => 6 , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "  Y Değişkeni Değeri: ");
   
   Ada.Text_IO.Set_Col(To => 42);
   
   Ada.Long_Float_Text_IO.Put(Item => Y , Fore => 3 , Aft => 6 , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "  En Büyük Olan  Değişken : ");
   
   Ada.Text_IO.Set_Col(To => 37);
   
   Ada.Long_Float_Text_IO.Put(Item => Long_Float'Max(X , Y) , Fore => 3 , Aft => 6 , Exp => 0);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => "  En Küçük Olan  Değişken : ");
   
   Ada.Text_IO.Set_Col(To => 37);
   
   Ada.Long_Float_Text_IO.Put(Item => Long_Float'Min(X , Y) , Fore => 3 , Aft => 6 , Exp => 0);

end b3_3_3_1_uyg_15;

Bu programın sonucu,

  X Değişkeni Değeri:                    486.455878
  Y Değişkeni Değeri:                    486.455879
  En Büyük Olan  Değişken :          486.455879
  En Küçük Olan  Değişken :          486.455878

olmaktadır.
		

Yukarıdaki prosedürde 15 ondalık duyarlıkta Long_Float kullanımı sorunu çözümlemiş olmaktadır. Aslında, bu problem için 8-10 ondalık duyarlıklı bir özgün gerçek sayı veri tipi de problemin doğru çözümü için yeterli olabilir gibi görünmektedir.

Tüm skaler veri tiplerinde olduğu gibi, Float, Long_Float ve Long_Long_Float veri tiplerinin değerleri, S'Image niteliği yardımı ile sözel değerlere dönüştürülebilir. Bu nitelik birçok uygulamada sonuçların görüntülenmesinde kullanılmıştır.

Burada incelenen tüm özellikler, öntanımlı, Long_Float ve Long_Long_Float veri tiplerine de uygulanabilir.

Flaot gibi gerçek sayı veri tiplerine uygulanabilen çok sayıda sistem ile, sayıların makine sayısı olarak gösterimi ile ilgili nitelik de bulunmaktadır. Bu nitelikler, bu çalışmada incelenmeyecektir. Bunun nedeni, bu niteliklerin sonuçlarının normal kullanıcıları değil, bu konuda özel çalışma yapanları ilgilendirmekte olmasıdır.

Sistem yapısı ile ilgili nitelikler, sistemden sisteme değişen sonuçlar verirler ve bu konuda özel ihtisası olmayanların sonuçları değerlendirmesi olanağı yoktur. Bu sonuçlar, programlama ilgili değil sistem yapısı ile ilgilidir. Sadece sistem mimarisi ile ilgili çalışma yapanlar için bir anlam taşımaktadır.

Gerçek sayılar, üzerinde hata payı olan sayılardır. Bu sayılar üzerindeki hataların değerlendirilmesi sayısal analiz bilim kolunun bir konusudur. Çalışılan sayıların elde ediliş ve kullanım türleri üzerinde yeterli bilgi yoksa bu bilgiler öncelikle toplanmalı, uygulanabilecek yöntemler üzerinde gerekirse konunun uzmanlarına danışılmalıdır.

3.3.1.2 - Float Veri Tipi İçin Tanımlı İşlemciler

Float veri tipi için tanımlı işlemciler, aynen Integer veri tipi gibi, ilişkisel ve aritmetik işlemciler olarak iki tiptir. İlişkisel işlemciler karşılaştırma işlemcileri adı da verilir. Bu işlemciler, doğru veya yanlış şeklinde Boolean sonuçlar verirler. İlişkisel işlemciler, aynen Boolean veri tipinde incelemiş olduğumuz şekilde uygulanırlar.

Aritmetik işlemcilerin işlenenleri Float veri tipindedir ve sonuçları Float veri tipinde gerçekleşir. Sonuçlar, gerçek sayıların bilgisayar sistemindeki gösterimleri nedeni ile belirli bir hata içerir. Gerçek sayılar, hesaplama işlemlerinde tek kullanılan veri tipleridir. Tamsayı tipleri, çoğunlukla sayma işleri için kullanılır. Float veri tipine uygulanan işlemciler, rem ve mod dışında, Integer veri tipi için tanımlanmış işlemciler ile aynıdır. Bu işlemciler, aynen Integer veri tipinde incelemiş olduğumuz işlemciler gibi uygulanır.

Float veri tipinde veriler için işlenenleri root tipler olan çarpım ve bölüm işlemcileri kuramsal amaçlarla tanımlanmışlardır. Gerçek ifadelerde, Tamsayı veri tipleri ile Gerçek Sayı veri tiplerinin nesneleri aynı ifadelerde kullanılmaz.

3.3.4 - Short_Float

GNAT 2012 başka derleyicilerin destekleyebileceği, Short_Flaot veri tipini, uyum amacı ile, desteklemektedir. Bu veri tipi, 6 ondalık duyarlık değeri ile, Float veri tipinden farkı yoktur ve kullanımı için de hiçbir neden yoktur.

3.3.5 - Long_Float

GNAT 2012 derleyicisi Long_Float veri tipini desteklemektedir. Bu veri tipi, 32 bit genişlik ve 15 ondalık duyarlıkla, Float veri tipinde göre tercih edilecek gerçek sayı veri tipidir. Fakat, bu öntanımlı veri tipi yerine programların taşınabilrliğinde daha fazla kolaylık sağlamak ve modern trend nedeni ile kullanıcıların özgün tiplerini tanımlayarak uygulamaları sağlık verilmektedir.

3.3.6 - Long_Long_Float

GNAT 2012 derleyicisi, Long_Long_Float veri tipini desteklemektedir. Bu veri tipi, donanımın olanak sağlayabildiği en yüksek duyarlıkta gerçek sayı tipi olarak tanımlanmıştır. Donanım desteklediğinde bu veri tipi IEEE extended form kapasitesinde bir veri tipi olarak tasarımlanmıştır. Bu veri tipi, IA32 (X86) (Intel) (AMD) mimarilerinde, 80 bit genişletilmiş duyarlık (extended precision) ile işlem olanağı sağlayabilmektedir. GNAT 2012, 128 bitlik SPARK formatını desteklememektedir. Bunun nedeni, bu formatın donanıma değil yazılıma dayanmakta olması olarak açıklanmıştır.

Genel olarak öntanımlı Long_Long_Float veri tipi yerine, taşınma kolaylığı ve güncel eğilim dolayısı ile özgün gerçek sayı tiplerinin tanıtılıp kullanılmasının daha uygun olacağı belirtilmektedir.