專利名稱:用于映射數(shù)學(xué)有限浮點(diǎn)數(shù)的系統(tǒng)和方法
技術(shù)領(lǐng)域:
本發(fā)明一般涉及對(duì)數(shù)值進(jìn)^f亍數(shù)字編碼和解碼,更具體來說涉及 將浮點(diǎn)數(shù)作為二進(jìn)制字符串進(jìn)行編碼的系統(tǒng)和方法。
背景技術(shù):
二進(jìn)制數(shù)字計(jì)算機(jī)長(zhǎng)期以來用于存儲(chǔ)和處理數(shù)值,例如整數(shù)和 浮點(diǎn)數(shù)。大多數(shù)現(xiàn)代計(jì)算機(jī)語(yǔ)言提供對(duì)一種或另 一種數(shù)值的操縱。 計(jì)算機(jī)本質(zhì)是以有效率且有意義的方式管理大量的數(shù)值。模擬計(jì)算機(jī)對(duì)連續(xù)數(shù)值(例如實(shí)數(shù)域)操作,而數(shù)字計(jì)算機(jī)對(duì)離散可數(shù)的數(shù) 值(例如整數(shù)和有理數(shù))操作,并且必須逼近所有其他類型的數(shù)值。 雖然一些特殊用途的模擬計(jì)算^L可能仍用于實(shí)時(shí)產(chǎn)品中,例如在航 天工業(yè)中應(yīng)用的產(chǎn)品中,但是今天所使用的大多數(shù)商用和個(gè)人計(jì)算 機(jī)都是數(shù)字的,并且都是基于使用"位"對(duì)數(shù)值進(jìn)行二進(jìn)制系統(tǒng)編 碼的表示。大多數(shù)現(xiàn)代計(jì)算機(jī)將它們的位分區(qū)成稱為"字節(jié)"的八 個(gè)<立的組或分組。數(shù)值有多種分類。"自然"數(shù)是l、 2、 3、 4、 5等。"全"數(shù)是0、 1、 2、 3、 4、 5等。全數(shù)包括所有自然數(shù)。"整"數(shù)由全數(shù)和它們的 負(fù)數(shù)構(gòu)成;即0、 1、 -1、 2、 -2、 3、 -3等。整數(shù)包括所有全數(shù)。"有
理"數(shù)是將整數(shù)除以全數(shù)時(shí)出現(xiàn)的那些數(shù)值,例如0、 1、 -2、 2/5、-3/4、 22/7等。有理數(shù)包括所有整數(shù)。"無理"數(shù)是無法通過將整數(shù)除 以全數(shù)來表示的那些數(shù)值。有理數(shù)和無理數(shù)一起構(gòu)成"實(shí)"數(shù)的集 合。浮點(diǎn)計(jì)數(shù)是用于表示數(shù)值的表示法、約定或系統(tǒng)。浮點(diǎn)數(shù)實(shí)際 是被十進(jìn)位小數(shù)點(diǎn)分隔的兩個(gè)整數(shù),例如123.45、 555.0和0.00627。 十進(jìn)位小數(shù)點(diǎn)的左邊的數(shù)數(shù)稱為浮點(diǎn)數(shù)的"整數(shù)部分",十進(jìn)位小數(shù) 點(diǎn)右邊的整數(shù)稱為浮點(diǎn)數(shù)的"分?jǐn)?shù)部分"。所有浮點(diǎn)數(shù)是有理數(shù),但 是僅一些有理數(shù)可以表示為浮點(diǎn)數(shù)。例如,有理數(shù)5/4相當(dāng)于浮點(diǎn)數(shù) 1.25。有理數(shù)4/3沒有浮點(diǎn)數(shù)表示;但是,常常使用1.333333...的省 略號(hào)表示3的無窮重復(fù)。但是,數(shù)字計(jì)算機(jī)具有有限的存儲(chǔ)器,因 此只能存儲(chǔ)有限數(shù)目的浮點(diǎn)數(shù)字。有限限度約束了要逼近的此類數(shù) 值的表示,并適用于許多有理數(shù)和肯定地適用于所有無理數(shù)。數(shù)字計(jì)算機(jī)限于離散結(jié)構(gòu)(例如整數(shù))的計(jì)算。通過將兩個(gè)整數(shù)、整數(shù)分子和全數(shù)分子存儲(chǔ)在一起,可以完整地對(duì)有理數(shù)建模。 但是,這種策略很少被實(shí)踐。而是使用浮點(diǎn)數(shù),因?yàn)榕c兩個(gè)整數(shù)可 以實(shí)現(xiàn)的情況相比,可以將更多數(shù)字封裝在浮點(diǎn)數(shù)的字節(jié)中。還可 以無需除法運(yùn)算來比較兩個(gè)浮點(diǎn)數(shù)。可以有效率地對(duì)一組浮點(diǎn)數(shù)排 序和分組,這對(duì)于數(shù)字計(jì)算機(jī)是理想的工作。最后,必須將數(shù)字計(jì)算機(jī)中建模的數(shù)值映射到位字段,即稱為 "編碼"的過程。已經(jīng)有許多提出并實(shí)現(xiàn)的用于對(duì)整數(shù)和浮點(diǎn)數(shù)編 碼的方法。用于對(duì)整數(shù)編碼的最流行方法稱為2的補(bǔ)數(shù)法,Intel Pentium⑧處理器中使用該方法。在該方法中,對(duì)于負(fù)整數(shù),最左邊 位是"1",對(duì)于其余數(shù)值是"0"。對(duì)浮點(diǎn)數(shù)編碼的業(yè)界標(biāo)準(zhǔn)方法是IEEE 754單精度和雙精度格式。正EE 754編碼法是針對(duì)優(yōu)4b某些設(shè)計(jì)約束而設(shè)計(jì)的。在IEEE 754 編碼法中,分配固定數(shù)目的字節(jié)。例如,單精度法將所有浮點(diǎn)數(shù)編 碼到四個(gè)字節(jié)中。雙精度法將所有數(shù)值編碼到八個(gè)字節(jié)中。最左邊 位表示數(shù)值的符號(hào)。當(dāng)編碼中的所有字節(jié)為零時(shí),浮點(diǎn)數(shù)表示零。
在邏輯上依照如下對(duì)于負(fù)數(shù),符號(hào)位是"1",對(duì)于其余數(shù)值是"0"。 每個(gè)位組合具有相應(yīng)的解釋,有效率地將盡可能多的數(shù)值編碼到固 定數(shù)目的字節(jié)中。某些位模式^H爭(zhēng)殊值進(jìn)行編碼,例如正無窮大、 負(fù)無窮大和NaN (非數(shù)值)。針對(duì)算術(shù)邏輯單元(ALU)和其他數(shù)學(xué) 處理器已經(jīng)進(jìn)行了優(yōu)化。編碼方法將位劃分成三個(gè)組符號(hào)(S) 位、尾數(shù)(或精度)(M)位和指數(shù)(E)位。例如,四字節(jié)單精度 編碼方法4夸32-位劃分為SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM,即一個(gè)符號(hào)位,然后8個(gè)指數(shù)位,然后是23個(gè)尾 數(shù)位。這些編碼方法中的一些位模式可以表示相同的數(shù)值。例如, 00000000 00000000 00000000 00000000表示零。但是將最左邊位更改為"r,結(jié)果是負(fù)零,它是與正零相同的值。此外,當(dāng)浮點(diǎn)數(shù)非常接近零(例如1.234567e-30)時(shí),使用稱為去歸一化的不同編碼方 法來將有效數(shù)字的丟失最小化,同時(shí)保持在具有固定數(shù)目的字節(jié)的 約束內(nèi)。因?yàn)檫@些標(biāo)準(zhǔn)編碼的方法定義固定數(shù)目的字節(jié),所以浮點(diǎn)數(shù)的 范圍和精度都是有限的。例如,單精度法可能永遠(yuǎn)無法表示多于7 位十進(jìn)制數(shù)字;即23個(gè)二進(jìn)制尾數(shù)位乘以Log(2)將23位base-2數(shù) 字轉(zhuǎn)換成base-10數(shù)字的數(shù)值。"單"精度浮點(diǎn)方法為指數(shù)分配8位, 這樣使"帶符號(hào)的"二進(jìn)制范圍達(dá)到-128至+127。在十進(jìn)制中,該 范圍變成約為-38至+38,即128^og(2)約為38。因此,"單"精度浮 點(diǎn)數(shù)值無法存儲(chǔ)大于le39的數(shù)值。將浮點(diǎn)數(shù)編碼的現(xiàn)有策略是針對(duì) 速度和空間考慮來優(yōu)化的,它將最大數(shù)目的可能數(shù)值組合封裝在固 定數(shù)目的字節(jié)中。當(dāng)將一個(gè)浮點(diǎn)編碼的數(shù)值;波此比較時(shí),必須首先將這兩個(gè)編碼的數(shù)值解碼,之后才能確定是大于、等于或小于另一個(gè)數(shù)值。必須 將這些浮點(diǎn)數(shù)的所有字節(jié)讀取到存儲(chǔ)器中,并對(duì)其函數(shù)變換(即解 碼),之后才能進(jìn)行比較。在現(xiàn)代編程語(yǔ)言中以及現(xiàn)代處理器中,將找到用于將數(shù)值編碼 的許多不同方法。對(duì)于整數(shù),有8位"字節(jié)"、16位"short"、 32位 "int,,和64位"long"。所有此類數(shù)值可以是"帶符號(hào)的"以包括負(fù) 數(shù),或可以是"不帶符號(hào)的"以僅允許非負(fù)數(shù)值。此外,許多處理 器在編碼中將字節(jié)顛倒,稱為"小端"或"端"策略。浮點(diǎn)數(shù)具有 多種類別,例如,32位"single" 、 64位"double"和80位"decimal"。 所有此類數(shù)值格式還具有字符串"可打印"表示。當(dāng)將來自一種編 碼方案的數(shù)值與來自另一種編碼方案的另一個(gè)數(shù)值比較時(shí),通常必 須將該數(shù)值轉(zhuǎn)換到另 一個(gè)數(shù)值的編碼方法,之后才進(jìn)行比較。用于比較兩個(gè)不同類屬的位結(jié)構(gòu)的最自然的方法是從左到右按 位比較技術(shù)。位"0"總是小于位"1"。為了比較兩個(gè)位陣列A和B, 將A的最左位、表示為A(0)與B的最左邊位、表示為B(0)比較。如 果A(0)〈B(0),則A小于B。如果A(0)〉B(0),則A大于B。但是 如果A(O)-B(O),則檢查次左邊位,分別表示為A(l)和B(l)。該策 略連續(xù)重復(fù)將A(i)與B(i)比較,直到找到成對(duì)的位值不同為止。如果 通過索引i的循環(huán)期間在找到不同之前A或B檢查完所有位,則缺 省情況下首先檢查完位的陣列"小于"另一個(gè)陣列。換言之,當(dāng)發(fā) 現(xiàn)所有成對(duì)的位均為相等時(shí),較短的陣列"小于"較長(zhǎng)的陣列。上文用于比較位陣列的算法通常被硬編碼到微處理器中以實(shí)現(xiàn) 有效率的速度優(yōu)化。遺憾的是,該算法無法用于比較大多數(shù)編碼的 數(shù)值的對(duì)應(yīng)字節(jié)陣列;尤其是浮點(diǎn)數(shù)值。其原因是流行的浮點(diǎn)編碼 方法中的最左邊符號(hào)(S)位對(duì)于負(fù)數(shù)是"1",而對(duì)于其余數(shù)值為"0"。 當(dāng)對(duì)它們進(jìn)行數(shù)值排序時(shí),負(fù)數(shù)總是出現(xiàn)在正數(shù)之前,但是由于按數(shù)值約定,"r的位值出現(xiàn)在"o"的位值之后,所以發(fā)生邏輯沖突。僅僅反轉(zhuǎn)符號(hào)位是不足夠的。例如,通常使用2的補(bǔ)數(shù)法將整數(shù)2 編碼到為00000010的字節(jié)中。數(shù)值-2則成為11111110。這兩個(gè)數(shù)值 的按位次序明確地將11111110置于00000010之后,盡管數(shù)值-2小于 2。甚至約束于正數(shù)時(shí)仍存在此問題。考慮256作為二進(jìn)制值00000001 00000000。當(dāng)與為00000010的數(shù)值2按位比較時(shí),256中的第一個(gè)
字節(jié)小于2中的第一個(gè)字節(jié)。與此相反,現(xiàn)代微處理器通常包括比較兩個(gè)8字節(jié)"雙"精度正EE 754浮點(diǎn)數(shù)的指令。該指令必須提取每個(gè)數(shù)值的所有8個(gè)字節(jié),之后 才能執(zhí)行比較。如果4字節(jié)浮點(diǎn)比較指令不存在,則必須將4字節(jié) "單"精度正EE 754浮點(diǎn)數(shù)轉(zhuǎn)換到8字節(jié)編碼,之后才能進(jìn)行比較。 對(duì)于共有的整數(shù),微處理器定義專門針對(duì)1字節(jié)、2字節(jié)、4字節(jié)和 8字節(jié)帶符號(hào)和不帶符號(hào)的整數(shù)比較設(shè)計(jì)的其他指令。不存在一種一 個(gè)大小適合所有的算法,可以比較所有這些數(shù)值編碼格式。發(fā)明內(nèi)容在一個(gè)實(shí)施例中,本發(fā)明是一種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn)的 方法,該方法包括提供浮點(diǎn)數(shù),以及將浮點(diǎn)數(shù)編碼成二進(jìn)制串,以 便通過對(duì)二進(jìn)制串的從左到右比較來確定浮點(diǎn)數(shù)的相對(duì)大小。在另 一個(gè)實(shí)施例中,本發(fā)明是一種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn) 的方法,該方法包括提供浮點(diǎn)數(shù),以及將浮點(diǎn)數(shù)編碼成二進(jìn)制串, 該二進(jìn)制串具有隨浮點(diǎn)數(shù)的尾數(shù)和指數(shù)而變化的長(zhǎng)度。在另 一個(gè)實(shí)施例中,本發(fā)明是一種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn) 的方法,該方法包括提供浮點(diǎn)數(shù),以及將浮點(diǎn)數(shù)編碼成二進(jìn)制串, 其中該二進(jìn)制串的每個(gè)字節(jié)的一部分確定另一個(gè)字節(jié)是否在該二進(jìn) 制串中緊隨其后。在另一個(gè)實(shí)施例中,本發(fā)明是一種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn) 的方法,該方法包括提供浮點(diǎn)數(shù),以及將浮點(diǎn)數(shù)編碼成二進(jìn)制串, 其中編碼過程對(duì)所有浮點(diǎn)數(shù)一起操作。在一個(gè)實(shí)施例中,本發(fā)明是一種可與可編程計(jì)算機(jī)處理器一起 使用的其中包含有計(jì)算機(jī)可讀程序代碼的計(jì)算機(jī)程序產(chǎn)品,包括將 浮點(diǎn)數(shù)編碼成二進(jìn)制串以便通過對(duì)二進(jìn)制串的從左到右比較來確定 浮點(diǎn)數(shù)的相對(duì)大小的計(jì)算機(jī)可讀程序代碼。在另 一個(gè)實(shí)施例中,本發(fā)明是一種用于對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)
系統(tǒng),該系統(tǒng)包括用于提供浮點(diǎn)數(shù)的裝置,以及用于將浮點(diǎn)數(shù)編碼 成二進(jìn)制串以便通過對(duì)二進(jìn)制串的從左到右比較來確定浮點(diǎn)數(shù)的相對(duì)大小的裝置。
圖1圖示浮點(diǎn)編碼方法之間的比較; 圖2圖示業(yè)界標(biāo)準(zhǔn)的浮點(diǎn)編碼方法的位格式; 圖3圖示浮點(diǎn)數(shù)與它們的對(duì)應(yīng)十六進(jìn)制和二進(jìn)制編碼之間的關(guān) 系的示例;圖4圖示根據(jù)本發(fā)明編碼方法的浮點(diǎn)數(shù)的位格式;圖5圖示對(duì)浮點(diǎn)數(shù)編碼的一般過程;圖6圖示用于執(zhí)行對(duì)浮點(diǎn)數(shù)編碼的方法的通用計(jì)算機(jī);圖7圖示本發(fā)明編碼方法的對(duì)浮點(diǎn)數(shù)的單字節(jié)編碼;圖8圖示用于浮點(diǎn)數(shù)的附加編碼;以及圖9圖示用于浮點(diǎn)數(shù)的時(shí)間和日期編碼。
具體實(shí)施方式
下文參考附圖在一個(gè)或多個(gè)實(shí)施例中描述本發(fā)明,其中相似的 數(shù)字表示相同或相似的部件。雖然本發(fā)明是根據(jù)實(shí)現(xiàn)本發(fā)明的目的 的最佳方式來描述的,但是本領(lǐng)域技術(shù)人員將認(rèn)識(shí)到它要涵蓋所附 權(quán)利要求及其等效物定義的本發(fā)明精神和范圍內(nèi)可能包含的備選、 修改和等效物,所附權(quán)利要求及其等效物為下文公開和附圖所支持。本發(fā)明是一種計(jì)算機(jī)實(shí)現(xiàn)的方法,該方法將浮點(diǎn)數(shù)編碼到位陣 列或從位陣列解碼浮點(diǎn)數(shù),以z便對(duì)兩個(gè)位陣列的自然從左到右逐個(gè) 位比較在邏輯上且一致地與它們對(duì)應(yīng)的數(shù)值的自然排序映射。例如, 給定兩個(gè)任意浮點(diǎn)數(shù)Fl和F2,本發(fā)明將每個(gè)數(shù)值一對(duì)一且分別地映 射到位陣列Al和A2,使得當(dāng)且僅當(dāng)AKA2的情況下FKF2。本發(fā)明的浮點(diǎn)編碼方法在存儲(chǔ)和操縱數(shù)字計(jì)算機(jī)中的數(shù)值時(shí)尤
其有用。該編碼方法在許多應(yīng)用中都是有用的,包括諸如金融、汽 車、航空和工業(yè)控制等的浮點(diǎn)數(shù)的存儲(chǔ)和計(jì)算。在現(xiàn)實(shí)中,浮點(diǎn)數(shù)實(shí)際應(yīng)用于數(shù)字計(jì)算機(jī)大量處理(crunching)任何工業(yè)、商業(yè)和個(gè) 人應(yīng)用的數(shù)值的任何地方。該方法可以在軟件中或許多數(shù)字計(jì)算機(jī) 的硬件組件內(nèi)執(zhí)行。在多種方面中,本發(fā)明是一種包括將浮點(diǎn)數(shù)編碼成二進(jìn)制串的 計(jì)算機(jī)實(shí)現(xiàn)的方法。通過對(duì)二進(jìn)制串的從左到右比較來確定浮點(diǎn)數(shù) 的相對(duì)大小。本發(fā)明還是一種^l夸浮點(diǎn)數(shù)編碼成二進(jìn)制串的計(jì)算機(jī)實(shí) 現(xiàn)的方法,該二進(jìn)制串具有隨浮點(diǎn)數(shù)的尾數(shù)和指數(shù)而變化的長(zhǎng)度。 本發(fā)明還是一種將浮點(diǎn)數(shù)編碼成二進(jìn)制串的計(jì)算機(jī)實(shí)現(xiàn)的方法,其 中該二進(jìn)制串的每個(gè)字節(jié)的一部分確定另一個(gè)字節(jié)是否在該二進(jìn)制 串中緊隨其后。本發(fā)明還是一種將浮點(diǎn)數(shù)編碼成二進(jìn)制串的計(jì)算機(jī) 實(shí)現(xiàn)的方法,其中該編碼過程對(duì)所有浮點(diǎn)數(shù)一起操作?;蛘撸景l(fā)明可以是一種將任何浮點(diǎn)數(shù)映射到位陣列并從位陣 列映射到浮點(diǎn)數(shù),使得對(duì)浮點(diǎn)數(shù)編碼所必需的位的數(shù)目可以改變并 增長(zhǎng)到對(duì)該數(shù)值編碼所需的指數(shù)位的數(shù)目的方法。本發(fā)明還可以被 視為 一種將任何浮點(diǎn)數(shù)映射到位陣列并從位陣列映射到浮點(diǎn)數(shù),使 得對(duì)浮點(diǎn)數(shù)編碼所必需的位的數(shù)目可以改變并增長(zhǎng)到對(duì)該數(shù)值編碼 所需的尾數(shù)位的數(shù)目或任何逼近精度的程度的方法。本發(fā)明還可以 被視為 一種將任何浮點(diǎn)數(shù)映射到位陣列并從位陣列映射到浮點(diǎn)數(shù), 使得對(duì)浮點(diǎn)數(shù)編碼所需的位的數(shù)目對(duì)于較頻繁使用的數(shù)值較少而對(duì) 于較不頻繁使用的數(shù)值較多的方法。作為介紹性定義和約束,^假定"雙射映射"定義為"一對(duì)一映 射"函數(shù)。即如果M是集合A與集合B之間的映射,則對(duì)于A中 的每個(gè)a,恰好對(duì)應(yīng)有B中的一個(gè)b,而對(duì)于B中的每個(gè)b,恰好對(duì) 應(yīng)有A中的一個(gè)a。因此集合A與B必須具有相同數(shù)目的元素。將"浮點(diǎn)數(shù)"定義為相當(dāng)于稱為"INTEGRAL (整數(shù)部分)"的整數(shù), 后跟小數(shù)點(diǎn),再后跟稱為"FRACTION (分?jǐn)?shù)部分)"的整數(shù)。換言
之,浮點(diǎn)數(shù)是如下格式的數(shù)值 "INTEGRAL.FRACTION"。將項(xiàng) "F1<F2"定義為兩個(gè)任意浮點(diǎn)數(shù)F1與F2的比較,其中說是F1小 于F2 , 這在當(dāng)且僅當(dāng)(INTEGRAL(F1) < INTEGRAL(F2))或 ((INTEGRAL(Fl) = INTEGRAL(F2》且(FRACTI0N(F1) < FRACTI0N(F2)))的情況下為真。換言之,如果Fl的整數(shù)部分小于F2 的整數(shù)部分,則F1 < F2;反之依然。如果F1的整數(shù)部分等于F2的 整數(shù)部分,但是F1的分?jǐn)?shù)部分小于F2的分?jǐn)?shù)部分,則F1 < F2,以 及反之依然。將"F1 > F2"定義為兩個(gè)任意浮點(diǎn)數(shù)F1與F2的比較, 其中說是F1大于F2,這在當(dāng)且僅當(dāng)F2<F1的情況下為真。將"F1 = F2"定義為兩個(gè)任意浮點(diǎn)數(shù)F1與F2的比較,其中說是F1等于F2, 這在當(dāng)且僅當(dāng)F2<F1為假且F1 〉F2為假的情況下為真。進(jìn)一步將"位模式"定義為由0、 1、字母和空格構(gòu)成的字符串。 例如,"SZ11EEE1 EEEMMMMO"是位模式。將位模式B的"頭部" 定義為最左邊位。將位模式B的"尾部"定義為由移除了最左邊位 的全部B構(gòu)成的位模式。將位"0"定義為小于位"1"。將"B1<B2" 定義為兩個(gè)任意位模式Bl與B2的比較,其中說是B1小于B2。在 如下情況下此命題成立Bl沒有位,而B2具有位;要不然是B1的 頭部小于B2的頭部;要不然是Bl的尾部小于B2的尾部。對(duì)于任 何兩個(gè)任意位模式B1和B2,如果B1 〈B2和B2〈B1都不成立,則 Bl =B2。進(jìn)一步將"位B的補(bǔ)數(shù)"定義為如果B是"0",則B的補(bǔ)數(shù)為 T或如果B是T,則B的補(bǔ)數(shù)為"0"。將"位模式的補(bǔ)數(shù)"定 義為該模式中所有位的補(bǔ)數(shù)。將"作為后綴附加于位模式,,定義為 相當(dāng)于對(duì)位模式追加;即作為后綴附加于位模式的尾部(或右邊)。 將"111"作為后綴附加于"000"得到"000111"。將"作為前綴附 加于位模式"定義為相當(dāng)于前置于位模式;即附加于位模式的頭部 (或左邊)。將"111"作為前綴添加于"000"得到"111000"。將"S,, 位定義為編碼中的第一位,它表示整個(gè)數(shù)值的符號(hào)。將"Z"位定義
為編碼中的下一位,它表示指數(shù)的符號(hào)。將"E"位定義為表示指數(shù) 位。將"M"位定義為表示尾數(shù)位。將"X"位定義為表示每第8個(gè) 位出現(xiàn)的表示下一個(gè)字節(jié)是否是浮點(diǎn)數(shù)編碼的一部分的擴(kuò)充位。一個(gè)目標(biāo)是將任何浮點(diǎn)數(shù)編碼成位模式,使得如下約束保持為 真。該編碼方法是所有浮點(diǎn)數(shù)的集合F與編碼集之間的雙射映射, 編碼集是所有位模式的子集。每個(gè)適合的編碼位模式B恰好對(duì)應(yīng)于 一個(gè)浮點(diǎn)數(shù)。每個(gè)浮點(diǎn)數(shù)恰好對(duì)應(yīng)于一個(gè)編碼位模式。每個(gè)唯一的 浮點(diǎn)數(shù)編碼成唯一的二進(jìn)制串。對(duì)于分別編碼成位;漠式Bl和B2的 任意兩個(gè)浮點(diǎn)數(shù)F1和F2,在當(dāng)且僅當(dāng)B1 〈B2的情況下F1 < F2。 換言之,通過創(chuàng)建映射到它們的對(duì)應(yīng)位模式Bl至Bn的有序浮點(diǎn)數(shù) Fl至Fn的表,從而位模式Bl至Bn也將是有序的。轉(zhuǎn)至附圖,圖1是5種/>知的浮點(diǎn)編碼方法與本發(fā)明的編碼方 法之間的比較。表10示出Single、 Double、 Extended, Quadruple和 Brookshear編碼方法以及如列12中描述的本發(fā)明創(chuàng)新的浮點(diǎn)編碼方 法。標(biāo)題為"總位數(shù)"的行示出比較編碼方法分別使用32、 64、 80、 128和8位,而本發(fā)明編碼方法使用8位的任何倍數(shù)。僅本發(fā)明的方 法可以改變它在編碼過程中使用的位的數(shù)目。標(biāo)題為"指數(shù)位"的 行示出保留用于對(duì)指數(shù)建才莫的位的數(shù)目。標(biāo)題為"最小指數(shù)"和"最 大指數(shù)"的行計(jì)算指數(shù)位的范圍。標(biāo)題為"尾數(shù)位"的行示出保留 用于對(duì)浮點(diǎn)的尾數(shù)位編碼的位的數(shù)目;即有效的"精度"位。標(biāo)題 為"最小正值"和"最大正值"的行表示整個(gè)浮點(diǎn)數(shù)的對(duì)應(yīng)范圍。存在128位(16字節(jié))的"quadrupLe"方法,但是它通常不應(yīng) 用于個(gè)人計(jì)算機(jī)和小型商用計(jì)算機(jī)。Brookshear的8位浮點(diǎn)表示用于 向計(jì)算機(jī)科學(xué)學(xué)生演示和教授浮點(diǎn)數(shù)。所有這些比較方法(不包括 本發(fā)明的方法)都是相似的,因?yàn)檫@些位具有一個(gè)符號(hào)位,后跟固 定數(shù)目的指數(shù)位,再后跟固定數(shù)目的精度位。"0"的符號(hào)位表示非 負(fù)數(shù)。圖2的表20示出現(xiàn)有編碼方法如何指定對(duì)位位置的解釋。標(biāo)題
為"編碼方法"的第一列包含用于比較的當(dāng)代浮點(diǎn)編碼方法的常用 名稱。標(biāo)題為"字節(jié)計(jì)數(shù)"的第二列示出每種編碼方法使用多少固 定字節(jié)。標(biāo)題為"位格式"的第三列示出每個(gè)字節(jié)中每個(gè)位是如何使用的。最左邊位是符號(hào)(S)位。接著的一組位是指數(shù)(E)位。 余下右邊位是尾數(shù)(M)位。這些位按8個(gè)位分組,并由空格分隔。圖3中的表30示出如何解釋示范字節(jié)陣列來表示浮點(diǎn)數(shù)。每行 表示一個(gè)示例。標(biāo)題為"行"的第一列僅列舉示例行。標(biāo)題為"十 六進(jìn)制字節(jié)"的第二列提供空才各分隔的每個(gè)字節(jié)的十六進(jìn)制值。頭 部包含"00 01 02 03"用于幫助以方便觀看的方式列舉數(shù)據(jù)行中下列 的字節(jié)。以00開始從左到右列舉字節(jié)和位。例如,行3的字節(jié)01 值是"C0"。每個(gè)字節(jié)具有兩個(gè)十六進(jìn)制數(shù)字。十六個(gè)十六進(jìn)制數(shù)字 是"0123456789ABCDEF"。因?yàn)樗加?個(gè)位來表示16種組合,并 且因?yàn)橐粋€(gè)字節(jié)具有8位,所以需要2個(gè)十六進(jìn)制數(shù)字來編碼一個(gè) 字節(jié)。標(biāo)題為"對(duì)應(yīng)位"的第三列示出第二列的二進(jìn)制等效值。這 些位按8個(gè)位分組,并由空格分隔。頭部中也示出位列舉。例如, 行3的位11是"1",以及行3的位12是"0"。標(biāo)題為"對(duì)應(yīng)正EE 754 數(shù)值"的第四列示出位值編碼的等效IEEE 754浮點(diǎn)解釋。在圖4中,表40圖示本發(fā)明的浮點(diǎn)編碼方法。注意僅示出前8 個(gè)字節(jié)的編碼模式。從表40得出用于添加更多指數(shù)位或尾數(shù)位的公 式。標(biāo)題為"行"的第一列列舉示例行。標(biāo)題為"E"的第二列表示 模式中指數(shù)(E)位的數(shù)目。標(biāo)題為"M"的第三列表示模式中尾數(shù) (M)位的數(shù)目。標(biāo)題為"MAX EXP,,的第四列表示指數(shù)位可以建 模的絕對(duì)十進(jìn)制值。標(biāo)題為"數(shù)字"的第五列表示模式可以建模的 有效十進(jìn)制數(shù)字的近似數(shù)。標(biāo)題為"字節(jié)0"、"字節(jié)1"等的其余列 表示其中每個(gè)字符描述要如何解釋對(duì)應(yīng)位的的實(shí)際位模式。解釋字符是"S"、 "Z"、 "E"、 "M"、 "0"和T。 S用于符號(hào) 位,其中0表示浮點(diǎn)值為負(fù),以及l(fā)表示為正。如果符號(hào)位是0,則 立即將所有后續(xù)位取負(fù)。Z用于指數(shù)的符號(hào),其中0表示指數(shù)值為負(fù),
以及1表示為正。E用于實(shí)際正指數(shù)值。如果將才莫式中的所有E位 設(shè)為1,則不使用模式,而且嘗試下一行中的模式。M用于實(shí)際正尾 數(shù)值。"0"表示終止模式的擴(kuò)充位值。當(dāng)為0時(shí),后續(xù)字節(jié)不是該 模式的一部分。"1"表示延續(xù)才莫式的擴(kuò)充位值。當(dāng)為1時(shí),下一個(gè) 字節(jié)是該才莫式的一部分。在給出多種編碼示例之前,將模式的"指數(shù)調(diào)整,,定義為從指 數(shù)位N的數(shù)目映射到一個(gè)整數(shù)。對(duì)于此實(shí)現(xiàn),選擇N作為集合(2、 6、 12、 28等}的成員。該集合的選擇基于處理器優(yōu)化條件,但是該集合 可以是以大于1的第一個(gè)元素開始的整數(shù)的任何集合,其中每個(gè)后 繼元素按2或2以上的步長(zhǎng)遞增。然后指數(shù)調(diào)整映射變成關(guān)系集合 {(2,0), (6,3), (12,66), (28,4161), ...,(N,EA)},其中EA是2八(前一個(gè)N) + (前一個(gè)EA) — 1 。例如,條目(28,4161)確定為2A12 + 66 -1 = 4096 + 66 -1=4161。為了將0.00的浮點(diǎn)值編碼,使用"10000000"的位才莫式作為公 理。"10000000"意味著不應(yīng)用上文的模式規(guī)則的零。有利的是,如零這種的公共值和流行值僅應(yīng)該占用存儲(chǔ)器的 一個(gè)字節(jié)來編碼,這對(duì)手其他比較方法是不成立的。為了對(duì)1.000的浮點(diǎn)二進(jìn)制值編碼, 將該數(shù)值轉(zhuǎn)換成二進(jìn)制科學(xué)表示,得到le0。即,1乘以10的0次冪。為了將有效數(shù)字歸一化,丟棄最左邊"r數(shù)字,得到尾數(shù)"o"。指數(shù)是"0"。因?yàn)樗璧淖疃涛徊拍骄哂?個(gè)指數(shù)位,所以從該指數(shù) 減去"0"的指數(shù)調(diào)整,得到對(duì)應(yīng)于具有至少一個(gè)M位和至少一個(gè)E 位的模式的"0"。圖4的行1中的位模式"SZEEMMM0"是滿足這 些條件的第一個(gè)模式。將尾數(shù)"0"插入該模式中為"SZEE0000"。 插入指數(shù)"0"為"SZ000000"。因?yàn)橹笖?shù)不為負(fù),所以將Z設(shè)為T, 即"S1000000"。最后,整個(gè)數(shù)值的符號(hào)不為負(fù),所以將S設(shè)為"1", 即"11000000"。表40在解釋本發(fā)明的浮點(diǎn)數(shù)編碼方法時(shí)是有用的。令F為一個(gè) 浮點(diǎn)數(shù)。為了編碼? = -9.5,即二進(jìn)制形式的"1001.1,將該數(shù)值轉(zhuǎn)
換成二進(jìn)制科學(xué)表示,即l.OOllell。有效數(shù)字是"10011"。在丟棄 最左邊位,歸一化的尾數(shù)變成"0011"。指數(shù)位是"11"。指數(shù)的模式 將不與"SZEEMM..."的格式吻合,因?yàn)樗蠩位將是"1"。這是 指示具有多個(gè)指數(shù)E位的后續(xù)模式的指數(shù)標(biāo)記位模式。因?yàn)橄乱粋€(gè) 估計(jì)是"SZ11EEE1 EEEMM...",即包含6個(gè)E位,所以從當(dāng)前指數(shù) 值減去指數(shù)調(diào)整3得到"0"。因?yàn)橛?個(gè)尾數(shù)位要編碼,所以圖4 中可足夠?qū)Ω↑c(diǎn)數(shù)建模的第一模式在行9;即"SZ11EEE1 EEEMMMMO"。插入尾數(shù)"0011"是"SZ11EEE1 EEE00110"。插入 指數(shù)位"0"是"SZ1畫1 00000110"。該指數(shù)不為負(fù),所以將Z設(shè) 為T,以得出"Sll層Ol 00000110"。但是-9.5為負(fù)值,所以將S 設(shè)為"0",這需要所有其他位均取負(fù)號(hào)以得出"00001110 11111001", 即二進(jìn)制形式的"0EF9"。還可以使用圖5中的流程圖50來對(duì)同一個(gè)數(shù)值-9.5編碼。開始 于步驟100,即ENCODE(-9.5),因?yàn)樵诓襟E102中F不等于0,所 以移到步驟106。因?yàn)樵诓襟E106中F咖子0,所以移到步驟108。 首先ENCODE(-F),這意味著ENCODE(9.5),然后對(duì)這些位取補(bǔ)數(shù)。 步驟108實(shí)際是對(duì)該流程圖的遞歸調(diào)用。為了執(zhí)行ENCODE(9.5), 再次從步驟100開始,并通過步驟102和106到步驟112。以B」'r 開始。取N-2,并將F表示為1.0011e11,即給出M = "OOll"和E = "11",以及X」11"。在步驟114中,為3的X大于為2的2AN-2。 由此移到步驟116。令為1的B附加為3 (即二進(jìn)制形式的"11") 的2AN-1的后綴。B變成"111"。從為3的X減去為3的2AN-1。 X 變成0。最后,可選地按4遞增為2的N。 N現(xiàn)在為6。返回到步驟 114,為0的X不再大于為2A6-2 (即62)的2AN-2。這樣移到步驟 118,即以"0"左填充為"0"的X,直到其位的長(zhǎng)度等于為6的N。 由此X變成"000000"。步驟120將為"000000"的X追加到為"111" 的B。由此B變成"111000000"。在步驟122中,為3的E不小于0。由此跳到步驟126。以"1"
作為前綴附加于B,以及以M作為后綴附加于B。 B變成"1" + "111000000" + "0011"、即"11110000000011"。步驟128在每第 8個(gè)位之前插入擴(kuò)充位"1"。由此B變成"11110001 0000011"。步 驟130以"0"右填充B以與字節(jié)分組匹配;即8位的偶數(shù)倍。B變 成"11110001 00000110",它是對(duì)應(yīng)于9.5的位編碼的十六進(jìn)制編碼 "F1 06"。步驟132返回到步驟108至步驟110的遞歸調(diào)用,它取B 的補(bǔ)數(shù)以得出-9.5的編碼。"F1 06"的補(bǔ)數(shù)是"0EF9",這與圖4所 示的表40使用的上文示例完全相同??梢詳U(kuò)充圖4所示的表40的模式以適用于任何浮點(diǎn)數(shù)。行22 中的才莫式是"SZ111111 11111111 11111111 EEEEEEE1 EEEEEEE1 EEEEEEE1 EEEEEEE1 MMMMMMMO"。它具有28個(gè)指數(shù)位和7個(gè) 尾數(shù)位。如果需要更多的指數(shù)位,擴(kuò)充它們的方法是首先將所有現(xiàn) 有的"E"位替換為'T,,然后加倍"EEEEEEE1"模式的數(shù)目。這樣做將得到"szimii miiiii imiiii iimiii imini muni11111111 EEEEEEE1 EEEEEEE1 EEEEEEE1 EEEEEEE1 EEEEEEE1 EEEEEEE1 EEEEEEE1 EEEEEEE1 MMMMMMMO",產(chǎn)生56個(gè)擴(kuò)充 位。如果需要更多尾數(shù)位,則4又追加一個(gè)或多個(gè)"MMMMMMM1" 模式,同時(shí)適當(dāng)?shù)匦薷拿總€(gè)字節(jié)的最右邊擴(kuò)充位。例如,通過這種 方法擴(kuò)充圖4的行9中的模式,得到行10至15。對(duì)于追加的每個(gè)尾 數(shù)"MMMMMMM1"字節(jié),將約2.1的有效十進(jìn)制數(shù)字添加到該數(shù) 值的精度。因?yàn)榉峙涿總€(gè)字節(jié)中的一個(gè)位作為擴(kuò)充位,所以每個(gè)字 節(jié)僅7個(gè)位對(duì)數(shù)值數(shù)據(jù)建模。8字節(jié)正EE 754雙精度浮點(diǎn)編碼中存 儲(chǔ)的隨機(jī)數(shù)將占用本發(fā)明的編^;方法的9個(gè)字節(jié)。在圖5中,為了對(duì)F^編碼,使用位模式"10000000",其具有 一個(gè)"1"后跟七個(gè)"0"的值。為了將負(fù)浮點(diǎn)數(shù)F編碼成位模式B, 對(duì)其絕對(duì)值編碼以產(chǎn)生位才莫式B,然后令8=它自己的補(bǔ)數(shù)。考慮下文對(duì)浮點(diǎn)數(shù)13.75編碼的另一個(gè)示例,浮點(diǎn)數(shù)13.75具有 作為整數(shù)部分的"13 "和作為分?jǐn)?shù)部分的"75"。在圖5中,因?yàn)檎?br>
數(shù)部分13為正,所以步驟112開始于B = "1"。令N-2,即大于l 的任意數(shù)。在該算法中,數(shù)N表示分配用于存儲(chǔ)指數(shù)的位的數(shù)目。 為了以二進(jìn)制形式表示13.75,將13替換為它的二進(jìn)制等效值"1101",然后將.75替換為它的二進(jìn)制等效值".11"。結(jié)果是"1101.11"。注意二進(jìn)制形式的".1"等于十進(jìn)制形式的0.5; 二進(jìn)制 形式的"0.01"等于十進(jìn)制形式的0.25 (0.5 + 0.25 = 0.75 )。接下來, 將"1101.11"轉(zhuǎn)換成指數(shù)表示;即以A承2八B的形式。A是稱為"有 效位數(shù)"的二進(jìn)制浮點(diǎn)數(shù),它可以是兩個(gè)值的其中之一(1)0;或(2)大于或等于l但是小于2。 B是整數(shù)指數(shù)。A承2^B常常書寫為 AeB,其中"e"是意指"指數(shù)"的符號(hào)。所以"1101.11"書寫為指 數(shù)表示形式的"1.10111ell",其中"1.10111"是有效位數(shù)且"11" 是指數(shù),這僅將小數(shù)點(diǎn)向左位移3個(gè)位置(即"11"個(gè)位置),以使 僅一個(gè)"1"數(shù)字要位于小數(shù)點(diǎn)位置的左邊。有效位數(shù)被歸一化。因 為它向左位移3個(gè)位置,所以指數(shù)是3 (或二進(jìn)制形式的"ir)。如 果要求將其向右位移,則指數(shù)為負(fù)。這樣,"1.10111"乘以2的3次 冪、即8,得到初始數(shù)值"1101.11"。令X-E的絕對(duì)值,即3。在步驟114中,指數(shù)為"11"、即3,大于2八N-2、即2八2-2(即 2)。由此移到步驟116。向?yàn)?1"的B加后綴"1"重復(fù)N次,即2 次。因?yàn)镹是2,所以以"11"為后綴附加于B。 B現(xiàn)在為"111"。 從為"11"(即3)的X減去2AN-1,即2"2—1 (即3)。 X現(xiàn)在為O。 可選地按任何任意非負(fù)整數(shù)遞增N。根據(jù)規(guī)范實(shí)現(xiàn),N按4遞增,由 此N現(xiàn)在為6。返回到步驟114, X為O,它不大于或等于2AN-2 (即 62)。以"0"為前綴附加于為"0"的X,直到X具有N位(即6位) 為止。由此X為"000000"。在步驟120,將為"000000"的X作為后綴附加于為"111"的 B。由此B為"111000000"。在步驟122中,E不小于0,所以移到 步驟126。尾數(shù)是有效位數(shù)中小數(shù)點(diǎn)之后的所有數(shù)字。有效位數(shù)是"1.10111",所以尾數(shù)是"10111"。就此而言,從有效位數(shù)丟棄前綴"1."。除了 0夕卜,將以"1."為前綴附加于數(shù)值的所有歸一化的有效位數(shù)。以T前置于為"111000000"的B。由此B為"1111000000"。 以為"10111"的M作為后綴附加于B。 B變成"111100000010111"。 在步驟128中,在每第8個(gè)位之前插入"1"。 B變成 "11110001000101111"。在步驟130中,以一個(gè)或多個(gè)"0"作為后 綴附加于位模式,直到該模式中的位的數(shù)目是8的倍數(shù)為止。在此 情況中,為"111100010000101111"的B具有17位,這不是8的倍 數(shù)。所以將7個(gè)"0"追加到B,以將其位的數(shù)目增加到24,這是8 的倍數(shù)。B變成"11110001 00010111 100000000",即十六進(jìn)制形式 的"F1 17 80"。由上文的轉(zhuǎn)換過程可注意到二進(jìn)制串的長(zhǎng)度部分地隨浮點(diǎn)數(shù)的 尾數(shù)和指數(shù)而變化。浮點(diǎn)數(shù)的尾數(shù)值和指數(shù)值部分地確定二進(jìn)制串 的最終長(zhǎng)度。本發(fā)明浮點(diǎn)至二進(jìn)制轉(zhuǎn)換過程的另一個(gè)特征是,二進(jìn)制串的每 個(gè)字節(jié)確定另一個(gè)字節(jié)是否緊隨其后。 一般性規(guī)則是,如果每個(gè)字 節(jié)的最后一位是第一個(gè)字節(jié)的第一位的值,則另一個(gè)字節(jié)緊隨其后。 相反,如果每個(gè)字節(jié)的最后一位不是第一個(gè)字節(jié)的第一位的值,則 沒有后續(xù)字節(jié)緊隨其后。對(duì)于正數(shù),如果字節(jié)結(jié)束于"1",則二進(jìn) 制串的另一個(gè)字節(jié)將緊隨其后。如果字節(jié)結(jié)束于"0",則沒有后續(xù) 字節(jié)緊隨其后。例如,在來自浮點(diǎn)數(shù)13.75的二進(jìn)制串"11110001oooioiii畫ooooo"中,第一個(gè)字節(jié)結(jié)束于"r,所以另一個(gè)字節(jié) 緊隨其后。第二個(gè)字節(jié)結(jié)束于"r,則另一個(gè)字節(jié)緊隨其后。第三個(gè)字節(jié)結(jié)束于"0",則沒有后續(xù)字節(jié)緊隨其后。此特征使得計(jì)算算法能夠確定二進(jìn)制串的結(jié)尾。考慮下文對(duì)浮點(diǎn)數(shù)-13.75編碼的另一個(gè)示例,其中具有作為整 數(shù)部分的"13"和作為分?jǐn)?shù)部分的"75"。為了對(duì)-13.75編碼,對(duì)它 的正值(即13.75 )編碼,然后對(duì)所得到的位模式取負(fù)。B變成"00001110 11101000 01111111",即十六進(jìn)制形式的"0EE8 7F"。考慮對(duì)浮點(diǎn)數(shù)-25.1編碼的另 一個(gè)簡(jiǎn)化示例。對(duì)-25.1編碼與對(duì)25.1 的編碼取補(bǔ)數(shù)相同。從步驟112,開始于B- "1"和N-2。 25.1是 二進(jìn)制形式的"11001.0001100",其中結(jié)尾模式"1100"無限地重復(fù)。 因此,必須在外部決定用于截?cái)啻宋荒J降奈矓?shù)位的數(shù)目,之后才 對(duì)其編碼。如果目標(biāo)要保持與8字節(jié)IEEE 754雙精度編碼相同的精 度,則根據(jù)圖1,需要53個(gè)尾數(shù)位。必須將該二進(jìn)制值擴(kuò)充為"11001.000 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 11"。指數(shù)形式為"1.1001000 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 llelOO"。因此,尾數(shù)位是"1001000 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 11"而指數(shù)是"100"。由此x是"100"。從步驟116,將"11"作為后綴附加于B,以使B為"111"; 從X減去3得到"1";將N從2增加到6;以及移到步驟114。在步 驟118中,填充X以得到"000001", B變成"111000001"。步驟126 給出B = "1111000 0011001 0001100 1100110 0110011 0011001 1001100 11001U) 0110011",其中為了便于查看,以空格將這位分隔成7個(gè)位 的組。步驟128將8位的T添加到7位的每個(gè)分組中。"11110001 00110011 00011001 11001101 01100111 00110011 10011001 l畫lOl 0110011"。在步驟130中,B僅具有71位,而72是8的下一個(gè)偶數(shù) 倍數(shù)。所以將"0"追加到B以使B的位組變成8位的字節(jié)。B變成"11110001 00110011 00011001 11001101 01100111 00110011 10011001 11001101 01100li0",即25.1的編碼。為了得到 -25.1的編碼,對(duì)B取補(bǔ)數(shù)。B變成"00001110 11001100 11100110 00110010 10011000 11001100 01100110 00110010 10011001",它相當(dāng) 于"0E CC E6 32 98 CC 66 32 99"。在對(duì)數(shù)值1000 = "1111101000" = "1.111101000el001"編碼的 更筒化示例中,指數(shù)=1001以及尾數(shù)=111101000。根據(jù)步驟114, 指數(shù)太大難以吻合。所以將"11"作為后綴附加于B,從指數(shù)減去3, 變成"110",并將其追加填充到6個(gè)字符。B變成"111000110"。在
步驟120中,B變成"1111000 1101111 01000"。在每個(gè)第8位前插 入"1",并追加"0"以填充字節(jié)中其余位。B變成"11110001 11011111 01000000",即"F1 DF40"。在對(duì)數(shù)值4,294,967,296 = 2A32 = "100000000000000000000000 000000000" = "lelOOOOO"編;馬的示例中,通過減去3將指數(shù)調(diào)整 到"11101"。尾數(shù)是"0"。位模式變成"S"和"Z"位的"11",后跟指數(shù)調(diào)整的"ir、后跟e位的"oiiior,后跟尾數(shù)的"o",而變成"11110111010"。插入X位得到"11110111 1010000"或"F7 A0"。在對(duì)數(shù)值18,446,744,073,709,551,616 = 2A64 = 'T,后跟64個(gè)"0" ="lelOOOOOO"編碼的示例中。該數(shù)值的指數(shù)是 "1000000",它占 用7位。這樣,指數(shù)調(diào)整是3,從"1000000"減去該指數(shù)調(diào)整得出 "111101",現(xiàn)在將與六個(gè)"E"位吻合。由此,位模式變成"S"和 "Z"位的"11",指數(shù)調(diào)整的"11", "E"位的"111101",尾數(shù)的 "0",從而得到"1111111101"。添加"X,,位之后,最終編碼是"llllllll 10100000",即"FFA0"。同樣,非常大但是有用的數(shù)值(如2"64) 僅占用2個(gè)字節(jié)來編碼。要說明使用圖5的流程圖50的步驟124的示例,利用負(fù)指數(shù)對(duì) 數(shù)值編碼。例如,F(xiàn)-0.0625,即二進(jìn)制形式的1.0e-4。開始于1,然 后將其除以2得到0.5。再除以2得到0.25,再除以2得到0.125,再 次除以2得到0.0625。因?yàn)樵摂?shù)值被除四次,所以指數(shù)是"-4"。由 此,B= T、 M= "0"和E"4,以及X是"100"。通過步驟120, B是"111000001"。在步驟122中,E小于0,所以移到步驟124。 對(duì)B取補(bǔ)數(shù)得到 "000111110"。在步驟126,將B變換成"1" + "000111110" + "0"而得到"10001111100"。步驟128將B變換成 "1000 1111 1100"。步驟130將B變換成"1000 1111 1100 0000", 即十六進(jìn)制形式的"80C0"。雖然給出多個(gè)示例,但是要注意的 一 個(gè)要點(diǎn)是本發(fā)明將浮點(diǎn)數(shù) 編碼成二進(jìn)制串的過程適用于所有浮點(diǎn)數(shù)。該特性是其他現(xiàn)有的編 碼技術(shù)所不具有的,現(xiàn)有的編碼技術(shù)要么限制了指數(shù)的范圍,要么限制尾數(shù)的范圍,如圖1所示。例如,任意精度的Java.Math.BigDecimal 類將其伸縮值限制于32位,并且GNU多精度(GMP)庫(kù)要求數(shù)值 的所有字節(jié)同時(shí)存在于存儲(chǔ)器中。利用本發(fā)明的將浮點(diǎn)數(shù)編碼成二 進(jìn)制串的過程,可以將數(shù)值作為緩沖的流一次一個(gè)字節(jié)來處理,在 字節(jié)被消費(fèi)之后實(shí)際將其廢棄。本發(fā)明編碼方法的另一個(gè)特性在于通過對(duì)二進(jìn)制串的從左到右 比較來確定浮點(diǎn)數(shù)的相對(duì)大小。例如,浮點(diǎn)數(shù)13.75編碼成"11110001 00010111 10000000"。浮點(diǎn)數(shù)1000編碼成"11110001 11011111 01000000"。執(zhí)行從左到右比較對(duì)于前8位得到相同值,但是第二個(gè) 字節(jié)的第一位對(duì)于浮點(diǎn)數(shù)1000是"1",而對(duì)于浮點(diǎn)數(shù)13.75是"0"。 因此,1000大于13.75。在另一個(gè)示例中,截?cái)喑晌矓?shù)的52個(gè)有效 位的浮點(diǎn)數(shù)-25.1編碼成"00001110 11001100 11100110 00110010 10011000 11001100 01100110 00110010薩匪",而浮點(diǎn)數(shù)-13.75編碼成"ooooiiio iiioiooo oiiiiiir。執(zhí)行從左到右比較對(duì)于每個(gè)編碼的前11位得到相同值,但是第12位對(duì)于浮點(diǎn)數(shù)-13.75是"1", 而對(duì)于浮點(diǎn)數(shù)-25.1是"0"。因?yàn)門大于"0",所以-13.75大于-25.1。 因此,通過對(duì)二進(jìn)制串的從左到右比較來確定浮點(diǎn)數(shù)的相對(duì)大小。 如果二進(jìn)制串對(duì)于它們的共有部分完全相同,但是一個(gè)串比另 一個(gè) 串長(zhǎng),則較長(zhǎng)的串對(duì)應(yīng)于較大的浮點(diǎn)數(shù),這可以由該編碼方法推論 出。因?yàn)樗芯幋a的字節(jié)的第8位都是擴(kuò)充位,所以例如如果一個(gè) 編碼占用兩個(gè)字節(jié)和第二編碼占用三個(gè)字節(jié),則每個(gè)編碼的第16位 將不同,因?yàn)槊總€(gè)第8位是確定它是否是編碼中的最后一個(gè)字節(jié)的 擴(kuò)充標(biāo)志。如果兩個(gè)編碼的前15位完全相同,則第16位具有"0" 的編碼將是較小的數(shù)值。在圖6中,是用于執(zhí)行本發(fā)明編碼方法的通用數(shù)字計(jì)算機(jī)60的 簡(jiǎn)化示意圖。計(jì)算機(jī)60具有中央處理單元或微處理器62、海量存儲(chǔ) 裝置或硬盤64、電子存儲(chǔ)器66和通信端口 68。在一個(gè)實(shí)施例中, 計(jì)算機(jī)系統(tǒng)60包含硬件組件、應(yīng)用軟件或用于"t丸行本發(fā)明編碼方法 的計(jì)算機(jī)程序。該軟件原始地在計(jì)算機(jī)可讀介質(zhì)上提供,例如在壓 縮光盤(CD)上提供,或從供應(yīng)商Web網(wǎng)站下載和安裝在期望的計(jì) 算機(jī)上。圖7的表70示出可以編碼成單個(gè)字節(jié)的浮點(diǎn)數(shù)的適合位值組 合。標(biāo)題為"二進(jìn)制"的列示出合法的位值。標(biāo)題為"十進(jìn)制"的 列示出其左邊緊靠著的單元的對(duì)應(yīng)浮點(diǎn)數(shù)值。在256種8位的排列 中,僅81種具有用于本發(fā)明編碼方法的浮點(diǎn)值。表50中僅示出了 這些值。將盡可能多的位排列封裝到固定的空間中不是本發(fā)明編碼 方法的特性??梢栽黾铀璧淖止?jié)的數(shù)目以與任何浮點(diǎn)值相適應(yīng)。這81個(gè)值僅占用一個(gè)字節(jié)來存儲(chǔ),而不是4艮據(jù)正EE 754編碼 標(biāo)準(zhǔn)那樣占用4或8個(gè)字節(jié)。這81個(gè)值可論證地包括多于99.99%的 所有目前使用的數(shù)值。例如,雖然數(shù)值8未在8位編碼模式中出現(xiàn), 但是數(shù)值0至7出現(xiàn)在其中。當(dāng)對(duì)典型家庭中的孩童的數(shù)量建才莫時(shí), 數(shù)值0至7比數(shù)值8遠(yuǎn)遠(yuǎn)高于8倍地^皮頻繁使用。此外,從8到32 的正整數(shù)和負(fù)整數(shù)僅占用兩個(gè)字節(jié)來編碼,這仍是少于正EE 754標(biāo) 準(zhǔn)的字節(jié)。此外,本發(fā)明的單字節(jié)編碼還對(duì)諸如0.25、 0.5、 0.75的 有用的流行數(shù)值建才莫,以及對(duì)其分母最高為32的其他流行整數(shù)分?jǐn)?shù) 建模。注意對(duì)任何負(fù)值逐個(gè)位取負(fù)值等于它的正值。例如,-2.25編碼 為00101101。對(duì)這些位取負(fù)值得出11010010,它直接映射到+2.25值。 最后,注意81個(gè)數(shù)值從-7.5排序到7.5,以及位編碼也從00010001 排序到11101110,這是本發(fā)明編碼方法的考慮周到的設(shè)計(jì)約束。位 值編碼的次序必須與數(shù)值的對(duì)應(yīng)次序匹配,反之亦然,這是最重要 的設(shè)計(jì)約束。圖8中的表80示出根據(jù)本發(fā)明編碼方法的浮點(diǎn)數(shù)與它的編碼之 間的關(guān)系。再注意1024的二進(jìn)制表示是-1024的二進(jìn)制表示的逐個(gè) 位取負(fù)值。此關(guān)系對(duì)于所有數(shù)值及其負(fù)值均為真。在圖9中,本發(fā)明編碼方法可以用于達(dá)到任何精確度和任何日期地來存儲(chǔ)日期和時(shí)間。在表90中,國(guó)際儒略日期和時(shí)間標(biāo)準(zhǔn)直接 映射到浮點(diǎn)數(shù),其中數(shù)值表示自-4713年1月1日起的天數(shù)。分?jǐn)?shù)部 分表示該天自中午12:00起所經(jīng)過的部分。簡(jiǎn)單的日期通常占用5個(gè) 字節(jié)來存儲(chǔ),但是有些可能占用的字節(jié)較少。例如,"1843年11月05 曰"僅占用兩個(gè)字節(jié)。如果年是不重要的,則可以將365天的每一 天編碼為1或2個(gè)字節(jié)。諸如6:00 PM和9:00 AM的常用時(shí)間僅占用一個(gè)字節(jié)來存儲(chǔ)。雖然詳細(xì)說明了本發(fā)明的一個(gè)或多個(gè)實(shí)施例,但是本領(lǐng)域技術(shù) 人員將認(rèn)識(shí)到,可以在不背離所附權(quán)利要求提出的本發(fā)明范圍的前 提下對(duì)這些實(shí)施例進(jìn)行修改和調(diào)整。
權(quán)利要求
1.一種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn)的方法,包括提供浮點(diǎn)數(shù);以及將所述浮點(diǎn)數(shù)編碼成二進(jìn)制串,以便通過對(duì)所述二進(jìn)制串的從左到右比較來確定所述浮點(diǎn)數(shù)的相對(duì)大小。
2. 如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括 如果所述浮點(diǎn)數(shù)為負(fù),則對(duì)所述浮點(diǎn)數(shù)的絕對(duì)值編碼;以及 對(duì)所述浮點(diǎn)數(shù)的二進(jìn)制串轉(zhuǎn)換取補(bǔ)數(shù)。
3. 如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括如果所述浮 點(diǎn)數(shù)為0,則為所述二進(jìn)制串賦值。
4. 如權(quán)利要求3所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所迷 值是T后跟多個(gè)"0"。
5. 如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所述 二進(jìn)制串的每個(gè)字節(jié)的一部分確定另一個(gè)字節(jié)是否在所述二進(jìn)制串 中緊隨其后。
6. 如權(quán)利要求5所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所述 二進(jìn)制串的每個(gè)字節(jié)的位的值確定另一個(gè)字節(jié)是否緊隨其后。
7. 如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,每個(gè) 唯一的浮點(diǎn)數(shù)編碼成唯一的二進(jìn)制串。
8. 如權(quán)利要求1所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所述 浮點(diǎn)數(shù)表示時(shí)間數(shù)據(jù)。
9. 一種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn)的方法,包括 提供浮點(diǎn)數(shù);以及將所述浮點(diǎn)數(shù)編碼成具有隨所述浮點(diǎn)數(shù)的尾數(shù)和指數(shù)而變化的 長(zhǎng)度的二進(jìn)制串。
10. 如權(quán)利要求9所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括如果所述浮點(diǎn)數(shù)為負(fù),則對(duì)所述浮點(diǎn)數(shù)的絕對(duì)值編碼;以及 對(duì)所述浮點(diǎn)數(shù)的二進(jìn)制串轉(zhuǎn)換取補(bǔ)數(shù)。
11. 如權(quán)利要求9所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括如果所述浮 點(diǎn)數(shù)為0,則為所述二進(jìn)制串賦^f直。
12. 如權(quán)利要求11所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所 述值是"1"后跟多個(gè)"0"。
13. 如權(quán)利要求9所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,每個(gè) 唯一的浮點(diǎn)數(shù)編碼成唯一的二進(jìn)制串。
14. 如權(quán)利要求9所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所述 浮點(diǎn)數(shù)表示時(shí)間數(shù)據(jù)。
15. —種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn)的方法,包括 提供浮點(diǎn)數(shù);以及將所述浮點(diǎn)數(shù)編碼成二進(jìn)制串,其中所述二進(jìn)制串的每個(gè)字節(jié) 的一部分確定另 一個(gè)字節(jié)是否在所述二進(jìn)制串中緊隨其后。
16. 如權(quán)利要求15所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所 述二進(jìn)制串的每個(gè)字節(jié)的位的值確定另一個(gè)字節(jié)是否緊隨其后。
17. 如權(quán)利要求15所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,每 個(gè)唯一的浮點(diǎn)數(shù)編碼成唯一的二進(jìn)制串。
18. 如權(quán)利要求15所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所 述浮點(diǎn)數(shù)表示時(shí)間數(shù)據(jù)。
19. 一種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)實(shí)現(xiàn)的方法,包括 提供浮點(diǎn)數(shù);以及將所述浮點(diǎn)數(shù)編碼成二進(jìn)制串,其中所述編碼過程對(duì)所有浮點(diǎn) 數(shù)進(jìn)行。
20. 如權(quán)利要求19所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括 如果所述浮點(diǎn)數(shù)為負(fù),則對(duì)所述浮點(diǎn)數(shù)的絕對(duì)值編碼;以及 對(duì)所述浮點(diǎn)數(shù)的二進(jìn)制串轉(zhuǎn)換取補(bǔ)數(shù)。
21. 如權(quán)利要求19所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,還包括如果所述 浮點(diǎn)數(shù)為o,則為所述二進(jìn)制串貝武值。
22. 如權(quán)利要求21所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所 述值是T后跟多個(gè)"0"。
23. 如權(quán)利要求19所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所 述二進(jìn)制串的每個(gè)字節(jié)的一部分確定另一個(gè)字節(jié)是否在所述二進(jìn)制 串中緊隨其后。
24. 如權(quán)利要求23所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所 述二進(jìn)制串的每個(gè)字節(jié)的位的值確定另 一個(gè)字節(jié)是否緊隨其后。
25. 如權(quán)利要求19所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,每 個(gè)唯一的浮點(diǎn)數(shù)編碼成唯一的二進(jìn)制串。
26. 如權(quán)利要求19所述的計(jì)算機(jī)實(shí)現(xiàn)的方法,其特征在于,所 述浮點(diǎn)數(shù)表示時(shí)間數(shù)椐。
27. —種可與可編程計(jì)算機(jī)處理器一起使用的其中包含有計(jì)算機(jī) 可讀程序代碼的計(jì)算機(jī)程序產(chǎn)品,包括將浮點(diǎn)數(shù)編碼成二進(jìn)制串以 便通過對(duì)所述二進(jìn)制串的從左到右比較來確定所述浮點(diǎn)數(shù)的相對(duì)大 小的計(jì)算機(jī)可讀程序代碼。
28. 如權(quán)利要求27所述的計(jì)算機(jī)程序產(chǎn)品,還包括在所述浮點(diǎn) 數(shù)為負(fù)的情況下對(duì)所述浮點(diǎn)數(shù)的絕對(duì)值編碼并且對(duì)所述浮點(diǎn)數(shù)的二 進(jìn)制串轉(zhuǎn)換取補(bǔ)數(shù)的計(jì)算機(jī)可讀程序代碼。
29. 如權(quán)利要求27所述的計(jì)算機(jī)程序產(chǎn)品,還包括在所述浮點(diǎn) 數(shù)為0的情況下為所述二進(jìn)制串賦值的計(jì)算機(jī)可讀程序代碼。
30. 如權(quán)利要求27所述的計(jì)算機(jī)程序產(chǎn)品,其特征在于,所述 值是T后跟多個(gè)"0"。
31. —種對(duì)浮點(diǎn)數(shù)編碼的計(jì)算機(jī)系統(tǒng),包括 用于提供浮點(diǎn)數(shù)的裝置;以及用于將所述浮點(diǎn)數(shù)編碼成二進(jìn)制串以便通過對(duì)所述二進(jìn)制串的 從左到右比較來確定所述浮點(diǎn)數(shù)的相對(duì)大小的裝置。
32. 如權(quán)利要求31所述的計(jì)算機(jī)系統(tǒng),還包括 用于在所述浮點(diǎn)數(shù)為負(fù)的情況下對(duì)所述浮點(diǎn)數(shù)的絕對(duì)值編碼的裝置;以及用于對(duì)所述浮點(diǎn)數(shù)的二進(jìn)制串轉(zhuǎn)換取補(bǔ)數(shù)的裝置。
33. 如權(quán)利要求31所述的計(jì)算機(jī)系統(tǒng),還包括在所述浮點(diǎn)數(shù)為 0的情況下為所述二進(jìn)制串賦值的裝置。
34. 如權(quán)利要求31所述的計(jì)算機(jī)系統(tǒng),其特征在于,所述值是 "1"后跟多個(gè)"0"。
全文摘要
將浮點(diǎn)數(shù)編碼成二進(jìn)制串。通過對(duì)二進(jìn)制串的從左到右比較來確定浮點(diǎn)數(shù)的相對(duì)大小。如果浮點(diǎn)數(shù)為負(fù),則取浮點(diǎn)數(shù)的絕對(duì)值。然后對(duì)所得到的二進(jìn)制串轉(zhuǎn)換取補(bǔ)數(shù)。如果浮點(diǎn)數(shù)為0,則為二進(jìn)制串賦值。值是“1”后跟多個(gè)“0”。二進(jìn)制串的每個(gè)字節(jié)的一部分確定二進(jìn)制串中另一個(gè)字節(jié)是否緊隨其后。二進(jìn)制串的每個(gè)字節(jié)的位的值確定另一個(gè)字節(jié)是否緊隨其后。在另一個(gè)方面,浮點(diǎn)數(shù)編碼成具有作為浮點(diǎn)數(shù)的尾數(shù)和指數(shù)的函數(shù)的長(zhǎng)度的二進(jìn)制串。
文檔編號(hào)G06F15/00GK101133405SQ200580046639
公開日2008年2月27日 申請(qǐng)日期2005年11月17日 優(yōu)先權(quán)日2004年11月17日
發(fā)明者羅伯特·S·霍華德 申請(qǐng)人:羅伯特·S·霍華德