亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PostgreSQL浮點數是怎么實現的

發布時間:2021-11-09 11:52:13 來源:億速云 閱讀:303 作者:iii 欄目:關系型數據庫

這篇文章主要介紹“PostgreSQL浮點數是怎么實現的”,在日常操作中,相信很多人在PostgreSQL浮點數是怎么實現的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PostgreSQL浮點數是怎么實現的”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

眾所周知,計算機是以二進制方式存儲數據,而浮點數在序列化為二進制時可能會出現精度丟失(IEEE 754標準),對于數據庫實現來說,會引入一個問題,那就是那么兩個浮點數之間在比較時在數據庫是如何實現的?
下面是用于測試腳本:

testdb=# select 123.31::double precision > 123.45::double precision;;

一、數據結構

浮點數的編碼可參考維基百科,簡單來說由三部分組成,包括符號位,有效數字和指數位.其中,在指數位全為1(二進制的1)時,如果有效數字不全為0,那么這個數不是一個數(以nan表示).

二、源碼解讀

浮點數(雙精度)的比較實現函數是float8_cmp_internal,邏輯比較簡單.
其中nan亦即上面介紹的”不是一個數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語言中,浮點數不要比較相等或不等,但可以進行<,>,>=,<=運算.
但在SQL中,可以進行相等或不等運算,因為實質通過>, <進行比較的實現而不是浮點數的直接等值比較實現.

三、跟蹤分析

測試腳本

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))

查看內存中的數據(8個字節,以單字節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

輸出的值與在跟蹤分析中的內存值一致.

到此,關于“PostgreSQL浮點數是怎么實現的”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

额尔古纳市| 拜城县| 武汉市| 堆龙德庆县| 宁河县| 蓬溪县| 响水县| 鄂尔多斯市| 武穴市| 株洲县| 正宁县| 临清市| 会泽县| 屯门区| 中方县| 闵行区| 门头沟区| 仁布县| 克山县| 左贡县| 金秀| 临西县| 开化县| 枞阳县| 汪清县| 肇源县| 伊金霍洛旗| 瑞安市| 交城县| 化隆| 巴彦淖尔市| 凤阳县| 集安市| 大宁县| 台北县| 定边县| 罗江县| 安义县| 辽阳县| 吉隆县| 稷山县|