تبدو العائلة الهندسية في Excel وكأنها أسهل ركن في مرجع الدوال. تحول دالة DEC2BIN الرقم إلى سلسلة ثنائية. بينما تعيدها دالة HEX2DEC مرة أخرى. وتجمع دالة IMSUM عددين مركبين. يبدو كل منها وكأنه تمرين تنسيق. لكنهم ليسوا كذلك. خلف هذه الأسماء يكمن ترميز متمم ثنائي من عشرة بتات لم يلمسه معظم المطورين منذ درس بنية الكمبيوتر، وتنسيق أعداد مركبة يعيش بالكامل داخل سلاسل نصية، ومعاملات بتات ستتجاوز بصمت عدد صحيح 64 بت إذا قمت بالإزاحة قبل التحقق. محرك جداول البيانات الذي يعيد إنتاج Excel تماماً لا يمكنه التقريب في أي جزء من هذا.
تنقسم الدوال إلى ثلاث مجموعات، وتخفي كل مجموعة فخاً مختلفاً. يتعلق تحويل القواعد بالأرقام السالبة والحدود لكل قاعدة. وتتعلق الرياضيات المركبة بتحليل وتنسيق السلسلة النصية. وتتعلق عمليات البتات بالبقاء داخل حدود Int64. يستعرض هذا المقال كل مجموعة كما ينفذها HotXLS، مع استدعاءات ورقة العمل التي ستكتبها بالفعل.
تحويل القواعد والمتمم الثنائي ذو العشرة بتات
الاتجاه المباشر هو الجزء الذي يتوقعه الجميع. تعطي DEC2BIN(9) النتيجة "1001"، ويقوم وسيط ثانٍ اختياري بحشو النتيجة من اليسار إلى عرض ثابت. الفخ هو الإدخال السالب. لا يكتب Excel علامة ناقص. بل يرمز القيمة كسلسلة متمم ثنائي من عشرة أرقام في القاعدة المستهدفة، وهذا هو السبب في أن DEC2BIN(-5,10) تعيد "1111111011" بدلاً من أي شيء يحمل علامة. ويتم تجاهل وسيط الأماكن (places) بمجرد أن تكون القيمة سالبة، لأن الترميز مثبت بالفعل عند عشرة أرقام.
عشرة أرقام هي ميزانية ثابتة، وتحدد تلك الميزانية النطاق القابل للتمثيل لكل قاعدة. في النظام الثنائي، المقدار الذي يقلب إلى النصف السالب هو 512، ومعامل الالتفاف هو 1024، لذا تكون السلسلة الثنائية ذات علامة فقط عندما يبلغ طولها عشرة أحرف بالضبط وتكون قيمتها 512 على الأقل. نفس الفكرة تتدرج مع القاعدة. يستخدم النظام الثماني عتبة نصف تبلغ 2^29 ومعامل كامل يبلغ 2^30. ويستخدم النظام الست عشري 2^39 و2^40. يطبق قارئ HotXLS هذه القاعدة بالضبط: فهو يراكم الأرقام، وفقط عندما يكون عرض السلسلة عشرة أحرف وتكون القيمة المتراكمة مساوية لعتبة النصف أو أعلى منها، فإنه يطرح المعامل الكامل لاستعادة القيمة ذات العلامة. السلسلة المكونة من تسعة أحرف تكون دائماً غير سالبة، بغض النظر عن حجمها.
المرمز هو الصورة المعاكسة. يتم تحويل القيمة غير السالبة رقماً برقماً وتُحشى اختيارياً بالأصفار إلى العرض المطلوب، ويتم رفضها إذا تجاوزت السقف الإيجابي للقاعدة أو إذا كان العرض المطلوب ضيقاً جداً لاحتوائها. ويتم أولاً جلب القيمة السالبة إلى النطاق عن طريق إضافة المعامل الكامل، مما يحولها إلى قيمة يكون تمثيلها الأساسي دائماً عشرة أرقام، ثم يتم إرسال الأرقام مع أصفار بادئة لملء العرض. فحص النطاق المشترك الوحيد، والحدود الدنيا والعليا المتناظرة لكل قاعدة، هو ما يحافظ على اتساق دوال DEC2BIN وDEC2OCT وDEC2HEX مع بعضها البعض عند حوافها.
هذا يترك التحويلات عبر القواعد، مثل HEX2BIN وOCT2HEX التي تغير القاعدة دون المرور بالنظام العشري في اسم الدالة. لا يحمل التنفيذ روتيناً منفصلاً لكل زوج مرتب. بل يقوم بتحليل سلسلة الإدخال إلى قيمة عشرية ذات علامة باستخدام القاعدة المصدر، ثم ينسق تلك القيمة العشرية في القاعدة الوجهة. النظام العشري هو المحور. روتين تحليل واحد وروتين تنسيق واحد، متكاملان، يغطيان كل تركيبة، ولأن كلا النصفين يشتركان في نفس اصطلاح العلامة المكون من عشرة أرقام، فإن القيمة السالبة تنجو من الرحلة مع بقاء علامتها سليمة.
الأعداد المركبة هي سلاسل نصية، لذا العمل يتركز على التحليل
لا يحتوي Excel على نوع بيانات مركب. القيمة المركبة هي السلسلة "a+bi"، وتأخذ كل دالة في عائلة IM تلك السلاسل وتعيد واحدة. تبني دالة COMPLEX السلسلة من جزء حقيقي وجزء تخيلي. وتقوم دوال IMSUM وIMSUB وIMPRODUCT وIMDIV بتحليل وسائطها، وإجراء الحساب على الأجزاء الرقمية، وتنسيق النتيجة مرة أخرى في سلسلة نصية. العمل الرقمي هو جبر جامعي بسيط. وتكمن الصعوبة بالكامل في تحويل النص إلى رقمين ذوي نقطة عائمة بشكل موثوق، وهذا هو المكان الذي يثبت فيه المحلل الداخلي قيمته.
هناك تفصيلان في هذا المحلل من السهل الوقوع في الخطأ فيهما. الأول هو الوحدة التخيلية المجردة. تعني السلسلة "i" مرة واحدة i، وليس صفراً وليس خطأ، لذا عندما يكون المعامل أمام اللاحقة فارغاً أو علامة زائد بمفردها، يجب على المحلل قراءته كقيمة 1، وعلامة ناقص بمفردها كـ -1. تخط ذلك وستتوقف IMSUM("i","i") عن كونها 2i. والثاني هو تداخل التدوين العلمي مع العلامة التي تفصل بين الجزء الحقيقي والتخيلي. يعثر المحلل على هذا الفاصل عن طريق مسح لعلامة زائد أو ناقص، ولكن الرقم المكتوب كـ "1.5E-3" يحتوي على علامة ناقص تنتمي إلى الأس. لذلك يرفض المسح معاملة الزائد أو الناقص كفاصل عندما يكون الحرف الذي يسبقه مباشرة هو e أو E. وبدون هذا الحارس، سيتم تمزيق الجزء الحقيقي إلى نصفين عند علامة الأس ويفشل التحليل على إدخال صالح تماماً.
يتم الاحتفاظ باللاحقة نفسها بدلاً من توحيدها. يقبل Excel كلاً من i وj، ويتذكر HotXLS أيهما استخدم الإدخال بحيث تحمل النتيجة المنسقة نفس الحرف. يطبق التنسيق بعد ذلك الاختصارات التقليدية: الجزء التخيلي بقيمة واحد يطبع كلاحقة فقط، وسالب واحد كـ -i، وينهار الجزء التخيلي الصفري إلى حقيقي مجرد، ويسقط الجزء الحقيقي الصفري الجزء البادئ 0+.
var
Book: TXLSXWorkbook;
Sheet: TXLSXWorksheet;
begin
Book := TXLSXWorkbook.Create;
try
Sheet := Book.Sheets.Add('Engineering');
// Negative input: a ten-bit two's complement, places argument ignored.
Sheet.Cells[1, 1].Value := Sheet.Calculate('=DEC2BIN(-5,10)'); // 1111111011
// Complex multiply on two "a+bi" strings.
Sheet.Cells[2, 1].Value := Sheet.Calculate('=IMPRODUCT("3+4i","1+2i")'); // -5+10i
finally
Book.Free;
end;
end;
الدوال المركبة المتسامية، من بينها IMSQRT وIMEXP وIMLN وIMPOWER، لا تعمل في الإحداثيات المستطيلة. بل تقوم بتحويل القيمة المحللة إلى الشكل القطبي، وتطبق العملية على المقياس والسعة، ثم تعود مرة أخرى. نصف القطر التربيعي ينصف السعة ويأخذ جذر المقياس. والقوة تضاعف السعة وترفع المقياس. والقيام بذلك بأي طريقة أخرى يعني إعادة اشتقاق كل متطابقة في شكل مستطيل، وهو ما يمثل كوداً أكثر واستقراراً عددياً أقل بالقرب من نقاط التفرع.
معاملات البتات والتجاوز الذي يجب عليك التحقق منه أولاً
أضاف إصدار Excel 2013 دوال BITAND وBITOR وBITXOR وBITLSHIFT وBITRSHIFT. المعاملات مقيدة: يجب أن يكون كل منها عدداً صحيحاً غير سالب لا يزيد عن 2^48 ناقص 1، وأي وسيط كسر أو سالب يمثل خطأ رقمياً. هذا الحد سخي بما يكفي لتغطية أي مجموعة أعلام واقعية مع البقاء تماماً داخل النطاق القابل للتمثيل بدقة لعدد مزدوج الدقة (double)، وهو أمر مهم لأن Excel يمرر كل وسيط رقمي كقيمة ذات نقطة عائمة.
تحمل دوال الإزاحة قاعدة ترتيب واحدة تسبب مشاكل حقيقية. يمكن أن تنتج الإزاحة لليسار قيمة أكبر بكثير من مدخلاتها، وإذا قمت بـ shl أولاً وفحصت النتيجة بعد ذلك، فستكون قد تجاوزت بالفعل Int64 ويكون الاختبار بلا معنى. يجب أن يأتي التحقق قبل الإزاحة. يقارن HotXLS المعامل بالسقف المزاح لليمين بمقدار الإزاحة، وفقط إذا كان المعامل مناسباً فإنه يقوم بالإزاحة الفعلية لليسار. يتم رفض مقدار الإزاحة الذي يتجاوز 53 بت بشكل قاطع، والإزاحة السالبة تعكس الاتجاه ببساطة، لذا فإن BITLSHIFT بعدد سالب تتصرف كإزاحة لليمين. يعمم هذا المبدأ إلى ما هو أبعد بكثير من هذه الدالة الواحدة: عندما يكون هناك حارس لمنع التجاوز، يجب تشغيله على المدخلات، وليس على النتيجة التي كان من المفترض حمايتها.
// Bitwise calls evaluate the same way through Calculate.
Sheet.Cells[3, 1].Value := Sheet.Calculate('=BITAND(13,11)'); // 9
Sheet.Cells[4, 1].Value := Sheet.Calculate('=BITLSHIFT(5,2)'); // 20
Sheet.Cells[5, 1].Value := Sheet.Calculate('=BITRSHIFT(40,3)'); // 5
دوال المستقبل وبادئة الاسم _xlfn
تتفاعل معاملات البتات وقائمة طويلة من الإضافات الأخرى بعد عام 2007 مع نظام تسمية لا علاقة له بما تحسبه وكل شيء يتعلق بكيفية تخزين Excel لها. خصص تنسيق ورقة العمل الثنائي الأصلي لكل دالة مدمجة فتحة رقمية في جدول ثابت. الدوال التي تم ابتكارها بعد تجميد هذا الجدول ليس لها فتحة. لحفظ مثل هذه الدالة في ملف ولكي يتعرف عليها برنامج Excel الحديث، يتم كتابة الاسم بالبادئة _xlfn.، لذا يتم تخزين BITAND كـ _xlfn.BITAND على القرص على الرغم من أن المستخدم يكتب فقط BITAND.
المشكلة هي أن القاعدة ليست موحدة. تم إعطاء بعض الدوال الأحدث فتحات جدول وتُكتب مجردة، بينما تُكتب أيضاً بعض الدوال المخفية القديمة بدون بادئة على الرغم من قدمها. يحتفظ HotXLS بقائمة بيضاء صريحة للأسماء التي تحتاج إلى البادئة، ويضيفها عند الكتابة ويجردها عند القراءة، بحيث يكون نص الصيغة الذي تضبطه وتقرأه دائماً هو الاسم النظيف الذي يواجهه مستخدم Excel. تضبط =BITLSHIFT(5,2)، ويحتفظ الملف بـ _xlfn.BITLSHIFT، وتعود القيمة كـ 20 بغض النظر عن ذلك. البادئة هي تفصيل تخزين لا ينبغي أبداً أن يتسرب إلى الصيغ التي تعمل بها في الكود البرمجي.
تجميع كل شيء معاً في ورقة عمل
الواجهة العامة لكل هذا صغيرة. قم بإنشاء TXLSXWorkbook، وأضف ورقة عمل، واكتب إما صيغة في خلية عبر Cells[Row, Col].Formula وأعد الحساب، أو قيم تعبيراً مباشرة باستخدام طريقة Calculate لورقة العمل، والتي تترجم الصيغة مقابل تلك الورقة وتعود بـ Variant. تستخدم الأمثلة أعلاه Calculate لأنها توضح نتيجة استدعاء هندسي واحد دون حالة الورقة المحيطة، ولكن نفس الدوال تقيم بشكل متطابق داخل صيغ الخلايا الحقيقية عندما يعيد كتاب العمل الحساب.
الترميزات هي الجزء الذي يجب تذكره، وليس مواقع الاستدعاء. تكون السلسلة الثنائية ذات علامة فقط عند عشرة أرقام وفقط بعد عتبة النصف لقاعدتها. والعدد المركب هو نص، والمعامل التخيلي الفارغ هو واحد، ويتخطى المحلل حرف e للأس. ويتم فحص الإزاحة لليسار قبل أن تزيح. احصل على هذه الحقائق الأربع بشكل صحيح وستتوقف العائلة الهندسية عن كونها مصدراً للمفاجآت المتعلقة بالعلامة.
إذا كان كودك يربط رياضيات مجالك الخاص في نفس المحرك، فإن آليات تسجيل المعالج وإرجاع القيم مغطاة في مقالنا حول توسيع محرك الصيغ بدوال مخصصة، وعندما يتعين على تلك الصيغ الوصول إلى الأوراق بالاسم بدلاً من عنوان الخلية، يوضح دليل الأسماء المحددة والصيغ عبر الأوراق كيفية حل المراجع. تشحن الدوال الهندسية الموصوفة هنا كجزء من مكون جداول البيانات HotXLS لـ Delphi وC++Builder، إلى جانب واجهات برمجة تطبيقات القراءة والكتابة والحساب المغطاة في مكان آخر من هذه المدونة.