PostgreSQL浮点数是怎么实现的
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"PostgreSQL浮点数是怎么实现的",在日常操作中,相信很多人在PostgreSQL浮点数是怎么实现的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2026年11月03日PostgreSQL浮点数是怎么实现的
这篇文章主要介绍"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 */intfloat8_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) cContinuing.Breakpoint 1, float8_cmp_internal (a=123.31, b=123.45) at float.c:10561056 if (isnan(a))
查看内存中的数据(8个字节,以单字节b方式显示)
(gdb) x/8b &a0x7ffcd2cac728: 0xa4 0x70 0x3d 0x0a 0xd7 0xd3 0x5e 0x40(gdb) x/8b &b0x7ffcd2cac720: 0xcd 0xcc 0xcc 0xcc 0xcc 0xdc 0x5e 0x40(gdb)
同时,我们用c语言来打印123.31和123.45的二进制编码作为对照
[xdb@localhost source]$ cat double_test.c #includeint 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浮点数是怎么实现的"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
点数
数据
二进制
学习
分析
跟踪
有效
个数
内存
字节
数位
数字
数据库
方式
更多
精度
编码
脚本
语言
问题
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技名片
北京路客互联网科技有限公司
为想互联网科技怎么样
美国互联网科技
互联网科技革命
迪茉互联网科技
顺网科技2021年互联网排名
青岛中康互联网医疗科技有限公司
互联网科技项目计划书材料类
福建科技产业互联网发展
湖南一路畅行互联网科技
乌苏新华互联网科技做什么的
爱医互联网络科技
科技大学互联网
深圳无忧互联网科技
厦门江牛科技互联网
互联网风格科技公司名称
中国互联网公司的科技投入
上海互联网科技园景观
恒生科技互联网指数十大成分股
精品咖啡豆
蓝思科技飞鸽互联网
互联网金融监管科技
农村开互联网科技讲堂
黑科技闪耀互联网之光
国大互联网教育科技有限公司工作
内蒙古九一互联网科技
互联网科技新闻
易租星互联网科技有限公司
北京瑞云互联网科技有限公司