整数和浮点数
整数和浮点值是算术和计算的基础。这些数值的内置表示被称作原始数值类型(numeric primitive),且整数和浮点数在代码中作为立即数时称作数值字面量(numeric literal)。例如,1
是个整型字面量,1.0
是个浮点型字面量,它们在内存中作为对象的二进制表示就是原始数值类型。
Julia 提供了很丰富的原始数值类型,并基于它们定义了一整套算术操作,还提供按位运算符以及一些标准数学函数。这些函数能够直接映射到现代计算机原生支持的数值类型及运算上,因此 Julia 可以充分地利用运算资源。此外,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) |
- 浮点类型:
类型 | 精度 | 比特数 |
---|---|---|
Float16 | half | 16 |
Float32 | single | 32 |
Float64 | double | 64 |
此外,对复数和有理数的完整支持是在这些原始数据类型之上建立起来的。多亏了 Julia 有一个很灵活的、用户可扩展的[类型提升系统]
为了让常见的数值公式和表达式更清楚,Julia 允许变量直接跟在一个数值字面量后,暗指乘法。这可以让写多项式变得很清楚:
julia> x = 3
3
julia> 2x^2 - 3x + 1
10
julia> 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
!!! note 用于隐式乘法的数值字面量系数的优先级高于其它的二元运算符,例如乘法(*
)和除法(/
、\
以及 //
)。这意味着,比如说,1 / 2im
等于 -0.5im
以及 6 // 2(2+1)
等于 1 // 1
。
此外,括号表达式可以被用作变量的系数,暗指表达式与变量相乘:
julia> (x-1)x
6
但是,无论是把两个括号表达式并列,还是把变量放在括号表达式之前,都不会被用作暗指乘法:
julia> (x-1)(x+1)
ERROR: MethodError: objects of type Int64 are not callable
julia> x(x+1)
ERROR: MethodError: objects of type Int64 are not callable
这两种表达式都会被解释成函数调用:所有不是数值字面量的表达式,后面紧跟一个括号,就会被解释成使用括号内的值来调用函数(更多关于函数的信息请参见函数)。因此,在这两种情况中,都会因为左手边的值并不是函数而产生错误。
上述的语法糖显著地降低了在写普通数学公式时的视觉干扰。注意数值字面量系数和后面用来相乘的标识符或括号表达式之间不能有空格。
语法冲突
并列的字面量系数语法可能和两种数值字面量语法产生冲突:十六进制整数字面量以及浮点字面量的工程表示法。下面是几种会产生语法冲突的情况:
- 十六进制整数字面量
0xff
可能被解释成数值字面量0
乘以变量xff
。 - 浮点字面量表达式
1e10
可以被解释成数值字面量1
乘以变量e10
,与之等价的E
-表示法也存在类似的情况。 - 32-bit 的浮点数字面量
1.5f22
被解释成数值字面量1.5
乘以变量f22
。
在这些所有的情况中,都使用这样的解释方式来解决歧义:
0x
开头的表达式总是十六进制字面量。- 数值开头跟着
e
和E
的表达式总是浮点字面量。 - 数值开头跟着
f
的表达式总是 32-bit 浮点字面量。
由于历史原因 E
和 e
在数值字面量上是等价的,与之不同的是,F
只是一个行为和 f
不同的字母。因此开头为 F
的表达式将会被 解析为一个数值字面量乘以一个变量,例如 1.5F22
等价于 1.5 * F22
。
零和一的字面量
Julia 提供了 0 和 1 的字面量函数,可以返回特定类型或所给变量的类型。
函数 | 描述 |
---|---|
zero(x) | x 类型或变量 x 的类型的零字面量 |
one(x) | x 类型或变量 x 的类型的一字面量 |
这些函数在数值比较中可以用来避免不必要的[类型转换](http://127.0.0.5/@ref conversion-and-promotion)带来的开销。
例如:
julia> zero(Float32)
0.0f0
julia> zero(1.0)
0.0
julia> one(Int32)
1
julia> one(BigFloat)
1.0
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论