18 Oct 2018 in Julia

Julia学习笔记

简介

Julia是个灵活的动态语言,适合科学和数值计算。总的来说其优势在于:

  • 免费开源(MIT 协议 )
  • 自定义类型与内置类型同样高效、紧凑
  • 不需要把代码向量化;非向量化的代码跑得也很快
  • 为并行和分布式计算而设计
  • 轻量级“绿色”线程(协程 )
  • 低调又牛逼的类型系统
  • 优雅、可扩展的类型转换
  • 高效支持 Unicode, 包括且不只 UTF-8
  • 直接调用 C 函数(不需封装或 API)
  • 像 Shell 一样强大的管理其他进程的能力
  • 像 Lisp 一样的宏和其他元编程工具

代码运行

  • 交互式情况下: 输入julia进入交互式界面,然后就可以进行交互式回话,退出方式:ctrl+d或者quit(),如果想要运行源文件file.jl中的代码,请输入include(“file.jl”)
  • 非交互式情况: 直接这样运行:
    julia script.jl arg1 arg2 ...
    

    其他可选项 ``` julia [options] [program] [args…] -v, –version Display version information -h, –help Print this message -q, –quiet Quiet startup without banner -H, –home

    Set location of julia executable

-e, –eval Evaluate -E, --print Evaluate and show -P, --post-boot Evaluate right after boot -L, --load Load right after boot on all processors -J, --sysimage Start up with the given system image file

-p Run n local processes --machinefile Run processes on hosts listed in

-i Force isinteractive() to be true –no-history-file Don’t load or save history -f, –no-startup Don’t load ~/.juliarc.jl -F Load ~/.juliarc.jl, then handle remaining inputs –color={yes|no} Enable or disable color text

–code-coverage Count executions of source lines –check-bounds={yes|no} Emit bounds checks always or never (ignoring declarations) –int-literals={32|64} Select integer literal size independent of platform


## 变量
+ 变量名必须以字母(a-z 或 A-Z),下划线,或一个 Unicode 编码指针中指向比 00A0 更大的指针子集开始;特别是 Unicode 字符 Lu/Ll/Lt/Lm/Lo/Nl(字母),Sc/So (货币和其他符号),和其他一些可以看做字符的一些输入(例如 Sm 数学符号的子集)是允许的。首位之后的字符也包括 !和数字(0-9 和其他字符 Nd/No ),以及其他 Unicode 编码指针:变音符号和其他修改标记(字母 Mn/Mc/Me/Sk),一些标点连接器(字母 PC),素数,和其他的一些字符,内置的关键字不能当变量名。
+ 建议的命名规范:
  + 变量名使用小写字母
  + 单词间使用下划线 ('_') 分隔,但不鼓励
  + 类型名首字母大写, 单词间使用驼峰式分隔.
  + 函数名和宏名使用小写字母, 不使用下划线分隔单词.
  + 修改参数的函数结尾使用 ! . 这样的函数被称为 mutating functions 或 in-place functions

## 变量类型
+ 整数: 整数类型的默认类型取决于目标系统是32位还是64位。Julia定义了 Int 和 Uint 类型,它们分别是系统原生的有符号和无符号。对于不能用 32 位而只能用 64 位来表示的大整数文本,不管系统类型是什么,始终被认为是 64 位整数。基础数值类型的最小值和最大值,可由 typemin 和 typemax 函数查询:

Int8: [-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]

  + 16进制:0x开头
  + 8进制:0o开头
  + 2进制: 0b开头
+ Char:支持Unicode字符
+ 浮点类型:
  + Float16    半精度    16
  + Float32    单精度    32
  + Float64    双精度    64
  半精度浮点数(Float16) ,但只用来存储。计算时,它们被转换为 Float32 
+ 溢出:为了减小溢出所带来的影响,整数加减法、乘法、指数运算都会把原先范围较小的整数类型提升到 Int 或 Uint 类型。(除法、求余、位运算则不提升类型)。
+ 特殊值       
  + Inf16    Inf32    Inf    正无穷    比所有的有限的浮点数都大
  + -Inf16    -Inf32    -Inf    负无穷    比所有的有限的浮点数都小
  + NaN16    NaN32    NaN    不存在    不能和任意浮点数比较大小(包括它自己)

+ 精度
大多数的实数并不能用浮点数精确表示,因此有必要知道两个相邻浮点数间的间距,Julia 提供了 eps 函数,可以用来检查 1.0 和下一个可表示的浮点数之间的间距:

julia> eps(Float32) 1.1920929f-7

julia> eps(Float64) 2.220446049250313e-16

julia> eps() # same as eps(Float64) 2.220446049250313e-16 ``` eps 函数也可以取浮点数作为参数,给出这个值和下一个可表示的浮点数的绝对差,即, eps(x) 的结果与 x 同类型,且满足 x + eps(x) 是下一个比 x 稍大的、可表示的浮点数.相邻的两个浮点数之间的距离并不是固定的,数值越小,间距越小;数值越大, 间距越大。换句话说,浮点数在 0 附近最稠密,随着数值越来越大,数值越来越稀疏,数值间的距离呈指数增长。根据定义, eps(1.0) 与 eps(Float64) 相同,因为 1.0 是 64 位浮点数。函数 nextfloat 和 prevfloat 可以用来获取下一个或上一个浮点数。

Thank You For Reading