资讯专栏INFORMATION COLUMN

2. Q语言学习之路—基本数据类型: Atoms

TIGERB / 2056人阅读

摘要:概述所有的数据都是通过最小单位构造。语言中大部分数据类型与传统语言类似,但是多出了和相关的类型,用来加速时间序列运算。适用的运算符仅有数据中共有两种类型数据,更类似于中的和。其表示值为从千禧年计数的纳秒数,之前为负数,之后为正数。

概述

所有的数据都是通过最小单位atom构造。q语言中大部分数据类型与传统语言类似,但是多出了date和time相关的类型,用来加速时间序列运算。下表给出了q语言和几个传统语言数据类型的对比:


下表给出了Q语言各个类型的详细信息:


1. 整型数据

long: 8字节; 42, 42j

short: 2字节有符号数;其后必须带后缀h; eg: -123h

int: 4字节有符号数;其后必须带后缀i; eg: 1234567890i

2. 浮点数据

支持单精度双精度浮点数据类型。

float: 8字节;后缀f; 传统语言中的double; eg: 3.1415926, 1f, 1.0, 1.234e07, 1.234e-7

real: 4字节;后缀e; 传统语言中的float; eg: 12.34e, 1.234e7e
注:不建议使用real这个类型,因为在许多金融问题中,real的精度往往不够用

浮点数显示精度: q console默认显示7位小数,可以通过命令 P 来最多显示16位小数,也可以通过 P 0 来显示完整的17位小数,但是最后一位小数不可信。

q)f12:1.23456789012
q)f16:1.234567890123456
q)P 12
q)f12
1.23456789012
q)f16
1.23456789012
q)P 16
q)f12
1.23456789012
q)f16
1.234567890123456
q)P 0
q)1%3
0.33333333333333331

3. Binary数据

boolean : 1字节; 后缀b; 没有true或者false关键字, 1b代表true, 0b代表false

byte : 使用1字节保存8位数据,前缀0x紧跟着2个16进制数,大小写均可。 eg: 0x2A, 0x2a

GUID : globally unique identifier. 在时间和空间上都唯一,可以对null guid值0Ng使用?来生成一个guids的列表。
eg: 1?0Ng, 2?0Ng, -2?0Ng
使用正号和负号生成guid列表的区别在于:正号使用同一个随机种子(seed), 而负号使用的种子是随机的

可以通过解析一个16进制数字来构造guid:"G"$"61f35174-90bc-a48a-d88f-e15e4a377ec8", 同样,可以使用命令sv来从一个16个byte的列表构造guid: 0x0 sv 16?0xff

GUID适用的运算符仅有:~, =, <, >, null

4. Text数据

q中共有两种text类型数据,更类似于SQL中的CHARVARCHAR

char : 1字节; 对应SQL中的CHAR; 用双引号表示;特殊字符用作为前缀来显示,尽管在q-console中依旧将显示了出来,但是实际上它就是一个单字符

q)""" / double-quote
"""
q)"" / back-slash
""
q)"
" / newline
"
"
q)"
" / return
"
"
q)"	" / horizontal tab
"	"
q)"142"
"b"

symbol : 前缀` eg: q, `zaphod`
symbol与char一样,同样是原子数据,这意味着symbol不可拆分,symbol中的单个字符不可获取。 symbol不是string, 并且symbol数据`a与char数据"a"不相等。

5. 时间类型数据

date : 4字节,表示为yyyy.mm.dd; 其表示值为从2000.01.01开始的日期数,在之前的为负值,之后的为正值。

q)2000.01.01=0
1b

表示的累积日数可以通过强制转换得到:

q)`int$2000.02.01

Time :

如果毫秒级够用的话,使用time类型,表示为hh:mm:ss.uuu;其表示值为从00:00的毫秒(milliseconds)数

q)12:34:56.789
12:34:56.789
q)12:00:00.000=12*60*60*1000
1b

其表示值同样可以通过强制转换来获取

如果毫秒级不够用的话,使用timespan类型;其表示为从00:00开始的纳秒(nanoseconds)数, 表示为0Dhh:mm:ss.nnnnnnnnn。 其中0D是可选的。

q)12:34:56.123456789
0D12:34:56.123456789
q)12:34:56.123456 / microseconds become nanos
0D12:34:56.123456000

Date-Time :
(已弃用的) 使用T进行分隔:

q)2000.01.01T12:00:00.000
_
q)2000.01.02T12:00:00.000=1.5
1b

可以通过q)date$2000.01.02T12:00:00.000`来提取日期和时间

更推荐使用的类型是timestamp, 是date类型和timespan类型的连接,通过D进行分离。其表示值为从千禧年计数的纳秒数,之前为负数,之后为正数。
同样,有如下的操作:

q)2014.11.22D17:43:40.123456789
q)`long$2014.11.22D17:43:40.123456789
q)`date$2014.11.22D17:43:40.123456789
q)`timespan$2014.11.22D17:43:40.123456789

month : 32位带符号整型, 表示为yyyy.mm和一个尾符号m, 其表示值为从千禧年计数的月份数。注意不要忘记带尾缀m

q)2015.11m
q)2001.01m=12
1b

minute : 32位带符号整型, 表示为hh:mm, 其表示值为从00:00计数的分钟数。

q)12:30
q)12:00=12*60
1b

second : 32位带符号整型, 表示为hh:mm:ss, 其表示值为从00:00计数的秒数。

q)23:59:59
q)23:59:59=-1+24*60*60
1b

构成和点操作符 :
可以通过点操作符提取日期,月份,日等

q)dt:2014.01.01
q)dt.year
2014i
q)dt.mm
q)dt.dd
q)ti:12:34:56.789
q)ti.hh
12i
q)ti.mm
q)ti.ss

但是更推荐使用强制转换符,因为它对所有有意义的时间提取和转换都是有效的:

q)`dd$dt
1i
q)`mm$dt
q)`dd$dt
q)`month$dt
2014.01m

6. 算术Infinities 和 Nulls

一些特殊含义的表示:

Literal            Value
  0w        Positive float infinity
 -0w        Negative float infinity
  0n        Null float ; NaN, or not a number
  0W        Positive long infinity
 -0W        Negative long infinity
  0N        Null long

注意小写的w代表float, 大写的W代表整数。

在q语言中,数字的除法结果总是float. 正数除以0的结果为正无穷,负数除以0的结果为负无穷。 在数学中,0除以0是未定义的,因此,0n代表NaN。整型无穷可以参与比较并返回正确的结果

q)42<0W
1b
q)-0W<42
1b

无穷代表实际的值:

q       C Equivalent          Numeric
0N         MIN_INT        -9223372036854775808
-0W        MIN_INT+1      -9223372036854775807
0W         MAX_INT        +9223372036854775807      

因此,整型的大小顺序为:

0N < -0W < normal integer < 0W

q)9223372036854775806+1
0W
q)-0W-1
0N
q)-0W+1
-9223372036854775806

实际上q语言没有溢出解释了如下现象:

q)0W+1
0N
q)0W+2
-0W
q)0W+3
-9223372036854775806
7. Nulls

null值一般表示的是缺失数据。在q中, null与正常的值占用同样的空间,如下总结了null的不同类型值:

type            null
boolean          0b
guid             0Ng (00000000-0000-0000-0000-000000000000)
byte             0x00
short            0Nh
Int              0N
long             0Nj
real             0Ne
float            0n
char             " "
sym              `
timestamp        0Np
month            0Nm
date             0Nd
datetime         0Nz
timespan         0Nn
minute           0Nu
second           0Nv
time             0Nt

注意:""不是一个null char, 而是一个char的空列表

使用null指令而不是=来测试一个值是不是null值,因为q语言是动态类型的,而null指令是类型独立的。

q)null 42
0b
q)null `
1b
q)null " "
1b
q)null ""

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/62843.html

相关文章

  • 2. Q语言学习之路基本数据类型: Atoms

    摘要:概述所有的数据都是通过最小单位构造。语言中大部分数据类型与传统语言类似,但是多出了和相关的类型,用来加速时间序列运算。适用的运算符仅有数据中共有两种类型数据,更类似于中的和。其表示值为从千禧年计数的纳秒数,之前为负数,之后为正数。 概述 所有的数据都是通过最小单位atom构造。q语言中大部分数据类型与传统语言类似,但是多出了date和time相关的类型,用来加速时间序列运算。下表给出了...

    李涛 评论0 收藏0
  • 7. Q语言学习之路数据转换

    摘要:可以通过命令来查看全局变量和对应的值,也可以通过操作符来查看转换使用操作符,右边的运算元是原始值,而左边的运算元是目标类型。从中解析数据使用大写的目标类型作为左运算元,作为右运算元。 1. 类型 1. 基础数据类型 showImg(https://segmentfault.com/img/bVbqZmF?w=503&h=599); showImg(https://segmentfaul...

    bluesky 评论0 收藏0
  • 7. Q语言学习之路数据转换

    摘要:可以通过命令来查看全局变量和对应的值,也可以通过操作符来查看转换使用操作符,右边的运算元是原始值,而左边的运算元是目标类型。从中解析数据使用大写的目标类型作为左运算元,作为右运算元。 1. 类型 1. 基础数据类型 showImg(https://segmentfault.com/img/bVbqZmF?w=503&h=599); showImg(https://segmentfaul...

    antz 评论0 收藏0
  • 7. Q语言学习之路数据转换

    摘要:可以通过命令来查看全局变量和对应的值,也可以通过操作符来查看转换使用操作符,右边的运算元是原始值,而左边的运算元是目标类型。从中解析数据使用大写的目标类型作为左运算元,作为右运算元。 1. 类型 1. 基础数据类型 showImg(https://segmentfault.com/img/bVbqZmF?w=503&h=599); showImg(https://segmentfaul...

    TesterHome 评论0 收藏0
  • 1. Q语言学习之路—概述

    摘要:写作这个系列文章的主要目的是为了督促自己高效地学习时间序列数据库和配套的语言,主要参考材料为官网提供的教程,再结合其他参考资料等等。学习的最终目的是熟练掌握语言的基本操作,再完成一个基于语言的量化回测框架。 写在前面 这是我第一次写作技术博客,也是我第一次写作博客。写(fan)作(yi)这个系列文章的主要目的是为了督促自己高效地学习KDB+时间序列数据库和配套的Q语言,主要参考材料为k...

    Charles 评论0 收藏0

发表评论

0条评论

TIGERB

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<