整数和浮点数是算术和计算的基础。它们都是数字文本。例如 1 是整数文本, 1.0 是浮点数文本。

Julia 提供了丰富的基础数值类型,全部的算数运算符和位运算符,以及标准数学函数。这些数据和操作直接对应于现代计算机支持的操作。因此, Julia 能充分利用硬件的计算资源。另外, Julia 还从软件层面支持任意精度的算术 ,可以用于表示硬件不能原生支持的数值,当然,这牺牲了部分运算效率。

另外, 对复数和分数的支持建立在这些基础数据类型之上。所有的基础数据类型通过灵活用户可扩展的类型提升系统不需显式类型转换,就可以互相运算。

整数类型

类型 有符号 位数 最小值 最大值
Int8 8 -2^7 2^7 - 1
UInt8 8 0 2^8 - 1
Int16 16 -2^15 2^15 - 1
UInt16 16 0 2^16 - 1
Int32 32 -2^31 2^31 - 1
UInt32 32 0 2^32 - 1
Int64 64 -2^63 2^63 - 1
UInt64 64 0 2^64 - 1
Int128 128 -2^127 2^127 - 1
UInt128 128 0 2^128 - 1
Bool N/A 8 false (0) true (1)

使用标准方式来表示文本化的整数:

julia> 1
1julia> 1234
1234

整数文本的默认类型,取决于目标系统是 32 位架构还是 64 位架构:

julia> typeof(1)
Int64# 通过 Sys.WORD_SIZE 来查看系统是32位还是64位
julia> Sys.WORD_SIZE
64

另外,Julia 定义了 IntUInt类型,它们分别是系统原生的有符号和无符号整数类型的别名:

julia> Int
Int64julia> UInt
UInt64

对于不能用 32 位而只能用 64 位来表示的大整数文本,不管系统类型是什么,始终被认为是 64 位整数:

julia> typeof(3000000000)
Int64

无符号整数的输入和输出使用前缀 0x 和十六进制数字 0-9a-f (也可以使用 A-F )。无符号数的位数大小,由十六进制数的位数决定:

julia> 0x1
0x01julia> typeof(ans)
UInt8julia> 0x123
0x0123julia> typeof(ans)
UInt16julia> 0x1234567
0x01234567julia> typeof(ans)
UInt32julia> 0x123456789abcdef
0x0123456789abcdefjulia> typeof(ans)
UInt64

二进制和八进制文本:

julia> 0b10
0x02julia> typeof(ans)
UInt8julia> 0o10
0x08julia> typeof(ans)
UInt8

基础数值类型的最小值和最大值,可由 typemintypemax 函数查询:

julia> (typemin(Int32), typemax(Int32))
(-2147483648, 2147483647)julia> for T in [Int8,Int16,Int32,Int64,Int128,UInt8,UInt16,UInt32,UInt64,UInt128]println("$(lpad(T,7)): [$(typemin(T)),$(typemax(T))]")endInt8: [-128,127]Int16: [-32768,32767]Int32: [-2147483648,2147483647]Int64: [-9223372036854775808,9223372036854775807]Int128: [-170141183460469231731687303715884105728,170141183460469231731687303715884105727]UInt8: [0,255]UInt16: [0,65535]UInt32: [0,4294967295]UInt64: [0,18446744073709551615]
UInt128: [0,340282366920938463463374607431768211455]

typemintypemax 的返回值,与所给的参数类型是同一类的。

溢出
在 Julia 中,如果计算结果超出数据类型所能代表的最大值,将会发生溢出:

julia> x = typemax(Int64)
9223372036854775807julia> x + 1
-9223372036854775808julia> x + 1 == typemin(Int64)
true

可见, Julia 中的算数运算其实是一种同余算术 。它反映了现代计算机底层整数算术运算特性。如果有可能发生溢出,一定要显式的检查是否溢出;或者使用 BigInt 类型(详见任意精度的算术 )。

为了减小溢出所带来的影响,整数加减法、乘法、指数运算都会把原先范围较小的整数类型提升到 Int 或 UInt 类型。(除法、求余、位运算则不提升类型)。

除法错误

整数除法(div 功能)有两个额外的样例:被 0 除,和被最低的负数(typemin)-1 除。两个例子都抛出了一个 DivideError。余数和模运算(remmod)当它们的第二个参数为 0 时,抛出了一个 DivideError

浮点数类型

类型 精度 位数
Float16 半精度 16
Float32 单精度 32
Float64 双精度 64

使用标准格式来表示文本化的浮点数:

julia> 1.0
1.0julia> 1.
1.0julia> 0.5
0.5julia> .5
0.5julia> -1.23
-1.23julia> 1e10
1.0e10julia> 2.5e-4
0.00025

上述结果均为 Float64 值。文本化的 Float32 值也可以直接输入,这时使用 f 来替代 e

julia> 0.5f0
0.5f0julia> typeof(ans)
Float32julia> 2.5f-4
0.00025f0

浮点数也可以很容易地转换为 Float32

julia> Float32(-1.5)
-1.5f0julia> typeof(ans)
Float32

十六进制浮点数的类型,只能为 Float64

julia> 0x1p0
1.0julia> 0x1.8p3
12.0julia> 0x.4p-1
0.125julia> typeof(ans)
Float64

Julia 也支持半精度浮点数(Float16) ,但只用来存储。计算时,它们被转换为Float32 : :

julia> sizeof(Float16(4.))
2julia> 2 * Float16(4.)
Float16(8.0)julia> typeof(ans)
Float16

下划线'_'可以用来作为数字位数之间的分隔符:

julia> 10_000, 0.000_000_005, 0xdead_beef, 0b1011_0010
(10000, 5.0e-9, 0xdeadbeef, 0xb2)
浮点数类型的零

浮点数类型中存在两个零 ,正数的零和负数的零。它们相等,但有着不同的二进制表示,可以使用 bitstring() 函数看出:

julia> 0.0 == -0.0
truejulia> bitstring(0.0)
"0000000000000000000000000000000000000000000000000000000000000000"julia> bitstring(-0.0)
"1000000000000000000000000000000000000000000000000000000000000000"
特殊的浮点数

有三个特殊的标准浮点数:

Float16 Float32 Float64 名称 描述
Inf16 Inft32 Inf 正无穷 比所有的有限的浮点数都大
-Inf16 -Inft32 -Inf 负无穷 比所有的有限的浮点数都小
NaN16 NaN32 NaN 不存在 不能和任意浮点数比较大小(包括它自己)

详见数值比较 。按照 IEEE 754 标准 ,这几个值可如下获得:

julia> 1/Inf
0.0julia> 1/0
Infjulia> -5/0
-Infjulia> 0.000001/0
Infjulia> 0/0
NaNjulia> 500 + Inf
Infjulia> 500 - Inf
-Infjulia> Inf + Inf
Infjulia> Inf - Inf
NaNjulia> Inf * Inf
Infjulia> Inf / Inf
NaNjulia> 0 * Inf
NaN

typemintypemax 函数也适用于浮点数类型:

julia> (typemin(Float16),typemax(Float16))
(-Inf16, Inf16)julia> (typemin(Float32),typemax(Float32))
(-Inf32, Inf32)julia> (typemin(Float64),typemax(Float64))
(-Inf, Inf)
精度

大多数的实数并不能用浮点数精确表示,因此有必要知道两个相邻浮点数间的间距,也即计算机的精度。

Julia 提供了 eps 函数,可以用来检查 1.0 和下一个可表示的浮点数之间的间距:

julia> eps(Float32)
1.1920929f-7julia> eps(Float64)
2.220446049250313e-16julia> eps() # same as eps(Float64)
2.220446049250313e-16

eps 函数也可以取浮点数作为参数,给出这个值和下一个可表示的浮点数的绝对差,即,eps(x) 的结果与 x同类型,且满足x + eps(x) 是下一个比 x稍大的、可表示的浮点数:

julia> eps(1.0)
2.220446049250313e-16julia> eps(1000.)
1.1368683772161603e-13julia> eps(1e-27)
1.793662034335766e-43julia> eps(0.0)
5.0e-324

相邻的两个浮点数之间的距离并不是固定的,数值越小,间距越小;数值越大, 间距越大。换句话说,浮点数在0附近最稠密,随着数值越来越大,数值越来越稀疏,数值间的距离呈指数增长。根据定义, eps(1.0)eps(Float64) 相同,因为 1.064 位浮点数。

函数 nextfloatprevfloat 可以用来获取下一个或上一个浮点数:

julia> x = 1.25f0
1.25f0julia> nextfloat(x)
1.2500001f0julia> prevfloat(x)
1.2499999f0julia> bitstring(prevfloat(x))
"00111111100111111111111111111111"julia> bitstring(x)
"00111111101000000000000000000000"julia> bitstring(nextfloat(x))
"00111111101000000000000000000001"

此例显示了邻接的浮点数和它们的二进制整数的表示。

舍入模型

如果一个数没有精确的浮点数表示,那就需要舍入了。可以根据 IEEE 754 标准 来更改舍入的模型:

julia> 1.1 + 0.1
1.2000000000000002

默认舍入模型为 RoundNearest ,它舍入到最近的可表示的值,这个被舍入的值使用尽量少的有效数字。

背景和参考资料

浮点数的算术运算同人们的预期存在着许多差异,特别是对不了解底层实现的人。许多科学计算的书籍都会详细的解释这些差异。下面是一些参考资料:

  • 关于浮点数算数运算最权威的指南是 IEEE 754-2008 标准 ;然而,该指南没有免费的网络版
  • 一个简短但是清晰地解释了浮点数是怎么表示的, 请参考 John D. Cook 的文章 。它还简述了由于浮点- 数的表示方法不同于理想的实数会带来怎样的问题
  • 推荐 Bruce Dawson 的关于浮点数的博客
  • David Goldberg 的每个计算机科学家都需要了解的浮点数算术计算,是一篇非常精彩的文章, 深入讨论了浮点数和浮点数的精度问题
  • 更深入的文档, 请参考“浮点数之父” William Kahan 的 collected writings ,其中详细记录了浮点数的历史、理论依据、问题,还有其它很多的数值计算方面的内容。更有兴趣的可以读 采访浮点数之父
任意精度的算术

为保证整数和浮点数计算的精度,Julia 打包了 GNU Multiple Precision Arithmetic Library(GMP) 和 GNU MPFR Library。Julia 相应提供了 BigIntBigFloat 类型。

可以通过基础数值类型或 String 类型来构造:

julia> BigInt(typemax(Int64)) + 1
9223372036854775808julia> big"123456789012345678901234567890" + 1
123456789012345678901234567891julia> parse(BigInt, "123456789012345678901234567890") + 1
123456789012345678901234567891julia> big"1.23456789012345678901"
1.234567890123456789010000000000000000000000000000000000000000000000000000000004julia> parse(BigFloat, "1.23456789012345678901")
1.234567890123456789010000000000000000000000000000000000000000000000000000000004julia> BigFloat(2.0^66) / 3
2.459565876494606882133333333333333333333333333333333333333333333333333333333344e+19julia> factorial(BigInt(40))
815915283247897734345611269596115894272000000000

然而,基础数据类型和 BigInt/BigFloat 不能自动进行类型转换,需要明确指定:

julia> x = typemin(Int64)
-9223372036854775808julia> x = x - 1
9223372036854775807julia> typeof(x)
Int64julia> y = BigInt(typemin(Int64))
-9223372036854775808julia> y = y - 1
-9223372036854775809julia> typeof(y)
BigInt

BigFloat 运算的默认精度(有效数字的位数)和舍入模型,是可以改的。然后,计算就都按照更改之后的设置来运行了:

julia> setrounding(BigFloat, RoundUp) doBigFloat(1) + parse(BigFloat, "0.1")end
1.100000000000000000000000000000000000000000000000000000000000000000000000000003julia> setrounding(BigFloat, RoundDown) doBigFloat(1) + parse(BigFloat, "0.1")end
1.099999999999999999999999999999999999999999999999999999999999999999999999999986julia> setprecision(40) doBigFloat(1) + parse(BigFloat, "0.1")end
1.1000000000004
代数系数

Julia 允许在变量前紧跟着数值文本,来表示乘法。这有助于写多项式表达式:

julia> x = 3
3julia> 2x^2 - 3x + 1
10julia> 1.5x^2 - .5x + 1
13.0

指数函数也更好看:

julia> 2^2x
64

数值文本系数同单目运算符一样。因此 2^3x 被解析为 2^(3x)2x^3被解析为 2*(x^3)

数值文本也可以作为括号表达式的因子:

julia> 2(x-1)^2 - 3(x-1) + 1
3

括号表达式可作为变量的因子:

julia> (x-1)x
6

不要接着写两个变量括号表达式,也不要把变量放在括号表达式之前。它们不能被用来指代乘法运算:

julia> (x-1)(x+1)
ERROR: MethodError: objects of type Int64 are not callable
Stacktrace:[1] top-level scope at REPL[149]:1julia> x(x+1)
ERROR: MethodError: objects of type Int64 are not callable
Stacktrace:[1] top-level scope at REPL[150]:1

这两个表达式都被解析为函数调用:任何非数值文本的表达式,如果后面跟着括号,代表调用函数来处理括号内的数值(详见函数)。因此,由于左面的值不是函数,这两个例子都出错了。

需要注意,代数因子和变量或括号表达式之间不能有空格。

语法冲突

文本因子与两个数值表达式语法冲突: 十六进制整数文本和浮点数文本的科学计数法:

  • 十六进制整数文本表达式 0xff 可以被解析为数值文本 0 乘以变量 xff
  • 浮点数文本表达式 1e10 可以被解析为数值文本 1 乘以变量 e10E 格式也同样。

这两种情况下,我们都把表达式解析为数值文本:

  • 0x 开头的表达式,都被解析为十六进制文本
  • 以数字文本开头,后面跟着 eE ,都被解析为浮点数文本
零和一

Julia 提供了一些函数, 用以得到特定数据类型的零和一文本。

函数 说明
zero(x) 类型 x 或变量 x 的类型下的文本零
one(x) 类型 x 或变量 x 的类型下的文本一

这俩函数在数值比较中可用来避免额外的类型转换 。
例如:

julia> zero(Float32)
0.0f0julia> zero(1.0)
0.0julia> one(Int32)
1julia> one(BigFloat)
1.0

Julia1.4文档 —— 2. Julia的基本数值类型相关推荐

  1. Julia程序设计2 数值类型

    Julia程序设计2 数值类型 实数 整数 浮点数 数值类型的转换 有理数与无理数 复数 Julia的数值类型与其他语言一般无二,这里有张总结的图: Julia数值类型分为实数和复数两大类,下面分别介 ...

  2. 第10章 文档对象模型DOM 10.2 Document类型

    Document 类型 JavaScript 通过 Document 类型表示文档.在浏览器中, document 对象是 HTMLDocument (继承自 Document 类型)的一个实例,表示 ...

  3. 这个VS Code扩展可以自动生成Python文档字符串

    机器之心报道 编辑:魔王 该扩展利用可处理编程语言和自然语言的预训练模型 CodeBERT,实现快速生成 Python 文档字符串的功能. Visual Studio Code(简称 VS Code) ...

  4. 利用CodeBERT,这个VS Code扩展可以自动生成Python文档字符串

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 来自:机器之心 该扩展利用可处理编程语言和自然语言的预训练模型 CodeBERT,实现 ...

  5. 使用ABAP编程实现对微软Office Word文档的操作

    SAP ABAP里提供了一个标准的类CL_DOCX_DOCUMENT,提供了本地以".docx"结尾的微软Office word文档的读和写操作. 本文介绍了ABAP类CL_DOC ...

  6. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  7. XML文档类型定义DTD

    DTD概述 DTD用来定义XML文档的结构,它包含一系列规则说明,以确保XML文档的一致性和有效性 DTD定义了XML文档可用的词汇(元素和属性的名称)和结构: 元素名称,包括根元素 元素的属性及属性 ...

  8. 单文档应用程序弹出新对话框_简介——文档

    1.3 文档(Documents) 文档是绘制和编辑结构的工作区域.文档可以包含许多页,也可以只包含一页. 1.3.1 创建文档(Creating Documents) 可以直接使用默认设置创建文档, ...

  9. 软考-信息系统项目管理师-信息文档管理与配置管理

    目录 14.1.信息系统项目相关信息(文档)及其管理 一.信息系统项目相关信息(文档)种类 二.信息系统项目相关信息(文档)管理的规则和方法 14.2.配置管理 一.配置管理的概念 1.配置项 2.配 ...

  10. 深入理解文档/视图框架体系_九宫格项目开发感悟

    1.项目起源以及采用文档/视图框架体系缘由 我们整天都在说:文档保存项目的数据并处理项目上的数据:视图通过关联获得文档的数据并进行可视化:主窗口框架接收外部事件消息并进行消息分配.这句口头禅感觉接触过 ...

最新文章

  1. 【Java Web前端开发】HTML表单和CSS部分
  2. Visual Studio 2015软件安装教程
  3. vi编辑器的学习使用(十五)
  4. 这公司需要再利用CPU热能:于是淘汰i7换AMD Ryzen
  5. java先进先出 循环队列,JavaScript队列、优先队列与循环队列
  6. git 合并冲突_GIT提交记录和Revert commit过程分析
  7. Spring中3种实例Bean的方法及设置Bean的别名
  8. Javascript字符串长度返回错误的原因
  9. Weka数据挖掘平台
  10. jms是java平台中面向_面向Web的JMS应用系统
  11. win10系统怎么进行远程控制操作
  12. 国内用户最多的linux系统,统信UOS将可能超越麒麟系统夺得中国Linux市场份额第一名...
  13. 我用什么工具写公众号
  14. fastadmin调用发送邮件验证码接口
  15. 清楚浮动四种常用方法
  16. 谷歌浏览器崩溃、电脑版微信,vscode打不开网页
  17. 自然数幂和伯努利数(Bernoulli)
  18. 面试管:Zookeeper在项目的典型应用场景请你回答一下
  19. 22021年江苏高考成绩查询,2021年江苏高考位次查询及一分一段表排名查询
  20. 北邮信通2023大一下数据结构题目(含代码)

热门文章

  1. 我不是九爷 带你了解 docker实战命令
  2. 量化噪声的大小与什么成正比_量化噪声
  3. ios 图片居中裁剪_iOS 自定义裁剪相册照片
  4. zabbix清除历史数据
  5. Coin 2017icpc-西安赛区 牛顿二项式
  6. sql注入漏洞--sqlmap使用
  7. 【异常处理】The CXX compiler identification is unknown
  8. amazon创建sns_我们如何在36小时内重新创建Amazon Go
  9. android控制动态按钮,Android编程动态按钮实现方法
  10. 计算机三级数据库考试知识点及题库总结(最全)