Ada Programlama Dili Temelleri

Bölüm 3

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

Bölüm 3 Sayfa 5

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

Ada programlama dilinde, tamsayı olmayan sayısal veriler, gerçek sayılar (real numbers) olarak nitelendirilir. Gerçek sayılar, sadece skaler (tek boyutlu) değerlerdir, ayrık(discrete) ve sayılabilir (Enumeratif) değerler sayılmazlar. Ada programlama dili sadece on temelli sayı sistemindeki gerçek sayı veri tiplerini destekler. Gerçek sayıların tamsayı ve ondalıklı kısımları bulunur. İstenildiğinde bu sayılar üstel olarak da gösterilebilirler. Bu konuda sayısal literaller tanıtılırken örnekler yapılmıştı. Bu örneklerin yeniden incelenmesi yararlı olacaktır.

Gerçek sayı verilerin ondalık sayısına duyarlık (precision) adı verilir. Genel olarak duyarlık yüksek olunca hataların azalacağı düşünülürse de bu düşünce doğru değildir. Bir sayısal değerin üzerinde birden çok ve birbirinden farklı hata türü bulunmaktadır. Aritmetiik işlemden kaynaklanan yuvarlatma hatası, hata türlerinden sadece birisi ve değerin toplama hatasına belki de en az etki eden hata türüdür. İşlemlerin duyarlığı arttırılarak sonuçların yuvarlatma hataları azltılabilir. Fakat bu sayının üzerindeki tüm hatanın ortadan kalktığını göstermez. Gerçek yaşamda çoğu sayılar ölçü aletleri ile ölçümlerin sonuçları olarak elde edilir. Ölçü aletlerinin de duyarlığı çoğu zaman yüksek değildir. Bu nedenle hesaplarda uygulanmak istenen çok fazla sayısal duyarlık büyük bir çoğunlukla değerlerin alındığı ölçü aletlerinin duyarlığından çok fazladır. Örnek olarak pH hesaplarında aletsel duyarlık sadece 3 ondalıkla sınırlıdır ve aslında sadece ilk iki ondalık sağlam, üçüncüsü fazla güvenilir değildir. Bu nedenle, pH hesaplamalarında sonuçların iki ondalıkla verilmesi yeterlidir. Fazlası, sonucu verenin bilgisizliğini ortaya çıkarır. Bu örnek, tüm fiziksel sistemler için geçerlidir.

Sayılarla çalışması gereken ve çalışacakları sayının nasıl ölçüldüğünü, duyarlığının ne olğunu, bu konuda yayınlanmış önceki sonuçları bilmeyen bir kullanıcının öncelikle literatürden bu bilgileri toplaması ve incelemesi gerekir. Bundan sonra uygulanacak yöntemler ve sonuçların verileceği formatlar üzerine daha bilinçli olarak karar verilir.

Ada 2012 spesifikasyonu ile birlikte gelen Standard pakette iki tür gerçek sayı tanımlanmıştır. Bunlardan ilki, değişken duyarlıklı gerçek sayılar, ikincisi de sabit duyarlıklı (Fixed Point) gerçek sayılardır. Sabit duyarlıklı olan gerçek sayılar, ayrı bir kategoride inceleneceklerdir. Burada ilk olarak, en çok kullanım alanı olan, değişken duyarlıklı gerçek sayı veri tipleri incelenecektir.

Gerçek sayı veri tipleri, doğru (accurate) değerler olan tamsayı verilerine göre, hem daha fazla bellek alanı kullanırlar, hem de gerçek sayı ifadelerinin sonuçlarında belirli bir hata ( bağıl hata) oluşur. Yine de salt makine hesaplamalarından kaynaklanan hata payı, ölçüm hatalarına göre sonuçları tek başına etkileyecek büyüklükte değildir. Ada dahil tüm programlama dillerinde gerçek sayıların makinede tanımlanması için kabul edilen kanonik (kanon lat: kanun, yasa) gösterim şeklinde, sıfırdan farklı değerler için,

+/- mantis (T'Machine_Radix sayı temelinde) T'Machine_Radixeksponent(tamsayı)

Çalışılan IA32 (X86) (Intel) (AMD) mimarisinde, makine mimarisi (T'Machine_Radix) 2 (binary) olarak belirlenir. Bu durumda, gerçek sayıların x86 sisteminde kanonik gösterimi,

+/- mantis (ikili sayı temelinde tamsayı) 2eksponent(ikili sayı temelinde tamsayı)

olarak belirlenir. Bu gösterim şekli , gerçek sayılarla ilgili birçok gerçeğin açıklanmasında aydınlatıcı olmaktadır. İkil sistem sadece 1 ve 0 sayıları içeren rakkam sıralarıı tanıyabilir. Bu rakkam sıralarında, tek sayıya bit (0 veya 1) adı verilir. Konvansiyel olarak 23 = 8 bit içeren sıralara byte, belirli bir byte miktarına word adı verilir. Örnek olarak 32 bitlik bir word, 4 byte içerir.(4 x 8 = 32). Buradan tamsayılar için bir tek word alanı yeterli iken, gerçek sayıların makinye tanıtılması için, mantis değeri için bir ve eksponent değeri için de bir tane olmak üzere iki tane word alanı gerekli olur. Bu durumda, gerçek sayıların makinede hesaplanabilmeleri için, tamsayılardan fazla bellek alanına gereksinme olduğu anlaşılır. Yine gerçek sayıların kanonik gösteriminden, kullanıcının belirttiği gerçek sayı ile, makinede tanıtılabilen gerçek sayınının (makine sayısı) farklı olabileceği de anlaşılır. Yani, kullanıcının bellirttiği gerçek sayı, gerçek sayılarının makineye tanıtılabildikleri dizilimin, en uygun olanına indirgenerek makineye tanıtılabilir. genel kural, gerçek sayıların kanonik gösterimlerinde mantis sayısı ne kadar fazla olursa gerçek sayının duyarlığı da o kadar artar. Sonuçta, gerçek sayıların ifadeleri, çok sayıda makine komutu (instruction) ile gerçekleşen mantis-eksponent hesaplamaları ve sonuçların birleştirilmesi ile oluşan ve üzerinde hata olan değerler verebilir.

3.3.1 - root_real

Bu veri tipi aynı root_integer gibi bir kuramsal veri tipi olup kullanıma kapalıdır ve sadece matematiksel çelişkilerin giderilebilmesi amacı ile gerçek sayı tiplerinin en üst atası olarak tanımlanmıştır.

Kuramsal root_real tamsayı veri tipi, tüm tamsayı tiplerin en üst atası (ultimate ancestor) konumundadır. Sınırları sistemin olanak sağladığı en yüksek gerçek sayı sınır, duyarlık sınrları System.Max_Digits sınırları arasındadır. Bu değerler, derleyicinin yerleştirildiği çalışılan sistem karakteristiklerine bağlı doğrudan saptanma olanağı olmayan, kuramsal değerlerdir. Hiçbir gerçek sayı tipinin kapsam aralığı ve duyarlığı root_real tipinden geniş olamaz. root_real gerçek sayı veri tipi sadece matematiksel belirsizlilerin giderilmesi amacı ile oluşturulmuş olup programlarda veri tipi olarak tanımlanamaz. Kullanıcılar, gerçek programlama çalışmaları sırasında root_real veri tipi ile karşılaşmazlar.

3.3.2 - universal_real

Standard pakette tanımlanmış olan ikinci değişken duyarlıklı gerçek sayı veri tipi, universal_real veri tipidir. Bu veri tipi, root_real veri tipinin alt tipidir. En küçük ve en büyük değerleri root_real ile aynıdır. Standard pakette tanımlanmış olan universal_real veri tipi, tüm gerçek sayı tipleri için sınıf boyu (class wide) tip olarak tanımlıdır ve bu özelliği ile tüm gerçek sayı veri alt veri tipleri ile uyumludur, fakat kullanıcılar tarafından değişken tipi olarak tanımlanamaz ve alt tipleri oluşturulamaz. Matematiksel olarak, tüm tanım aralığındaki gerçek sayıların ve işlemcilerin birleşimi (union) ile oluşan bir küme olarak tanımlanır. universal_real Veri tipi tam olarak kuramsal değildir. Programlarda, gerçek sayı literalleri universal_real veri tipindedir. Ayrıca, gerçek sayı veri tipine uygulanabilen birçok nitelik değerinin döndürdüğü değerler yine universal_real tipindedir. Programcılar çok az kullanılan bazı alt düzey işlemler dışında universal_real veri tipi ile sadece bu değerlerlerde karşılaşırlar. Programcıların universal_real veri tipinde nesneler ve alt veri tipleri tanımlayamazlar. universal_real Veri tipinin kendine ait alt programlar tanımlı değildir fakat, universal_real veri tipleri tüm, root_real veri tipinin alt tipleri le uyumludur. Bu nedenle, tüm gerçek sayı nesneleri ile aynı işlemcileri paylaşabilir, aynı ifadelerde bulunabilir ve değişkenlerine atanabilirler.

3.3.3 - Float

Standard pakette tanımlı ve kullanıcıların yararlanabileceği, root_real 'in kısıtsız (unconstrained) bir alt tipi, öntanımlı Float veri tipidir. Float veri tipi, irrasyonel sayıların, kuramsal olarak sınırsız, gerçekte ise makinenin sağlayabildiği olanaklar ile sınırlı olan en geniş kapsamlı göreli (rölatif) duyarlıklı gerçek sayı veri tipidir. Kullanıcılar bu veri tipinden değişkenler tanımlayabilir ve bu tipin kendilerine özgü alt tiplerini yaratabilirler.

Float öntanımlı veri tipi Standart pakette aşağıda görüldüğü gibi tanımlanmıştır.

   -- The floating point type root_real and the
   -- corresponding universal type universal_real are predefined.
 
   type Float is digits implementation-defined;
 
   -- The predefined operators for this type are as follows:
 
   -- function "="   (Left, Right : Float) return Boolean;
   -- function "/="  (Left, Right : Float) return Boolean;
   -- function "<"   (Left, Right : Float) return Boolean;
   -- function "<="  (Left, Right : Float) return Boolean;
   -- function ">"   (Left, Right : Float) return Boolean;
   -- function ">="  (Left, Right : Float) return Boolean;
 
   -- function "+"   (Right : Float) return Float;
   -- function "-"   (Right : Float) return Float;
   -- function "abs" (Right : Float) return Float;
 
   -- function "+"   (Left, Right : Float) return Float;
   -- function "-"   (Left, Right : Float) return Float;
   -- function "*"   (Left, Right : Float) return Float;
   -- function "/"   (Left, Right : Float) return Float;
 
   -- function "**"  (Left : Float; Right : Integer'Base) return Float;
 
   -- The specification of each operator for the type root_real, or for
   -- any additional predefined floating point type, is obtained by
   -- replacing Float by the name of the type in the specification of the    -- corresponding operator of the type Float.
 
   -- In addition, the following operators are predefined for the root
   -- numeric types:
 
   function "*" (Left : root_integer; Right : root_real)
     return root_real;
 
   function "*" (Left : root_real;    Right : root_integer)
     return root_real
 
   function "/" (Left : root_real;    Right : root_integer)
     return 

Float tipi ve alt tiplerinin makine sayısı (machine number) makinenin algıladığı, bu tipin kısıtsız örneklerinin sayısal değeridir. Aynı örneklerin tanım aralığı olarak tanımlanan temel tanım aralığı (base range), Float tipler için, 0 etrafında simetriktir, sadece bazı yerleşimlerde negatif tarafta ek tanım aralığı olabilir.

Float tipi ve alt tiplerinin temel ondalık duyarlığı (base decimal precision), bu tipin tüm örneklerinin içerdiği ondalık duyarlık sayısıdır. GNAT 2012 derleyicisinde, Float tipi için duyarlık 6, Long_Float için duyarlık 15 ondalık olarak belirlenmiştir. Long_Long_Float veri tipi için donanımın desteklediği en üst duyarlık değeri uygulanmıştır. Çalıştığımız sistemde bu 18 ondalık olarak belirlenmiştir. Duyarlık konusuna dikkatle yaklaşılmalıdır. Verilerin kaynaklandığı ölçüm cihazları (sensörler) aslında çoğunlukla ölçüm hata eşiği yüksek cihazlardır. Bu sensörlerden alınacak veriler için, aşırı duyarlıkta algoritmaların uygulanması, yanıltıcı bir sanal gerçeklik duygusu yaratabilir. Sonuçlar, algoritmalara katılan verilerin en azından en çok hatalısı kadar hata payı içerir. Duyarlık uygulanırken veya sonuçların duyarlıkları saptanırken daima kullanılanılan verilerin uygulanan duyarlıkla uyum içinde olup olmadığı düşünülmeli ve sonuçlar gerçekte ölçüm cihazları ile desteklenebildiğinden çok ondalık sayısı ile verlimemelidir.

Float veri tipi öntanımlı ondalıklı (real) bir tiptir. Ada programlama dilinde sadece on temelli sayılar noktalı sayılar olarak uygulanabilir. Noktalı sayılar (real numbers) matematik hesaplarda kullanılabilen veri tipleridir. Ada programlama dilinde büyük çapta matematik desteği ve öntanımlı matematik paketi bulunmaktadır. Bu hesaplamalar için öntanımlı veya kullanıcı tanımlı gerçek sayı veri tipleri kullanılır. Gnat 2012 öntanımlı olarak, Short_Float (Float ile aynıdır), Float, Long_Float, long_Long_Float veri tipilerini tanımılar. Kullanıcılar bu veri tiplerinden yararlanarak, kendileri için gerekli duyarlık ve kapsamda özgün gerçek sayı veri tipleri yaratıp kullanabilirler.

Float veri tipinin değerlerinin standart çıkış cihazında (genel olarak monitor) görüntülenmesinin sağlandığı bir giriş/çıkış paketi, Ada.Text_IO paketindeki soysal (generik) Ada.Text_Float_IO(num) alt paketinin Float veri tipi için örneklenmesi ile Ada.Float_Text_IO(num) paketi öntanımlı olarak kullanıcıların kullanımına açılmıştır. Bu öntanımlı paketin tanıtımı ve uygulanması, ek2-s3 de açıklanmıştır. Long_Float ve Long_Long_Float öntanımlı veri tipleri içinde aynı şekilde Ada.Long_Float_Text_IO(num) ve Ada.Long_Long_Float_Text_IO(num) öntanımlı paketleri tanımlanmıştır ve hepsinin kullanımı yöntemi Ada.Float_Text_IO(num) paketi ile aynıdır.

Float veri tipinin sayıları yuvarlatma özelliğinin belirlenmesi için aşağıdaki prosedür çalıştırılmıştır.

with Ada.Text_IO;
with Ada.Float_Text_IO;

procedure  b3_3_3_uyg_1 is

   Float_Değer_1 : constant Float := 4.5555;

   Float_Değer_2 : constant Float := 4.4445;

begin

   Ada.Text_IO.Put(Item => "Float Değer  : " );

   Ada.Float_Text_IO.Put(Item => Float_Değer_1, Fore => 1 , Aft => 4 , Exp => 0);

   Ada.Text_IO.Put(Item => " Yuvarlatılmış Değer =>   ");

   Ada.Float_Text_IO.Put(Item => Float_Değer_1 , Fore => 1 , Aft => 3 , Exp => 0);

   Ada.Text_IO.New_Line;

   Ada.Text_IO.Put(Item => "Float Değer  : " );

   Ada.Float_Text_IO.Put(Item => Float_Değer_2, Fore => 1 , Aft => 4 , Exp => 0);

   Ada.Text_IO.Put(Item => " Yuvarlatılmış Değer =>   ");

   Ada.Float_Text_IO.Put(Item => Float_Değer_2 , Fore => 1 , Aft => 3 , Exp => 0);

end b3_3_3_uyg_1;

Bu programın sonucu,

Float Değer  : 4.5555 Yuvarlatılmış Değer =>   4.556
Float Değer  : 4.4445 Yuvarlatılmış Değer =>   4.444

olmaktadır.
		

Yukarıdaki prosedürden alınan sonuçlar çok önemlidir ve Ada programlama dilinin gerçek sayı verilerin gösterimini kayma engelleyici yuvarlatma yöntemi uygulayarak gerçekleştiğini belirtmektedir. Kayma engelleyici yuvarlatma yöntemi, (unbiased rounding) eğer yuvarlatılacak sayı, alt ve üst değerler arasında ise sayının en yakın tamsayıya yuvarlaılmasını öngörür. Kayma önleyici yuvarlatma yöntemi, sonuçlardaki yuvarlatma hatasının bir yöne doğru yığılmasının önlenmesi amacı ile uygulanan en değerli yuvarlatma yöntemidir.

3.3.3.1 - Float Veri Tipine Uygulanabilen Nitelikler

Flaot veri tipi, skaler (tek boyutlu) bir veri tipidir. Bu nedenle skaler veri tiplerine uygulanabilen tüm nitelikler Float gibi gerçek sayı tiplerine de uygulanabilir. Bunu dışında gerçek sayılar için uygulanabilen nitelikler de bulunmaktadır. Bazı gerçek sayı nitelikleri sistem ile ilgilidir ve fazla uygulama alanı yoktur. Burada programlarda uygulanma olasılığı yüksek olan nitelikler üzerinde duracağız. İlk olarak, öntanımlı Float, Long_Float ve Long_Long_Float veri tiplerinin ondalık duyarlıkları ve güvenli çalışma aralığı niteliklerini inceleyeleceğiz.

Bir prosedür ile Float, Long_Float ve Long_Long_Float öntanımlı veri tiplerinin, öntanımlı ondalık duyarlıkları ile çalışılan sistemde güvenli kapsam aralıklarının alt ve üst sınırlarını sorgulayalım:

with Ada.Text_IO;
with Ada.Integer_Text_IO;
with Ada.Float_Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Long_Long_Float_Text_IO;

procedure  b3_3_3_1_uyg_1 is

begin

Ada.Text_IO.Put(Item => "Float Veri Tipinin Öntanımlı Ondalık Duyarlığı : ");

Ada.Text_IO.Set_Col(To => 81);

Ada.Integer_Text_IO.Put(Item => Float'Digits);

Ada.Text_IO.Put(Item => "  Ondalık");

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Long Float Veri Tipinin Öntanımlı Ondalık Duyarlığı : ");

Ada.Text_IO.Set_Col(To => 75);

Ada.Integer_Text_IO.Put(Item => Long_Float'Digits);

Ada.Text_IO.Put(Item => "  Ondalık");

Ada.Text_IO.New_Line;

Ada.Text_IO.Put("Long_Long_Float Veri Tipinin Öntanımlı Ondalık Duyarlığı : ");

Ada.Text_IO.Set_Col(To => 68);

Ada.Integer_Text_IO.Put(Item => Long_Long_Float'Digits);

Ada.Text_IO.Put(Item => "  Ondalık");

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Float Veri Tipinin Alt Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 90);

Ada.Float_Text_IO.Put(Item => Float'Safe_First, Fore => 0 , Aft => Float'Digits , Exp => 0);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Float Veri Tipinin Alt Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 90);

Ada.Float_Text_IO.Put(Item => Float'Safe_First, Fore => 1 , Aft => Float'Digits , Exp => 3);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Long Float Veri Tipinin Alt Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 85);

Ada.Long_Float_Text_IO.Put(Item => Long_Float'Safe_First, Fore => 1 , Aft => Long_Float'Digits , Exp => 3);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Long_Long Float Veri Tipinin Alt Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 79);

Ada.Long_Long_Float_Text_IO.Put(Item => Long_Long_Float'Safe_First, Fore => 1 , Aft => Long_Long_Float'Digits , Exp => 3);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Float Veri Tipinin Üst Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 90);

Ada.Float_Text_IO.Put(Item => Float'Safe_Last, Fore => 0 , Aft => Float'Digits , Exp => 0);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Float Veri Tipinin Üst Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 90);

Ada.Float_Text_IO.Put(Item => Float'Safe_Last, Fore => 1 , Aft => Float'Digits , Exp => 3);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Long Float Veri Tipinin Üst Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 85);

Ada.Long_Float_Text_IO.Put(Item => Long_Float'Safe_Last, Fore => 1 , Aft => Long_Float'Digits , Exp => 3);

Ada.Text_IO.New_Line;

Ada.Text_IO.Put(Item => "Long_Long Float Veri Tipinin Üst Güvenli Kapsam Sınırı  : ");

Ada.Text_IO.Set_Col(To => 79);

Ada.Long_Long_Float_Text_IO.Put(Item => Long_Long_Float'Safe_Last, Fore => 1 , Aft => Long_Long_Float'Digits , Exp => 3);

Ada.Text_IO.New_Line;

end b3_3_3_1_uyg_1;

Bu programın sonucu,

Float Veri Tipinin Öntanımlı Ondalık Duyarlığı :                                          6  Ondalık
Long Float Veri Tipinin Öntanımlı Ondalık Duyarlığı :                                15  Ondalık
Long_Long_Float Veri Tipinin Öntanımlı Ondalık Duyarlığı :                      18  Ondalık

Float Veri Tipinin Alt Güvenli Kapsam Sınırı  :                                          -340282346638528860000000000000000000000.000000
Float Veri Tipinin Alt Güvenli Kapsam Sınırı  :                                          -3.402823E+38
Long Float Veri Tipinin Alt Güvenli Kapsam Sınırı  :                                  -1.797693134862316E+308
Long_Long Float Veri Tipinin Alt Güvenli Kapsam Sınırı  :                         -1.189731495357231770E+4932

Float Veri Tipinin Üst Güvenli Kapsam Sınırı  :                                          340282346638528860000000000000000000000.000000
Float Veri Tipinin Üst Güvenli Kapsam Sınırı  :                                          3.402823E+38
Long Float Veri Tipinin Üst Güvenli Kapsam Sınırı  :                                  1.797693134862316E+308
Long_Long Float Veri Tipinin Üst Güvenli Kapsam Sınırı  :                         1.189731495357231770E+4932

olmaktadır.
		

Yukarıdaki prosedürden, çok önemli sonuçlar alınmıştır. Buradan Float veri tipinin kapsam ve duyarlık açısından öntanımlı gerçek sayı tipleri arasında en mütevazi olan tip olduğu görülmektedir. Long_Float daha geniş duyarlık ve kapsam da ve JavaScript sayısal tipine denk gelen bir veri tipidir. Long_Long_Float öntanımlı gerçek sayı veri tipi ise, hem duyarlık hem de destekleyebildiği kapsam alanı açısından, gerçekten göz kamaştırıcı değerlere sahiptir. Sonuçlar aşağıdaki tabloda toplanmıştır.

Öntanımlı Gerçek Sayı Veri Tiplerinin Karakteristikleri
Veri Tipi Duyarlık Güvenli Kapsam Alt Sınırı Güvenli Kapsam Üst Sınırı
Float 6 -3.402823E+38 3.402823E+38
Long_Float 15 -1.797693134862316E+308 1.797693134862316E+308
Long_Long_Float 18 -1.189731495357231770E+4932 1.189731495357231770E+4932

Yukarıdaki tablodaki sonuçlardan, Float veri tipi için öntanımlı requested precision değeri olan 6 ondalık,değerinin verilen,

ceiling(d * log(10) / log(T'Machine_Radix)) + g <= T'Model_Mantissa
		

kriteryumunun sağlanıp sağlanmadığını kontrol edelim. Burada ileride saptayacağımız gibi, çalışılan sistemin mimarisi 2 temelli sayı sistemi (binary) olduğundan g = 1 olacaktır. Yine ileride saptayacağımız gibi, Float veri tipi için, Model_Mantissa = 24 değerindedir. Ceiling (tavan) gerçek sayıların değerlerinin en yüksek tamsayı eşdeğerine yükseleltilmeleri işlemidir. Buradan

ceiling(6 * log(10) / log(2)) + 1 = 21 ( 21 < 24 )
		
ceiling(7 * log(10) / log(2)) + 1 = 25 ( 25 > 24 )
		

olarak bulunur ve Float tipinin gerçekleşebilecek en yüksek requested precision değerinin 6 ondalıkta kalacağı görülür. Uygulamalarda, Float tipinin işlem sonuçlarının 6 ondalıktan fazla görüntülenmemesi uygun olur. Gözlemlerimiz, Float veri tipinin hesaplarında 8 haneye kadar bozulma görülmediği şeklindedir. Yine de 6 haneden fazlasına itibar etmemek güvenli olacaktır.

Bilgisayarlarla yürütülen aritmetik işlemlerde bazı durumlarda, nisbeten büyük bir sayıya çok çok küçük bir başka sayı eklenmek istendiğinde, eğer eklenmek istenen sayı makinenin algılayabileceğinden daha küçükse, değeri toplama yansımayabilir. buna aritmetik duyarsızlık (underflow) adı verilir. Bazı durumlarda ise işlemin sonucu, aşırı büyük sayılar oluşturabilir. Buna aritmetik taşma (overflow) adı verilir. Aritmetik taşma sonunda bir değer kapsam sınırını aşarsa, derleyici kapsam hatası oluşturur. Bazı durumlarda, örnek olarak denklemlerin köklerinin sayısal yöntemle bulunmasında, sayılar arası farkların (epsilon) incelenmesi gerekir. Genel olarak, eğer kullanılan veri tiürünün duyarlığı D ise , makinenin algılayabileceği epsilon olarak kullanılabilecek en düşük değerin 10-D olacağı kabul edilr. Yani 6 ondalık duyarlığı olan Float veri tipi kullanılarak yapılan çalışmalarda, epsilon olarak 0.00001 değerinin alınması uygun olacaktır. Bazı fonksiyon yaklşım problerinde, epsilon değerinin azaltılabilmesi için yüksek duyarlık ondalık sayılı veri tipleri bu nedenle tercih edilmektedir.

Sonucu 0 olan ifadeler, pozitif veya negatif yönden sıfıra ulaşmış olabilirler. Derleyicinin çalışmakta olduğu donanım, işaretli sıfırları desteklerse, derleyici işaretli sıfırları kullanabilir. İşaretli sıfırlar, hesaplarda normal 0 olarak hareket ederler. Derleyicinin çalışmakta olduğu donanımın işaretli sıfırları destekleyip desteklemediği, bir T tipi için, S'Signed_Zeros niteliği ile sorgulanabilir. Bu niteliğin tanımı aşağıda görülmektedir.

Bu niteliğin değerini belirlemek için aşağıda görülen prosedür uygulanmıştır.

with Ada.Text_IO;

procedure  b3_3_3_1_uyg_2 is

   package Boolean_IO is new Ada.Text_IO.Enumeration_IO(enum => Boolean);
   
   Küçük_Harf : Ada.Text_IO.Type_Set := Ada.Text_IO.Lower_Case;
   
   use type Ada.Text_IO.Type_Set;
   
   begin
   
      Ada.Text_IO.Put(Item => "İşaretli Sıfırlar Dstekleniyor Mu ? :  ");
   
      Boolean_IO.Put(Item => Float'Signed_Zeros, Width => 10, Set => Küçük_Harf);
   
end b3_3_3_1_uyg_2;


Bu programın sonucu,

İşaretli Sıfırlar Dstekleniyor Mu ? :  true     

olmaktadır. Bu sonuç işaretli sıfırların donanım tarafından desteklendiğini belirtmektedir.
		

Gerçek sayı veri tiplerinin nesnelerinin derleyici tarafından algılanan değerleri, S'Machine niteliği ile sorgulanabilir. Bu niteliğin tanımı aşağıda görülmektedir.

function S'Machine (X : T)
return T
		

Öntanımlı Float, Long_Float ve Long_Long_Float veri tipinden nesnelerin makine sayılarının sorgulanması aşağıdaki prosedürde uygulanmıştır.

with Ada.Text_IO;
with Ada.Float_Text_IO;
with Ada.Long_Float_Text_IO;
with Ada.Long_Long_Float_Text_IO;

procedure  b3_3_3_1_uyg_3 is

F: Float := 2.123456E-8;

L_F : Long_Float := 2.123456789012345E138;

L_L_F : Long_Long_Float := 2.123456789012345678E3156;

begin

   Ada.Text_IO.Put(Item => " Float Veri : 2.123456E-8 , Makine Değeri : ");
   
   Ada.Float_Text_IO.Put(Item => Float'Machine(F) , Fore => 1 , Aft => 6 , Exp => 1);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => " Long_Float Veri : 2.123456789012345E138 , Makine Değeri : ");
   
   Ada.Long_Float_Text_IO.Put(Item => Long_Float'Machine(L_F) , Fore => 1 , Aft => 15 , Exp => 3);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put(Item => " Long_Long_Float Veri : 2.123456789012345678E3156 , Makine Değeri : ");
   
   Ada.Long_Long_Float_Text_IO.Put(Item => Long_Long_Float'Machine(L_L_F) , Fore => 1 , Aft => 18 , Exp => 4);
   

end b3_3_3_1_uyg_3;

Bu programın sonucu,

 Float Veri : 2.123456E-8 , Makine Değeri : 2.123456E-8
 Long_Float Veri : 2.123456789012345E138 , Makine Değeri : 2.123456789012345E+138
 Long_Long_Float Veri : 2.123456789012345678E3156 , Makine Değeri : 2.123456789012345680E+3156

olmaktadır.
		

Yukarıdaki prosedürde, alınmış olan sonuçlarda Float ve Long_Float veri tiplerinde, kullanıcı değeri ve makine değeri arasında hiçbir fark yaşanmamış olduğunu belirtmektedir. Fakat bu hiçbir farklılık yaşanmayacağının garantisi değildir. Belki kapsam sınırına daha yakın değerlerde değişik davranışlar gözlenebilir. Long_Long_Float verisinde ise gözlenebilen bir bozulma olmuştur. Bu veri tipinin 17 ve 18 inci karakterleri yukarıya doğru yuvarlatılmıştır. Fakat, donanımın çok sıradan, sayının çok yüksek, duyarlığın çok büyük ve bozulmanın da çok küçük olduğu gözönüne alınırsa, yaşanan bozulmanın fazla bir sorun olmayacağı düşünülebilir. Doğal olarak bozulmanın önemli olup olmadığı çalışılan konuya bağlıdır. Yine de onyedinci ondalık değerinin etkileyebileceği fiziksel olay sayısı fazla değildir. Donanımın değişmesi ile birlikte bu hatanın azalması olasığı da her zaman vardır.

Devam =========>