您好,登錄后才能下訂單哦!
這篇文章主要介紹“PostgreSQL浮點數(shù)是怎么實現(xiàn)的”,在日常操作中,相信很多人在PostgreSQL浮點數(shù)是怎么實現(xiàn)的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PostgreSQL浮點數(shù)是怎么實現(xiàn)的”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
眾所周知,計算機是以二進制方式存儲數(shù)據(jù),而浮點數(shù)在序列化為二進制時可能會出現(xiàn)精度丟失(IEEE 754標(biāo)準(zhǔn)),對于數(shù)據(jù)庫實現(xiàn)來說,會引入一個問題,那就是那么兩個浮點數(shù)之間在比較時在數(shù)據(jù)庫是如何實現(xiàn)的?
下面是用于測試腳本:
testdb=# select 123.31::double precision > 123.45::double precision;;
浮點數(shù)的編碼可參考維基百科,簡單來說由三部分組成,包括符號位,有效數(shù)字和指數(shù)位.其中,在指數(shù)位全為1(二進制的1)時,如果有效數(shù)字不全為0,那么這個數(shù)不是一個數(shù)(以nan表示).
浮點數(shù)(雙精度)的比較實現(xiàn)函數(shù)是float8_cmp_internal,邏輯比較簡單.
其中nan亦即上面介紹的”不是一個數(shù)nan”
/* * float8{eq,ne,lt,le,gt,ge} - float8/float8 comparison operations */ int float8_cmp_internal(float8 a, float8 b) { /* * We consider all NANs to be equal and larger than any non-NAN. This is * somewhat arbitrary; the important thing is to have a consistent sort * order. */ if (isnan(a)) { if (isnan(b)) return 0; /* NAN = NAN */ else return 1; /* NAN > non-NAN */ } else if (isnan(b)) { return -1; /* non-NAN < NAN */ } else { if (a > b)//a > b,返回1 return 1; else if (a < b)//a < b,返回-1 return -1; else return 0;//否則,返回0 } }
在C語言中,浮點數(shù)不要比較相等或不等,但可以進行<,>,>=,<=運算.
但在SQL中,可以進行相等或不等運算,因為實質(zhì)通過>,
<進行比較的實現(xiàn)而不是浮點數(shù)的直接等值比較實現(xiàn).
測試腳本
testdb=# select 123.31::double precision > 123.45::double precision;
跟蹤分析
(gdb) c Continuing. Breakpoint 1, float8_cmp_internal (a=123.31, b=123.45) at float.c:1056 1056 if (isnan(a))
查看內(nèi)存中的數(shù)據(jù)(8個字節(jié),以單字節(jié)b方式顯示)
(gdb) x/8b &a 0x7ffcd2cac728: 0xa4 0x70 0x3d 0x0a 0xd7 0xd3 0x5e 0x40 (gdb) x/8b &b 0x7ffcd2cac720: 0xcd 0xcc 0xcc 0xcc 0xcc 0xdc 0x5e 0x40 (gdb)
同時,我們用c語言來打印123.31和123.45的二進制編碼作為對照
[xdb@localhost source]$ cat double_test.c #include <stdio.h> int main() { double d1 = 123.31; double d2 = 123.45; printf("d1 : %llx \n", *((long *)&d1)); printf("d2 : %llx \n", *((long *)&d2)); } [xdb@localhost source]$ gcc double_test.c -o dt [xdb@localhost source]$ ./dt d1 : 405ed3d70a3d70a4 d2 : 405edccccccccccd
輸出的值與在跟蹤分析中的內(nèi)存值一致.
到此,關(guān)于“PostgreSQL浮點數(shù)是怎么實現(xiàn)的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。