الجداول

من الأشياء التي تفيدنا الحلقات فيها هو توليد وطباعة البيانات المجدولة. مثلاً، قبل توفر الحواسيب بسهولة، كان البشر مضطرين لحساب الخوارزميات، الجيب والتجيب (جيب التمام)، وتوابع رياضية شائعة أخرى يدوياً.
لتسهيل العملية، وجدت كتب تحوي جداول طويلة يمكنك أن تجد فيها قيم التوابع المختلفة. كان عملية إنشاء هذه الجداول طويلة ومملة، وغالباً ما كانت النتائج كلها أخطاء.
عندما دخلت الحواسيب على الساحة، كان أحد ردود الفعل المبدئية هو، "هذا عظيم! يمكننا استخدام الحواسيب لتوليد الجداول، وبذلك لن توجد فيها أي أخطاء". تبين فيما بعد أن ذلك كان صحيحاً (أغلب الأحيان)، لكنه قليل التبصر. فسرعان ما عم انتشار الحواسيب (والآلات الحاسبة) حتى أصبحت الجداول منتهية الصلاحية.
حسن، ليس تماماً. تبين فيما بعد أنه من أجل بعض العمليات، تستعمل الحواسيب جداول للقيم للحصول على أجوبة تقريبية، ثم تنفذ حسابات لتحسين نسبة التقريب. في بعض الحالات، وجدت أخطاء في الجداول التحتية، ومن أكثر تلك الحالات شهرة الخطأ في الجدول الذي استخدمه معالج إنتل بنتيوم الأول لتنفيذ عملية القسمة على الأعداد العشرية
على الرغم من أن "جدول اللوغاريتم" لم يعد مفيداً كما كان، فلا يزال مثالاً جيداً على التكرار. البرنامج التالي يطبع سلسلة من القيم في العمود الأيسر ولوغاريتماتها في العمود الأيمن:
كود:
double x = 1.0;
while (x < 10.0) {
  System.out.println (x + "   " + Math.log(x));
  x = x + 1.0;
}
إن خرج هذا البرنامج هو:
1.0 0.0
2.0 0.6931471805599453
3.0 1.0986122886681098
4.0 1.3862943611198906
5.0 1.6094379124341003
6.0 1.791759469228055
7.0 1.9459101490553132
8.0 2.0794415416798357
9.0 2.1972245773362196
بالنظر إلى هذه القيم، هل يمكنك معرفة الأساس الذي يستخدمه تابع log افتراضياً؟
نظراً لأن قوى العدد اثنين مهمة جداً في علوم الحاسوب، غالباً ما نرغب بحساب اللوغاريتمات ذات الأساس 2. لمعرفة هذه، يمكننا استخدام المعادلة التالية:
log2 x = loge x / loge 2 (7.1)
بتغيير تعليمة الطباعة إلى
كود:
System.out.println (x + "   " + Math.log(x) / Math.log(2.0));
يعطي
1.0 0.0
2.0 1.0
3.0 1.5849625007211563
4.0 2.0
5.0 2.321928094887362
6.0 2.584962500721156
7.0 2.807354922057604
8.0 3.0
9.0 3.1699250014423126
يمكنك أن ترى أن 1، 2، 4 و8 هي قوى العدد 2، لأن لوغاريتماتها ذات الأساس 2 هي أعداد صحيحة. إذا أردت معرفة لوغاريتمات قوى العدد اثنين الأخرى، يمكننا تعديل البرنامج كما يلي:
كود:
double x = 1.0;
while (x < 100.0) {
  System.out.println (x + "   " + Math.log(x) / Math.log(2.0));
  x = x * 2.0;
}
الآن بدلاً من إضافة شيء ما إلى x في كل مرة تدور فيها الحلقة، ما يعطي متتالية حسابية، نضرب x بشيء ما، سيعطينا هذا متتالية هندسية. النتيجة هي:
1.0 0.0
2.0 1.0
4.0 2.0
8.0 3.0
16.0 4.0
32.0 5.0
64.0 6.0
قد لا تكون جداول اللوغاريتم مفيدة الآن، لكن بالنسبة لعالم كمبيوتر، فإن معرفة قوى 2 مهمة! في وقت ما عندما تملك دقيقة فراغ، عليك حفظ قوى الاثنين حتى 65536 (هذا يساوي 216).


انظر http://en.wikipedia.org/wiki/Pentuim_FDIV_bug.