PostgreSQL浮点数是怎么实现的
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要介绍"PostgreSQL浮点数是怎么实现的",在日常操作中,相信很多人在PostgreSQL浮点数是怎么实现的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答
千家信息网最后更新 2025年01月23日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安全错误
数据库的锁怎样保障安全
最大的互联网科技
宜昌市网络安全支撑单位
销售网络技术会计分录
12123选车牌服务器异常
互联网黑科技的现状
国外最新网络安全技术
蒲江县国家网络安全宣传周
诚睿网络技术有限公司
互联网科技英文词汇
数据库表字段的值扩大十倍
夏日模式需要哪些服务器
黄陂服务优质的计算机软件开发
收软件开发的国有企业
我的世界服务器装扫地大妈
宜昌两路串口服务器
江西租房网络安全
不能ping通服务器
本机ip数据库
文献数据库有什么
服务器注册和发现
德州软件开发培训教学哪家好
鲲游网络技术
12123选车牌服务器异常
绍兴app软件开发项目
快速开发网页服务器 论文
软件开发在哪里可以卖肾
宜良软件开发咨询报价
hive与关系型数据库的共同点
数据库提示100004错误
科迈软件数据库失败