ฟังก์ชันกลุ่มวิศวกรรมใน Excel ดูเหมือนจะเป็นส่วนที่ง่ายที่สุดในรายการอ้างอิงฟังก์ชัน ฟังก์ชัน DEC2BIN จะเปลี่ยนตัวเลขเป็นสตริงเลขฐานสอง ฟังก์ชัน HEX2DEC จะทำหน้าที่แปลงกลับ และฟังก์ชัน IMSUM จะบวกจำนวนเชิงซ้อนสองจำนวน แต่ละฟังก์ชันดูเหมือนเป็นเพียงการฝึกจัดรูปแบบข้อมูลธรรมดา แต่ความจริงไม่ใช่เช่นนั้น เบื้องหลังชื่อเหล่านี้คือการเข้ารหัสส่วนเติมเต็มสองขนาดสิบบิต (ten-bit two's complement) ที่นักพัฒนาส่วนใหญ่ไม่เคยแตะต้องอีกเลยนับตั้งแต่ชั้นเรียนสถาปัตยกรรมคอมพิวเตอร์ รูปแบบจำนวนเชิงซ้อนที่อยู่ภายในสตริงอย่างสมบูรณ์ และตัวดำเนินการระดับบิต (bitwise operators) ที่จะทำให้จำนวนเต็มขนาด 64 บิตเกิดการล้น (overflow) อย่างเงียบๆ หากคุณทำการเลื่อนบิตก่อนที่จะทำการตรวจสอบ เอ็นจินสเปรดชีตที่ถอดแบบความสามารถของ Excel ได้อย่างถูกต้องจึงไม่สามารถปัดเศษหรือละเลยส่วนประกอบใดๆ เหล่านี้ได้
ฟังก์ชันเหล่านี้แบ่งออกเป็นสามกลุ่ม และแต่ละกลุ่มจะซ่อนกับดักที่แตกต่างกัน การแปลงฐานเป็นเรื่องเกี่ยวกับตัวเลขติดลบและเกณฑ์ขีดจำกัดตามแต่ละฐานเลข คณิตศาสตร์จำนวนเชิงซ้อนเป็นเรื่องเกี่ยวกับการวิเคราะห์และจัดรูปแบบสตริง ส่วนการดำเนินการระดับบิตเป็นเรื่องเกี่ยวกับการควบคุมค่าให้อยู่ภายในขอบเขตของ Int64 บทความนี้จะนำทางไปดูแต่ละกลุ่มการทำงานตามที่ HotXLS พัฒนาขึ้นมา พร้อมตัวอย่างการเรียกใช้งานจริงที่คุณจะเขียนในแผ่นงาน
การแปลงฐานเลขและส่วนเติมเต็มสองขนาดสิบบิต
การแปลงไปข้างหน้าคือสิ่งที่ทุกคนคาดหวัง ฟังก์ชัน DEC2BIN(9) จะให้ผลลัพธ์เป็น "1001" และอาร์กิวเมนต์ตัวที่สองซึ่งระบุได้จะเติมศูนย์ข้างหน้าผลลัพธ์เพื่อให้มีความกว้างคงที่ กับดักคือเมื่อข้อมูลอินพุตเป็นค่าติดลบ Excel จะไม่เขียนเครื่องหมายลบ มันจะเข้ารหัสค่าเป็นสตริงส่วนเติมเต็มสองขนาดสิบหลักในฐานเลขเป้าหมาย ซึ่งเป็นเหตุผลที่ DEC2BIN(-5,10) ส่งคืนค่า "1111111011" แทนที่จะเป็นค่าที่มีเครื่องหมายนำหน้า อาร์กิวเมนต์ระบุจำนวนหลักจะถูกละเลยเมื่อค่าเป็นลบ เนื่องจากโครงสร้างการเข้ารหัสถูกตรึงไว้ที่สิบหลักเรียบร้อยแล้ว
ตัวเลขสิบหลักคือโควตาที่คงที่ และโควตานั้นจะกำหนดขอบเขตของค่าที่นำเสนอได้ต่อแต่ละฐานเลข ในระบบฐานสอง ขนาดสีที่เปลี่ยนเป็นซีกติดลบคือ 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+ ด้านหน้าออกไป
ฟังก์ชันเชิงซ้อนอดิศัย (transcendental complex functions) รวมถึง IMSQRT, IMEXP, IMLN และ IMPOWER จะไม่ทำงานในพิกัดฉาก (rectangular coordinates) พวกมันจะแปลงค่าที่วิเคราะห์แล้วให้อยู่ในรูปขั้ว (polar form) ดำเนินการคำนวณกับมอดุลัสและอาร์กิวเมนต์ แล้วจึงแปลงกลับเป็นพิกัดฉาก รากที่สองจะแบ่งครึ่งอาร์กิวเมนต์และหารากของมอดุลัส เลขชี้กำลังจะคูณอาร์กิวเมนต์และยกกำลังมอดุลัส การทำด้วยวิธีอื่นใดจะหมายถึงการต้องดึงค่าเอกลักษณ์แต่ละตัวในรูปพิกัดฉากกลับมาคำนวณใหม่ ซึ่งจะทำให้ต้องใช้โค้ดจำนวนมากขึ้นและสูญเสียเสถียรภาพของตัวเลขบริเวณรอยต่อของการแบ่งส่วนค่า
ตัวดำเนินการระดับบิตและการล้นของข้อมูลที่คุณต้องตรวจสอบก่อน
Excel 2013 ได้เพิ่มฟังก์ชัน BITAND, BITOR, BITXOR, BITLSHIFT และ BITRSHIFT ตัวถูกดำเนินการ (operands) ถูกจำกัด: แต่ละตัวต้องเป็นจำนวนเต็มที่ไม่ติดลบและมีค่าไม่เกิน 2^48 ลบ 1 และอาร์กิวเมนต์ที่เป็นเศษส่วนหรือติดลบจะถือเป็นข้อผิดพลาดทางตัวเลข ขีดจำกัดสูงสุดนั้นกว้างพอที่จะครอบคลุมชุดแฟล็กส่วนใหญ่ที่ใช้จริงในขณะที่ยังอยู่ภายใต้ช่วงค่าทศนิยมของตัวแปรประเภท double ซึ่งมีความสำคัญเนื่องจาก Excel จะส่งผ่านอาร์กิวเมนต์ตัวเลขในรูปของค่าทศนิยม
ฟังก์ชันการเลื่อนบิตจะมีกฎลำดับการทำงานข้อหนึ่งที่อาจก่อให้เกิดปัญหาได้ การเลื่อนบิตไปทางซ้ายสามารถสร้างค่าที่มีขนาดใหญ่กว่าอินพุตมาก และหากคุณทำขั้นตอน shl ก่อนแล้วจึงมาตรวจสอบผลลัพธ์ภายหลัง คุณอาจทำให้ค่าล้นขีดจำกัดของ Int64 ไปแล้วและการตรวจสอบจะไม่มีความหมาย การตรวจสอบจะต้องเกิดขึ้นก่อนการเลื่อนบิต HotXLS จะเปรียบเทียบตัวถูกดำเนินการกับค่าขีดจำกัดสูงสุดที่เลื่อนบิตไปทางขวาตามจำนวนที่ต้องการเลื่อน และจะทำขั้นตอนเลื่อนบิตไปทางซ้ายจริงก็ต่อเมื่อตัวถูกดำเนินการมีขนาดที่รองรับได้พอดี การเลื่อนขนาดเกินกว่า 53 บิตจะถูกปฏิเส์ในทันที และการเลื่อนค่าติดลบจะสลับทิศทาง ดังนั้น BITLSHIFT ที่มีจำนวนติดลบจะทำงานเป็นการเลื่อนไปทางขวา หลักการนี้ขยายการใช้งานไปไกลกว่าฟังก์ชันนี้: เมื่อมีระบบป้องกันเพื่อป้องกันการล้น มันจะต้องรันกับข้อมูลอินพุต ไม่ใช่รันกับผลลัพธ์ที่มันมีหน้าที่ดูแลความปลอดภัย
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;
ฟังก์ชันในอนาคตและคำนำหน้าชื่อ _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 เนื่องจากมันแสดงผลลัพธ์ของการเรียกใช้ฟังก์ชันวิศวกรรมเดี่ยวๆ โดยไม่ต้องมีสถานะของแผ่นงานรอบข้าง แต่ฟังก์ชันเหล่านี้จะประมวลผลเหมือนกันในสูตรของเซลล์จริงเมื่อสเปรดชีตทำการคำนวณผลใหม่
// 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
โครงสร้างการเข้ารหัสคือสิ่งที่ต้องคำนึงถึง ไม่ใช่จุดเรียกใช้งาน
ฟังก์ชันเลขฐานสองจะมีเครื่องหมายต่อเมื่อมีขนาดสิบหลักและผ่านเกณฑ์ครึ่งหนึ่งของฐานเลขนั้น จำนวนเชิงซ้อนอยู่ในรูปข้อความ สัมประสิทธิ์จินตภาพที่ว่างเปล่ามีค่าเป็นหนึ่ง และตัววิเคราะห์ข้ามอักษร e ของตัวชี้กำลัง การเลื่อนบิตไปทางซ้ายจะต้องได้รับการตรวจสอบก่อนการเลื่อนจริง ทำความเข้าใจข้อเท็จจริงสี่ข้อนี้ให้ถูกต้อง และฟังก์ชันวิศวกรรมก็จะไม่เป็นที่มาของความผิดพลาดในเรื่องเครื่องหมายอีกต่อไป
หากคุณกำลังเชื่อมโยงตรรกะทางคณิตศาสตร์เฉพาะของคุณเข้ากับเอ็นจินเดียวกันนี้ ขั้นตอนการทำงานการลงทะเบียนตัวจัดการและการส่งคืนค่าจะอธิบายไว้ในบทความของเราเกี่ยวกับการขยายเอ็นจินสูตรด้วยฟังก์ชันแบบกำหนดเอง และเมื่อสูตรเหล่านั้นต้องการเข้าถึงข้อมูลข้ามแผ่นงานตามชื่อแทนที่จะเป็นที่อยู่เซล คู่มือสำหรับชื่อที่กำหนดและสูตรข้ามแผ่นงานจะแสดงวิธีการเชื่อมต่อโครงสร้างการอ้างอิง ฟังก์ชันทางวิศวกรรมที่อธิบายไว้ในที่นี้จัดส่งให้เป็นส่วนหนึ่งของส่วนประกอบสเปรดชีต HotXLS สำหรับ Delphi และ C++Builder พร้อมด้วย API การอ่าน การเขียน และการคำนวณที่มีอธิบายในส่วนอื่นของบล็อกนี้