Technical Article

ฟังก์ชันทางสถิติของ Excel ใน Delphi: NORM, CHISQ, BETA

พิมพ์สูตร =NORM.DIST(115,100,15,TRUE) ลงในเซลล์ แล้ว Excel จะส่งกลับค่าเป็น 0.8413447 อย่างง่ายดาย การเรียกใช้ดูเหมือนเป็นเพียงการค้นหาค่าในตาราง แต่ความเป็นจริงไม่ใช่เช่นนั้น เบื้องหลังตัวเลขดังกล่าวนั้นคือการกระจายตัวแบบปกติสะสม (cumulative normal distribution) ซึ่งเป็นสมการอินทิกรัลที่ไม่มีสูตรสำเร็จปิด และเบื้องหลังฟังก์ชัน CHISQ.INV.RT และ BETA.DIST คือฟังก์ชันพิเศษที่คลังเครื่องมือที่เขียนขึ้นอย่างละเอียดจะต้องประเมินผล ไม่ใช่อาศัยเพียงการประมาณค่าด้วยมือ ส่วนประกอบสเปรดชีตที่อ้างว่าเข้ากันได้กับ Excel จะต้องสร้างค่าเหล่านี้ซ้ำให้ตรงกับหลักสุดท้ายที่ Excel แสดง ซึ่งหมายถึงการจำลองกระบวนการคำนวณเชิงตัวเลข ไม่ใช่แค่เพียงการเลียนแบบชื่อฟังก์ชัน

HotXLS ติดตั้งใช้งานฟังก์ชันทางสถิติเหล่านี้มากกว่าห้าสิบฟังก์ชัน และกระบวนการที่ทำให้มันทำงานได้อย่างถูกต้องนั้นแทบจะมองไม่เห็นเลยจากแถบสูตร นี่คือคู่มือแนะนำวิธีการที่เอ็นจินใช้คำนวณค่าต่างๆ: โครงสร้างหลักของฟังก์ชันพิเศษที่ใช้ร่วมกัน การตัดสินใจแยกส่วนเงื่อนไขที่ช่วยให้คณิตศาสตร์มีความเสถียร และบั๊กตัวผกผันปกติ (inverse-normal) ตัวหนึ่งที่ซ่อนอยู่ในส่วนปลายของค่าเป็นเวลานานเนื่องจากกรณีการใช้งานทั่วไปไม่เคยรันมาเจอบรรทัดโค้ดที่เสียหายนั้น

หนึ่งการเรียกใช้งานแผ่นงาน เบื้องหลังมีการแจกแจงห้าสิบแบบ

ฟังก์ชันเหล่านี้ครอบคลุมกลุ่มการทำงานที่สมุดงานสถิติใช้บ่อย มีกลุ่มการแจกแจงปกติ เช่น NORM.DIST และ NORM.S.DIST พร้อมฟังก์ชันผกผัน กลุ่มการแจกแจงแบบแกมมาและไคสแควร์ ได้แก่ GAMMA.DIST, CHISQ.DIST, CHISQ.DIST.RT, CHISQ.INV.RT กลุ่มการแจกแจงแบบเบตา ได้แก่ BETA.DIST และ BETA.INV กลุ่มการแจกแจงตัวอย่างอย่าง T.DIST, T.DIST.2T, F.DIST และ F.INV กลุ่มการแจกแจงแบบไม่ต่อเนื่อง เช่น BINOM.DIST และ POISSON.DIST และฟังก์ชันช่วยอนุมานเช่น CONFIDENCE.T และ CONFIDENCE.NORM จากฝั่งของผู้เรียกใช้งาน แต่ละฟังก์ชันคือสูตรเดี่ยวๆ คุณตั้งค่าอินพุตในเซลล์ สั่งให้สมุดงานคำนวณผลลัพธ์ และอ่านค่าที่ได้กลับมา

var
  wb: IXLSWorkbook;
  sh: IXLSWorksheet;
begin
  wb := TXLSWorkbook.Create;
  sh := wb.Sheets.Add;
  sh.Range['A1', 'A1'].Value := 115;   // observation
  sh.Range['A2', 'A2'].Value := 100;   // mean
  sh.Range['A3', 'A3'].Value := 15;    // standard deviation

  // The XLS formula parser uses ';' as the argument separator.
  Writeln(wb.Calculate('=NORM.DIST(A1;A2;A3;TRUE())'));   // 0.8413447
  Writeln(wb.Calculate('=CHISQ.INV.RT(0.05;10)'));        // 18.3070381
  Writeln(wb.Calculate('=BETA.DIST(0.5;2;3;TRUE())'));    // 0.6875
end;

เมธอด Calculate บนสมุดงานจะทำการคอมไพล์และประเมินผลสูตรเฉพาะกิจเทียบกับแผ่นงานที่ใช้งานอยู่ และส่งคืนผลลัพธ์เป็น Variant รายละเอียดข้อหนึ่งที่อาจทำให้ผู้ใช้สับสนในการทดลองครั้งแรก: ตัววิเคราะห์สูตรที่อยู่เบื้องหลัง Calculate จะใช้เครื่องหมายอัฒภาคเป็นตัวคั่นอาร์กิวเมนต์ ดังนั้นมันจึงอยู่ในรูป =SUM(A1;B1) ไม่ใช่ =SUM(A1,B1) ส่วนสูตรเซลล์ที่จัดเก็บในไฟล์จะยังคงใช้เครื่องหมายจุลภาคตามมาตรฐานของ Excel ตัวประเมินผลตัวเดียวกันนี้จะส่งการทำงานไปยังทุกฟังก์ชันสถิติด้านล่าง ดังนั้นเมื่อสูตรหนึ่งทำงานสำเร็จใน Calculate ฟังก์ชันอื่นๆ ก็จะใช้เส้นทางเดียวกัน

ฟังก์ชันสองตัวที่เป็นรากฐานของส่วนอื่นๆ ทั้งหมด

การแจกแจงสะสมส่วนใหญ่ในชุดนี้ไม่ได้คำนวณโดยการบวกหรืออินทิเกรตสูตรคำนวณของตัวเองโดยตรง แต่คำนวณผ่านฟังก์ชันพิเศษสองตัว: ฟังก์ชันแกมมาไม่สมบูรณ์แบบปกติส่วนล่าง (regularized lower incomplete gamma) เขียนในรูป P(a, x) และฟังก์ชันเบตาไม่สมบูรณ์แบบปกติ (regularized incomplete beta) เขียนในรูป Ix(a, b) ภายในตัวแล้ว ฟังก์ชันเหล่านี้คือตัวช่วยที่ระบบจัดส่งการประมวลผลใช้งาน และสายการเชื่อมต่อมีขนาดสั้น CDF ของไคสแควร์คือ CDF ของแกมมาที่มีรูปร่าง df/2 และขนาด 2 CDF ของแกมมาคือ P(a, x) โดยตรง ส่วนฟังก์ชันสะสมของ t, F และทวินาม ล้วนเป็นค่าของฟังก์ชันเบตาไม่สมบูรณ์แบบปกติที่อาร์กิวเมนต์ที่ถูกต้อง CDF ของปัวซงคือฟังก์ชันแกมมาไม่สมบูรณ์ส่วนบน Q พัฒนาฟังก์ชันแกมมาและเบตาให้ดี แล้วการแจกแจงอื่นๆ อีกจำนวนมากจะได้รับความแม่นยำตามมาด้วยโดยไม่ต้องทำอะไรเพิ่ม

คำว่า "regularized" (แบบควบคุม) คือใจความสำคัญ ฟังก์ชันแกมมาไม่สมบูรณ์แบบดิบจะเพิ่มขึ้นเหมือนกับแฟกทอเรียล และสมการอินทิกรัลเบตาแบบดิบอาจเกิดการอันเดอร์โฟลว์หรือโอเวอร์โฟลว์ไปนานก่อนที่ผลลัพธ์จะแสดง รูปแบบที่มีการควบคุมจะถูกหารด้วยแกมมาหรือเบตาที่สมบูรณ์ ดังนั้นพวกมันจึงอยู่ภายในช่วงตั้งแต่ศูนย์ถึงหนึ่งพอดี ซึ่งเป็นขอบเขตที่ค่าความน่าจะเป็นครอบครองพอดี การปรับให้เป็นค่ามาตรฐานนี้คือสิ่งที่ช่วยให้รูทีนเดียวกันสามารถทำงานรองรับทั้งไคสแควร์ที่มีองศาความเป็นอิสระสองและองศาความเป็นอิสระสองร้อยได้โดยไม่ทำให้ค่าระดับกลางหลุดขอบเขตสูงสุดของชนิดข้อมูล double นอกจากนี้ยังอธิบายว่าทำไมคุณจึงไม่คำนวณ CDF ด้วยการบวกพจน์ความหนาแน่นของส่วนหางยาวๆ: แต่ละพจน์จะเก็บความผิดพลาดจากการปัดเศษของตัวเอง ความผิดพลาดจะสะสมเพิ่มขึ้นตามจำนวนของอนุกรม และฟังก์ชันพิเศษแบบควบคุมจะข้ามกระบวนการบวกทั้งหมดโดยหันไปประเมินผลอนุกรมที่ลู่เข้าอย่างรวดเร็วหรือใช้เศษส่วนต่อเนื่องแทน

อนุกรมต่ำกว่าเส้นทแยงมุม เศษส่วนต่อเนื่องเหนือเส้นทแยงมุม

รูทีนแกมมาไม่สมบูรณ์จะตัดสินใจหนึ่งเรื่องก่อนคำนวณสิ่งใดๆ: มันจะเปรียบเทียบค่า x กับ a + 1 ขอบเขตนั้นไม่ได้ถูกตั้งขึ้นมาลอยๆ การขยายอนุกรมกำลังของ P(a, x) จะลู่เข้าอย่างรวดเร็วเมื่อค่า x มีขนาดเล็กเมื่อเทียบกับ a และจะลู่เข้าช้าลงจนในที่สุดจะไม่มีประโยชน์เมื่อ x มีขนาดใหญ่ เศษส่วนต่อเนื่องจะมีลักษณะการทำงานที่ตรงกันข้าม ดังนั้นเอ็นจินจะใช้อนุกรมกำลังสำหรับ x ที่มีค่าต่ำกว่า a + 1 และใช้เศษส่วนต่อเนื่องของ Lentz สำหรับ x ที่เท่ากับหรือสูงกว่า a + 1 เพื่อให้แต่ละสาขาประมวลผลคำนวณในสิ่งที่ตนเองมีประสิทธิภาพสูงสุด

เศษส่วนต่อเนื่องต้องการการป้องกันหนึ่งส่วน วิธีการของ Lentz ทำงานโดยการเก็บรักษาส่วนเศษและส่วนส่วนสะสม และสลับส่วนส่วนในทุกขั้นตอน และหากส่วนใดส่วนหนึ่งมีค่าเข้าใกล้ศูนย์ การสลับจะล้มเหลว วิธีแก้ไขคือการกำหนดขีดจำกัดล่างขนาดเล็กมาก: เมื่อใดก็ตามที่พจน์ระดับกลางลดลงต่ำกว่าประมาณ 1e-30 มันจะถูกปัดขึ้นมาตรึงไว้ที่ 1e-30 ซึ่งช่วยให้การคำนวณซ้ำมีขอบเขตจำกัดโดยไม่รบกวนค่าที่ลู่เข้า การตรึงค่าแบบเดียวกันนี้ปรากฏในเศษส่วนต่อเนื่องของเบตาไม่สมบูรณ์ด้วยเหตุผลข้อเดียวกัน มันคือค่าคงที่ขนาดเล็กที่รับหน้าที่สำคัญ เป็นตัวแบ่งระหว่างการประมวลผลที่เสถียรกับการหารด้วยตัวเลขที่แทบจะไม่ต่างจากศูนย์

ส่วนปลายบน Q(a, x) มีค่าเท่ากับ 1 ลบด้วย P(a, x) และนั่นคือวิธีการคำนวณส่วนสะสมของปัวซง: ความน่าจะเป็นของการเกิดเหตุการณ์ไม่เกิน k ครั้งโดยมีค่าเฉลี่ยเป็น λ คือ Q(k + 1, λ) การจัดการผ่านฟังก์ชันแกมมาไม่สมบูรณ์ส่วนบนแทนที่จะรวมพจน์ของปัวซงจำนวน k + 1 พจน์เข้าด้วยกัน เป็นการเลือกที่จะประเมินผลนิพจน์ที่ลู่เข้าตัวเดียว แทนที่จะสะสมพจน์ขนาดเล็กจำนวนมากเข้าด้วยกัน

การกระจายตัวแบบไม่ต่อเนื่องโดยไม่มีการล้นของแฟกทอเรียล

การแจกแจงแบบไม่ต่อเนื่องก่อให้เกิดอันตรายที่แตกต่างออกไป มวลความน่าจะเป็นทวินามเกี่ยวข้องกับสัมประสิทธิ์ทวินาม และสัมประสิทธิ์สำหรับการเลือกยี่สิบหกจากห้าสิบสองคือจำนวนเต็มที่มีขนาดมหึมา หากสร้างมันขึ้นมาโดยตรง ตัวเศษจะล้นประเภทข้อมูล double ก่อนที่จะเกิดการหารเพื่อนำค่ากลับมาเป็นความน่าจะเป็นที่เหมาะสม เอ็นจินจะไม่สร้างมันขึ้นมาโดยตรง มันจะคำนวณแฟกทอเรียลในพื้นที่ลอการิทึมผ่านฟังก์ชันล็อก-แกมมา (log-gamma) บวกและลบค่าล็อกเหล่านั้น นำค่าล็อกของความน่าจะเป็นของความสำเร็จและความล้มเหลวเข้ามารวมกัน และยกกำลังเลขชี้กำลังเพียงครั้งเดียวในตอนท้ายสุด

// Binomial probability mass, evaluated entirely in log space.
// LnGammaF(n+1) is ln(n!); the three log-factorials form ln(C(n,k)),
// and the whole exponent is built before a single Exp call.
//   ln P(X=k) = ln(n!) - ln(k!) - ln((n-k)!) + k*ln(p) + (n-k)*ln(1-p)
result := Exp(LnGammaF(nt + 1) - LnGammaF(kk + 1) - LnGammaF(nt - kk + 1)
  + kk * Ln(pp) + (nt - kk) * Ln(1 - pp));

ฟังก์ชันล็อก-แกมมาเองใช้การประมาณค่าแบบ Lanczos ซึ่งมีความถูกต้องตลอดแนวแกนบวกและประมวลผลได้รวดเร็ว เนื่องจากข้อมูลขนาดใหญ่ทุกตัวจะถูกเก็บไว้ในรูปของลอการิทึมจนกว่าจะถึงขั้นตอน Exp สุดท้าย ตัวเลขที่มากที่สุดที่รูทีนผลิตขึ้นมาจริงจึงเป็นเพียงค่าความน่าจะเป็นนั่นเอง ซึ่งมีค่าไม่เกินหนึ่ง ฟังก์ชันมวลของปัวซงก็ใช้หลักการเดียวกันนี้ โดยมีพจน์ล็อก-แกมมาเดี่ยวทำหน้าที่แทนแฟกทอเรียลในตัวส่วน รูปแบบปิดจะได้รับการจัดการเป็นกรณีพิเศษที่บริเวณขอบของค่า เมื่อ p มีค่าเป็นศูนย์หรือหนึ่งพอดี เพื่อไม่ให้โค้ดเรียกใช้งาน Ln(0) HotXLS ส่งกลับค่า 0.2460938 สำหรับ BINOM.DIST(5,10,0.5,FALSE) และส่งกลับค่า 0.6766764 สำหรับฟังก์ชันสะสม POISSON.DIST(2,2,TRUE) สอดคล้องกับค่าหลักตัวเลขที่ Excel พิมพ์ออกมา

การคำนวณหาค่าผกผันโดยการกำหนดขอบเขตเส้นโค้งไปข้างหน้า

ฟังก์ชันการแจกแจงผกผันจะถามคำถามในทางกลับกัน: หากกำหนดความน่าจะเป็นมาให้ จงหาค่าที่มี CDF เท่ากับค่านั้น มีฟังก์ชันผกผันเพียงตัวเดียวในชุดนี้ที่มีสูตรตรงที่ทำงานรวดเร็ว ฟังก์ชัน NORM.S.INV ซึ่งเป็นตัวผกผันปกติมาตรฐาน จะใช้การประมาณค่าตรรกยะของ Acklam (Acklam rational approximation) ซึ่งเป็นคู่อัตราส่วนพหุนามที่ความละเอียดใกล้เคียงกับประเภทข้อมูล double ตลอดช่วงทั้งหมด โดยแบ่งออกเป็นพื้นที่ศูนย์กลางและส่วนปลายสองข้าง มันคือการประเมินผลรูปแบบปิดโดยไม่มีการคำนวณซ้ำ

ฟังก์ชันผกผันอื่นๆ ไม่มีสูตรคำนวณดังกล่าว เอ็นจินจึงต้องคำนวณหาค่าผกผันในทางตัวเลข มันจะกำหนดขอบเขตล่างและขอบเขตบนรอบคำตอบโดยอิงตามขอบเขตการรองรับของการแจกแจงนั้น จากนั้นใช้วิธีแบ่งครึ่งช่วง (bisects): ประเมินผล CDF ไปข้างหน้าทีจุดกึ่งกลาง ขยับขอบเขตฝั่งที่ทำให้ยังคงครอบคลุมความน่าจะเป็นเป้าหมาย และทำซ้ำจนกว่าช่วงจะแคบ สำหรับตัวผกผันของแกมมาและไคสแควร์ ขอบเขตจะเริ่มที่ศูนย์และมีการประเมินขอบเขตบนอย่างกว้างขวางจากรูปร่างและขนาด โดยจะเพิ่มขอบเขตบนเป็นสองเท่าหากยังไม่ครอบคลุมความน่าจะเป็น ตัวผกผันของ t จะใช้วิธีกำหนดขอบเขตที่สมมาตรซึ่งขยายออกไปด้านนอก ส่วนตัวผกผันของ F จะแบ่งครึ่งช่วงบนช่วงค่าที่ไม่ติดลบ ต้นทุนคือการประเมินผล CDF ไม่กี่สิบครั้งต่อการเรียกใช้ ซึ่งรวดเร็วมากจนสังเกตไม่เห็นในความเร็วของแผ่นงาน และประโยชน์ที่ได้คือทุกตัวผกผันจะมีความแม่นยำเทียบเท่ากับฟังก์ชันไปข้างหน้าที่มันทำการผกผัน นั่นเป็นสาเหตุที่การคำนวณแบบไปกลับ เช่น CHISQ.DIST(CHISQ.INV(0.7,5),5,TRUE) สามารถส่งกลับค่าเป็น 0.7ได้อย่างถูกต้องแม่นยำอย่างยิ่ง

ลอการิทึมฐาน 10 ที่ซ่อนอยู่ในส่วนปลาย

นี่คือบั๊กที่คุ้มค่าแก่การเล่าสู่กันฟัง เพราะมันคือชนิดที่คงอยู่ได้เป็นเวลานาน รูทีนผกผันปกติของ Acklam มีอยู่สามสาขาการคำนวณ สาขาหลักตรงกลางที่มีขนาดกว้าง ซึ่งจะใช้งานเมื่อความน่าจะเป็นอยู่ระหว่างประมาณ 0.025 ถึง 0.975 จะรันข้อมูลอินพุตผ่านอัตราส่วนพหุนามโดยไม่มีลอการิทึมเกี่ยวข้องในจุดใดเลย ส่วนสาขาปลายทั้งสองข้าง สำหรับความน่าจะเป็นที่มีขนาดเล็กมากหรือใหญ่มาก จะทำการคำนวณหาค่าลอการิทึมของอินพุตก่อน เนื่องจากส่วนปลายจะทำหน้าที่สอดคล้องคล้ายกับรากที่สองของค่าติดลบของลอการิทึมธรรมชาติของ p

โค้ดรุ่นแรกของสาขาการคำนวณส่วนปลายดันไปใช้ลอการิทึมฐาน 10 แทนที่จะเป็นลอการิทึมธรรมชาติ ค่าทั้งสองต่างกันด้วยตัวคูณคงที่ประมาณ 2.30 ส่งผลให้ผลลัพธ์ส่วนปลายคำนวณผิดพลาดไปเป็นจำนวนที่สม่ำเสมอและสังเกตได้ แต่ถึงกระนั้นฟังก์ชันก็ดูเหมือนจะทำงานได้ดีในการตรวจสอบทั่วไป เนื่องจากตัวทดสอบมักใช้งานกับค่าตรงกลาง ฟังก์ชัน NORM.S.INV(0.5) ได้ศูนย์ NORM.S.INV(0.975) ได้ค่า 1.959964 ตามตำรา และค่าทั้งสองนี้รันผ่านพหุนามกลางที่ไม่เคยเรียกใช้งานลอการิทึมเลย ความผิดพลาดจะปรากฏขึ้นเมื่อค่าความน่าจะเป็นขยับเข้าสู่ส่วนปลาย เช่น NORM.S.INV(0.001) ซึ่งควรจะได้ค่า -3.0902323 แต่กลับได้ค่าคลาดเคลื่อนเนื่องจากการเลือกใช้ลอการิทึมฐาน 10 ผิดพลาด ทุกฟังก์ชันที่พึ่งพาค่าผกผันปกติในส่วนปลาย รวมถึงฟังก์ชันช่วยหาช่วงความเชื่อมั่น ก็ได้รับผลกระทบจากข้อผิดพลาดนี้ตามไปด้วย บทเรียนนี้เรียบง่ายแต่มีราคาแพง: ฟังก์ชันที่มีโครงสร้างแยกสาขาจำเป็นต้องมีจุดทดสอบในทุกสาขาการทำงาน เนื่องจากเส้นทางทั่วไปที่ทำงานถูกต้องจะช่วยปกปิดเส้นทางหายากที่เสียหายได้อย่างง่ายดาย วิธีแก้ไขคือเปลี่ยนจากล็อกฐาน 10 ไปเป็นลอการิทึมธรรมชาติ และค่าส่วนปลายก็กลับมาแสดงผลตรงกับ Excel ทุกประการ

เครื่องหมายของ x จะเป็นตัวตัดสินส่วนปลายของการแจกแจงแบบ t

ฟังก์ชันสะสมแบบ t ของนักเรียน (Student t cumulative function) มีความละเอียดอ่อนที่อาจสับสนเขียนสลับกันได้ง่าย ค่าของมันได้มาจากฟังก์ชันเบตาไม่สมบูรณ์แบบควบคุมที่คำนวณ ณ df / (df + x²) แต่ค่าเบตานั้นคือความน่าจะเป็นในส่วนปลายที่พ้นขนาดของ x ไม่ใช่ความน่าจะเป็นสะสมจนถึงค่า x รูปทรงที่สมมาตรของการแจกแจงแบบ t หมายความว่าการแปลงค่าจะขึ้นอยู่กับว่าค่า x ตกอยู่ฝั่งใดของศูนย์

// Student t CDF. ib is the regularized incomplete beta at df/(df+x*x),
// which measures the symmetric tail. The cumulative value depends on
// the sign of x; returning ib unconverted gives the wrong tail.
ib := BetaIF(df / 2, 0.5, df / (df + x * x));
if x > 0 then
  result := 1 - 0.5 * ib        // above the mean: one minus half the tail
else if x < 0 then
  result := 0.5 * ib            // below the mean: half the tail
else
  result := 0.5;                // exactly at the mean

สำหรับ x ที่มากกว่าศูนย์ ความน่าจะเป็นสะสมคือหนึ่งลบด้วยครึ่งหนึ่งของส่วนปลายที่สมมาตร สำหรับ x ที่ต่ำกว่าศูนย์ มันคือครึ่งหนึ่งของส่วนปลายนั้น และที่ค่าศูนย์พอดีจะมีค่าเป็นหนึ่งในสองพอดี หากส่งคืนค่าเบตาโดยตรงคุณจะรายงานส่วนของการแจกแจงผิดฝั่ง ซึ่งจะคลาดเคลื่อนไปตลอดเส้นโค้งสำหรับค่า x ใดๆ ที่ไม่ใช่ศูนย์ ตัวเลือกส่วนปลายขวาและแบบสองปลายจะพัฒนาขึ้นจากสาขาเดียวกันนี้ ซึ่งเป็นสาเหตุที่ T.DIST.2T(1,1) ได้ค่าเป็น 0.5 และ T.DIST(1,1,TRUE) ได้ค่าเป็น 0.75 และตัวผกผัน T.INV จะใช้วิธีแบ่งครึ่งช่วงเทียบกับ CDF ที่แก้ไขแล้วนี้เพื่อให้กระบวนการคำนวณแบบไปกลับเสร็จสมบูรณ์

ทั้งหมดนี้ไม่จำเป็นต้องแสดงให้เห็นจากในเซลล์ และนั่นคือผลลัพธ์ที่ระบบต้องการ คุณเขียนสูตรและอ่านค่าตัวเลขที่ตรงกับ Excel หากคุณต้องการขยายเอ็นจินด้วยตรรกะเฉพาะของคุณ ขั้นตอนการลงทะเบียนฟังก์ชันจะมีอธิบายไว้ในคู่มือเอ็นจินสูตรและฟังก์ชันกำหนดเองของเรา และวิธีการที่สูตรเข้าถึงข้อมูลข้ามแผ่นงานและขอบเขตตามชื่อจะอธิบายไว้ในบทความเกี่ยวกับชื่อที่กำหนดและสูตรข้ามแผ่นงาน ทั้งหมดนี้จัดส่งมาในตัว HotXLS spreadsheet component สำหรับ Delphi และ C++Builder ควบคู่ไปกับ API การอ่าน การเขียน การทำแผนภูมิ และการจัดรูปแบบที่มีอธิบายในส่วนอื่นของบล็อกนี้