DOUBLE PRECISION (FLOAT)
Vertica 支持数字数据类型 DOUBLE PRECISION
,此为 IEEE-754 8 位浮点类型,适用于大多数常规浮点运算。
语法
[ DOUBLE PRECISION | FLOAT | FLOAT(n) | FLOAT8 | REAL ]
参数
注意
在浮点算法不遵循 IEEE-754 标准的计算机上,这些值的特性行为可能与预期不符。双精度是一种非精确、精度可变的数字类型。换言之,某些值无法精确表示,而是存储为近似值。因此,涉及双精度的输入和输出操作可能会有些许偏差。
-
所有
DOUBLE PRECISION
数据类型都等同于 64 位 IEEE 浮点型。 -
FLOAT(n)
中的 n 必须介于 1 和 53 之间(包含),但始终使用 53 位小数。有关详细信息,请参阅 IEEE-754 标准。 -
要进行精确的数字存储和计算(例如对于金钱),请使用
NUMERIC
。 -
浮点计算受限于底层处理器、操作系统和编译器的行为。
-
比较两个浮点值是否相等,结果可能与预期不符。
-
虽然 Vertica 在内部将十进制值视为
FLOAT
,但如果将列定义为FLOAT
,则您无法从 ORC 和 Parquet 文件中读取十进制值。在这些格式中,FLOAT
和DECIMAL
是不同的类型。
值
-
前置空格(可选)
-
加号 ("+") 或减号 ("-")(可选)
-
十进制数、十六进制数、无穷大、NAN 或 NULL 值。
十进制数
十进制数由一组非空十进制数字序列组成,可能包含基点字符(小数点 "."),其后可跟十进制指数(可选)。十进制指数表示乘以 10 的若干次幂,其构成为:字母 E 或 e,后跟加号或减号(可选),之后跟一组非空十进制数字序列。
十六进制数
十六进制数由 "0x" 或 "0X" 后跟一组非空十六进制数字序列构成,可能包含基点字符,其后可跟二进制指数(可选)。二进制指数表示乘以 2 的若干次幂,其构成为:字母 "P" 或 "p" ,后跟加号或减号(可选),之后跟一组非空十进制数字序列。基点字符和二进制指数这两者必须至少出现一个。
无穷大
无穷大为 INF
或 INFINITY
,表示忽略的情况。
NaN(非数值)
NaN 为 NAN
(忽略的情况),其后可跟括在括号内的字符序列(可选)。字符串以实现相关的方式指定 NaN 的值。(在 x86 机器上,NAN 在 Vertica 内部表示为 0xfff8000000000000LL。)
将无穷大或 NAN 值作为常数写入 SQL 语句时,需加单引号。例如:
=> UPDATE table SET x = 'Infinity'
注意
Vertica 遵照 IEEE 对 NaN 的定义 (IEEE 754)。SQL 标准不指定浮点的具体作用方式。
IEEE 将 NaN 定义为:一组浮点值,其中每个值均不与任何值相等,甚至不与其本身相等。NaN 不大于同时也不小于任何值(甚至是本身)。换句话说,每当涉及到 NaN,比较始终返回 false。
但是,为了对数据进行排序,NaN 值必须放在结果中的某个位置。在浮点数上下文中出现的生成的 'NaN' 值与硬件生成的 NaN 值相符。例如从技术角度看,由 Intel 硬件生成 (0xfff8000000000000LL) 的负的、静默的、非信令 NaN。
Vertica 使用不同的 NaN 值来表示浮点 NULL (0x7ffffffffffffffeLL)。这是一个正的、静默的、非信令 NaN,由 Vertica 预留。
后面提供了 NaN 的一个示例。
=> SELECT CBRT('Nan'); -- cube root
CBRT
------
NaN
(1 row)
=> SELECT 'Nan' > 1.0;
?column?
----------
f
(1 row)
Null 值
Null 值的加载文件格式是用户定义的,如 COPY
命令中所述。Null 值在 Vertica 内部表示为 0x7fffffffffffffffLL。交互格式由
vsql 打印选项 null 控制。例如:
\pset null '(null)'
默认选项为不打印任何内容。
规则
-
-0 == +0
-
1/0 = 无穷大
-
0/0 == Nan
-
NaN != 任意值(甚至 NaN)
要搜索 NaN 列值,请使用以下谓词:
... WHERE column != column
这是必要的,因为根据定义,WHERE
*column *= 'Nan'
不能为 true。
排序顺序(升序)
-
NAN
-
-Inf
-
数字
-
+Inf
-
NULL
注意
-
NULL
按照升序在最后显示(最大值)。 -
按照 IEEE 浮点标准,浮点数中的所有溢出均会生成 +/- 无穷大或 NaN。