返回介绍

整数和浮点数

发布于 2019-07-03 15:53:47 字数 7780 浏览 1099 评论 0 收藏 0

整数和浮点值是算术和计算的基础。这些数值的内置表示被称作原始数值类型(numeric primitive),且整数和浮点数在代码中作为立即数时称作数值字面量(numeric literal)。例如,1 是个整型字面量,1.0 是个浮点型字面量,它们在内存中作为对象的二进制表示就是原始数值类型。

Julia 提供了很丰富的原始数值类型,并基于它们定义了一整套算术操作,还提供按位运算符以及一些标准数学函数。这些函数能够直接映射到现代计算机原生支持的数值类型及运算上,因此 Julia 可以充分地利用运算资源。此外,Julia 还为任意精度算术提供了软件支持,对于无法使用原生硬件表示的数值类型,Julia 也能够高效地处理其数值运算。当然,这需要相对的牺牲一些性能。

以下是 Julia 的原始数值类型:

  • 整数类型:
类型带符号?比特数最小值最大值
Int88-2^72^7 - 1
UInt8 802^8 - 1
Int1616-2^152^15 - 1
UInt16 1602^16 - 1
Int3232-2^312^31 - 1
UInt32 3202^32 - 1
Int6464-2^632^63 - 1
UInt64 6402^64 - 1
Int128128-2^1272^127 - 1
UInt128 12802^128 - 1
BoolN/A8false (0)true (1)
  • 浮点类型:
类型精度比特数
Float16half16
Float32single32
Float64double64

此外,对复数和有理数的完整支持是在这些原始数据类型之上建立起来的。多亏了 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 开头的表达式总是十六进制字面量。
  • 数值开头跟着 eE 的表达式总是浮点字面量。
  • 数值开头跟着 f 的表达式总是 32-bit 浮点字面量。

由于历史原因 Ee 在数值字面量上是等价的,与之不同的是,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文