Excel'deki mühendislik ailesi, fonksiyon referansının en kolay köşesi gibi okunur. DEC2BIN bir sayıyı ikili bir dizeye dönüştürür. HEX2DEC onu geri döndürür. IMSUM iki karmaşık sayıyı toplar. Her biri biçimlendirme alıştırması gibi görünür. Değillerdir. Bu isimlerin arkasında, çoğu geliştiricinin bilgisayar mimarisi dersinden beri dokunmadığı on bitlik ikiye tümleyen (two's complement) kodlaması, tamamen dizelerin içinde yaşayan bir karmaşık sayı biçimi ve kontrol etmeden önce kaydırırsanız 64 bitlik bir tamsayıyı sessizce taşıracak bit düzeyinde operatörler bulunur. Excel'i tam olarak yeniden üreten bir elektronik tablo motoru bunların hiçbirini yuvarlayamaz.
Fonksiyonlar üç gruba ayrılır ve her grup farklı bir tuzak gizler. Taban dönüşümü, negatif sayılar ve taban başına eşikler hakkındadır. Karmaşık aritmetik, bir dizeyi ayrıştırmak ve biçimlendirmek hakkındadır. Bit düzeyinde işlemler, Int64 sınırları içinde kalmak hakkındadır. Bu makale, HotXLS uyguladığı şekliyle her grubu, aslında yazacağınız çalışma sayfası çağrılarıyla birlikte ele alıyor.
Taban dönüşümü ve on bitlik ikiye tümleyen
İleri yön, herkesin beklediği kısımdır. DEC2BIN(9) değeri "1001" verir ve isteğe bağlı ikinci bir bağımsız değişken sonucu sabit bir genişliğe kadar sola kaydırır. Tuzak negatif girdidir. Excel eksi işareti yazmaz. Değeri, hedef tabanda on basamaklı ikiye tümleyen dizesi olarak kodlar, bu nedenle DEC2BIN(-5,10) işareti olan herhangi bir şey yerine "1111111011" döndürür. Değer negatif olduğunda basamak bağımsız değişkeni yoksayılır, çünkü kodlama zaten on basamakla sabitlenmiştir.
On basamak sabit bir bütçedir ve bu bütçe taban başına temsil edilebilir aralığı belirler. İkilik sistemde, negatif yarıya dönen büyüklük 512'dir ve sarmalama modülü 1024'tür, bu nedenle ikili dize yalnızca tam olarak on karakter uzunluğunda olduğunda ve değeri en az 512 olduğunda işaretlidir. Aynı fikir tabanla birlikte ölçeklenir. Sekizlik sistem 2^29 yarım eşiği ve 2^30 tam modülü kullanır. Onaltılık sistem 2^39 ve 2^40 kullanır. HotXLS okuyucusu tam olarak bu kuralı uygular: basamakları biriktirir ve yalnızca dize on karakter genişliğinde olduğunda ve biriken değer yarım eşikte veya üzerindeyken işaretli değeri kurtarmak için tam modülü çıkarır. Dokuz karakterli bir dize, ne kadar büyük olursa olsun her zaman negatif değildir。
Kodlayıcı bunun ayna görüntüdür. Negatif olmayan bir değer basamak basamak dönüştürülür ve isteğe bağlı olarak istenen genişliğe kadar sıfırla doldurulur ve tabanın pozitif tavanını aşarsa veya istenen genişlik onu tutamayacak kadar darsa reddedilir. Negatif bir değer, önce tam modül eklenerek aralığa getirilir; bu da onu taban temsili her zaman on basamak olan bir değere dönüştürür ve ardından basamaklar genişliği doldurmak için öndeki sıfırlarla birlikte verilir. Taban başına simetrik alt ve üst sınırlar olan tek paylaşılan aralık kontrolü, DEC2BIN, DEC2OCT ve DEC2HEX fonksiyonlarını uç noktalarında birbiriyle tutarlı tutan şeydir。
Bu durum, fonksiyon adında ondalıktan geçmeden tabanı değiştiren HEX2BIN and OCT2HEX gibi tabanlar arası dönüşümleri bırakır. Uygulama, her sıralı çift için ayrı bir rutin taşımaz. Kaynak tabanı kullanarak giriş dizesini işaretli ondalık değere ayrıştırır, ardından bu ondalık değeri hedef tabana göre biçimlendirir. Ondalık eksendir. Bir ayrıştırma rutini ve bir biçimlendirme rutini birleştiğinde her kombinasyonu kapsar ve her iki yarı da aynı on basamaklı işaretli kuralı paylaştığından, negatif bir değer yolculuğu işareti bozulmadan atlatır。
Karmaşık sayılar dizedir, dolayısıyla iş ayrıştırmadır
Excel'de karmaşık veri tipi yoktur. Karmaşık bir değer "a+bi" dizesidir ve IM ailesindeki her fonksiyon bu dizeleri alır ve bir tanesini geri verir. COMPLEX dizeyi gerçek ve sanal bir parçadan oluşturur. IMSUM, IMSUB, IMPRODUCT ve IMDIV bağımsız değişkenlerini ayrıştırır, sayısal kısımlar üzerinde aritmetik işlemler yapar ve sonucu tekrar bir dize halinde biçimlendirir. Sayısal çalışma lisans düzeyinde cebirdir. Zorluk tamamen metni güvenilir bir şekilde iki kayan noktalı sayıya dönüştürmektedir ve dahili ayrıştırıcının değerini kanıtladığı yer burasıdır。
Bu ayrıştırıcıda iki ayrıntıyı yanlış yapmak kolaydır. Birincisi, çıplak sanal birimdir. "i" dizesi sıfır veya hata değil, bir kez i anlamına gelir; bu nedenle sonekin önündeki katsayı boş olduğunda veya tek başına artı işareti olduğunda ayrıştırıcı bunu 1 değeri olarak okumalıdır ve tek başına eksi işaretini -1 olarak okumalıdır. Bunu atlarsanız IMSUM("i","i") değeri 2i olmaktan çıkar. İkincisi, gerçek ve sanal kısımları ayıran işaretle çarpışan bilimsel gösterimdir. Ayrıştırıcı, bir artı veya eksi tarayarak bu ayırıcıyı bulur, ancak "1.5E-3" olarak yazılan bir sayı üstel kısma ait bir eksi içerir. Bu nedenle tarama, hemen önündeki karakter e veya E olduğunda artı veya eksi değerini ayırıcı olarak kabul etmeyi reddeder. Bu koruma olmasaydı, gerçek kısım üstel işaretinden ikiye bölünür ve ayrıştırma tamamen geçerli girdilerde başarısız olurdu。
Sonekin kendisi normalleştirilmek yerine korunur. Excel hem i hem de j değerlerini kabul eder ve HotXLS girişin hangisini kullandığını hatırlar, böylece biçimlendirilmiş sonuç aynı harfi taşır. Biçimlendirme daha sonra geleneksel kısaltmaları uygular: birin sanal kısmı yalnızca sonek olarak, eksi bir -i olarak yazdırılır, sıfır sanal kısım düz gerçeğe çöker ve sıfır gerçek kısım öndeki 0+ işaretini düşürür。
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;
Transandantal karmaşık fonksiyonlar (IMSQRT, IMEXP, IMLN ve IMPOWER) dik koordinatlarda çalışmaz. Ayrıştırılan değeri kutupsal forma dönüştürürler, modül ve bağımsız değişken üzerinde işlemi uygularlar ve geri dönüştürürler. Karekök, bağımsız değişkeni yarıya indirir ve modülün kökünü alır. Güç, bağımsız değişkeni çarpar ve modülü yükseltir. Bunu başka bir şekilde yapmak, her bir kimliği dik formda yeniden türetmek anlamına gelir; bu da dallanma kesimlerinin yakınında hem daha fazla kod hem de sayısal olarak daha az kararlıdır。
Bit düzeyinde operatörler ve önce kontrol etmeniz gereken taşma
Excel 2013; BITAND, BITOR, BITXOR, BITLSHIFT ve BITRSHIFT fonksiyonlarını ekledi. Terimler kısıtlıdır: her biri 2^48 eksi 1'den büyük olmayan negatif olmayan bir tamsayı olmalıdır ve herhangi bir kesirli veya negatif bağımsız değişken sayısal bir hatadır. Bu sınır, bir double değerinin tam olarak temsil edilebilir aralığı içinde kalırken herhangi bir gerçekçi bayrak kümesini kapsayacak kadar cömerttir; bu önemlidir çünkü Excel her sayısal bağımsız değişkeni kayan noktalı bir değer olarak aktarır。
Kaydırma fonksiyonları, gerçekten zorlayan tek sıralama kuralını taşır. Sola kaydırma, girdisinden çok daha büyük bir değer üretebilir ve önce shl işlemini gerçekleştirip sonucu daha sonra incelerseniz, Int64 sınırını zaten aşmış olursunuz ve test anlamsız kalır. Kontrolün kaydırmadan önce gelmesi gerekir. HotXLS, terimi kaydırma miktarı kadar sağa kaydırılan tavanla karşılaştırır ve yalnızca terim sığdığında gerçek sola kaydırmayı gerçekleştirir. 53 bitin üzerindeki bir kaydırma büyüklüğü doğrudan reddedilir ve negatif kaydırma yönü tersine çevirir, böylece negatif sayımlı BITLSHIFT sağa kaydırma gibi davranır. Bu ilke, bu tek fonksiyonun çok ötesine genelleşir: taşmayı önlemek için bir koruma mevcut olduğunda, korumayı amaçladığı sonuçta değil, girdilerde çalışmalıdır。
// 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
Gelecekteki fonksiyonlar ve _xlfn ad öneki
Bit düzeyinde operatörler ve 2007 sonrasındaki diğer eklemelerin uzun bir listesi, neyi hesapladıklarıyla hiçbir ilgisi olmayan ve tamamen Excel'in bunları nasıl depoladığıyla ilgili olan bir adlandırma şemasıyla etkileşime girer. Orijinal ikili çalışma sayfası biçimi, her yerleşik fonksiyona sabit bir tabloda sayısal bir yuva atadı. Bu tablo dondurulduktan sonra icat edilen fonksiyonların yuvası yoktur. Böyle bir fonksiyonu bir dosyaya kaydetmek ve modern bir Excel'in onu tanımasını sağlamak için ad _xlfn. önekiyle yazılır, bu nedenle kullanıcı yalnızca BITAND yazsa bile diskte BITAND değeri _xlfn.BITAND olarak depolanır。
Buradaki püf noktası, kuralın tek tip olmamasıdır. Bazı daha yeni fonksiyonlara tablo yuvaları verilmiş ve yalın yazılmıştır; birkaç eski gizli fonksiyon ise yaşlarına rağmen bir önek olmadan yazılmıştır. HotXLS hangi adların öneke ihtiyacı olduğuna dair açık bir beyaz liste tutar, bunu yazarken ekler ve okurken kaldırır, böylece ayarladığınız ve geri okuduğunuz formül metni her zaman temiz Excel odaklı addır. Siz =BITLSHIFT(5,2) ayarlarsınız, dosya _xlfn.BITLSHIFT tutar ve değer ne olursa olsun 20 olarak geri gelir. Önek, kodda çalıştığınız formüllere asla sızmaması gereken bir depolama ayrıntısıdır。
Bir çalışma sayfasında bir araya getirme
Tüm bunlar için genel arayüz küçüktür. Bir TXLSXWorkbook oluşturun, bir çalışma sayfası ekleyin ve Cells[Row, Col].Formula aracılığıyla bir hücreye formül yazıp yeniden hesaplayın ya da formülü o sayfaya göre derleyen ve bir Variant döndüren çalışma sayfasının Calculate yöntemiyle bir ifadeyi doğrudan değerlendirin. Yukarıdaki örneklerde Calculate kullanılmaktadır çünkü çevreleyen sayfa durumu olmadan tek bir mühendislik çağrısının sonucunu gösterir, ancak workbook yeniden hesaplandığında aynı fonksiyonlar gerçek hücre formüllerinin içinde aynı şekilde değerlendirilir。
Çağrı siteleri değil, akılda tutulması gereken kısım kodlamalardır. İkini bir dize yalnızca on basamakta ve yalnızca kendi tabanı için yarım eşiği geçtiğinde işaretlenir. Karmaşık sayı metindir, boş bir sanal katsayı birdir ve ayrıştırıcı bir üstel ifadenin e harfini atlar. Sola kaydırma, kaydırılmadan önce kontrol edilir. Bu dört gerçeği doğru anladığınızda, mühendislik ailesi işaret hatası sürprizlerinin kaynağı olmaktan çıkar。
Kendi alan matematiğinizi aynı motora bağlıyorsanız, bir işleyici kaydetme ve değerleri döndürme mekaniği formül motorunu özel fonksiyonlarla genişletme hakkındaki makalemizde ele alınmıştır; bu formüllerin hücre adresi yerine ada göre sayfalara ulaşması gerektiğinde, tanımlanmış adlar ve sayfalar arası formüller kılavuzu referansların nasıl çözümlendiğini gösterir. Burada açıklanan mühendislik fonksiyonları, bu blogun başka yerlerinde ele alınan okuma, yazma ve hesaplama API'lerinin yanı sıra Delphi ve C++Builder için HotXLS e-tablo bileşeninin bir parçası olarak gönderilir。