当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 整数和浮点数

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:03

正无穷 比所有的有限的浮点数都大 -Inf16 -Inft32 -Inf 负无穷 比所有的有限的浮点数都小 NaN16 NaN32 NaN 不存在 不能和任意浮点数比较大小(包括它自己) 详见数值比较 。按照 IEEE 754 标准 ,这几个值可如下获得:julia> 1/Inf0.0julia> 1/0Infjulia> -5/0-Infjulia> 0.000001/0Infjulia> 0/0NaNjulia> 500 + InfInfjulia> 500 - Inf-Infjulia> Inf + InfInfjulia> Inf - InfNaNjulia> Inf * InfInfjulia> Inf / InfNaNjulia> 0 * InfNaN typemin 和 typemax 函数也适用于浮点数类型: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.0 是 64 位浮点数。 函数 nextfloat 和 prevfloat 可以用来获取下一个或上一个浮点数:julia> x = 1.25f01.25f0julia> nextfloat(x)1.2500001f0julia> prevfloat(x)1.2499999f0julia> bits(prevfloat(x))"00111111100111111111111111111111"julia> bits(x)"00111111101000000000000000000000"julia> bits(nextfloat(x))"00111111101000000000000000000001" 此例显示了邻接的浮点数和它们的二进制整数的表示。 舍入模型 如果一个数没有精确的浮点数表示,那就需要舍入了。可以根据 IEEE 754 标准 来更改舍入的模型:julia> 1.1 + 0.11.2000000000000002julia> with_rounding(Float64,RoundDown) do 1.1 + 0.1 end1.2 默认舍入模型为 RoundNearest ,它舍入到最近的可表示的值,这个被舍入的值使用尽量少的有效数字。 背景和参考资料 浮点数的算术运算同人们的预期存在着许多差异,特别是对不了解底层实现的人。许多科学计算的书籍都会详细的解释这些差异。下面是一些参考资料: 关于浮点数算数运算最权威的指南是 IEEE 754-2008 标准 ;然而,该指南没有免费的网络版 一个简短但是清晰地解释了浮点数是怎么表示的, 请参考 John D. Cook 的文章 。它还简述了由于浮点数的表示方法不同于理想的实数会带来怎样的问题 推荐 Bruce Dawson 的关于浮点数的博客 David Goldberg 的每个计算机科学家都需要了解的浮点数算术计算,是一篇非常精彩的文章, 深入讨论了浮点数和浮点数的精度问题 更深入的文档, 请参考“浮点数之父”William Kahan 的 collected writings ,其中详细记录了浮点数的历史、理论依据、问题,还有其它很多的数值计算方面的内容。更有兴趣的可以读 采访浮点数之父 任意精度的算术 为保证整数和浮点数计算的精度,Julia 打包了 GNU Multiple Precision Arithmetic Library, GMP(https://gmplib.org/) 和 GNU MPFR Library。Julia 相应提供了 BigInt 和 BigFloat 类型。 可以通过基础数值类型或 String 类型来构造:julia> BigInt(typemax(Int64)) + 19223372036854775808julia> BigInt("123456789012345678901234567890") + 1123456789012345678901234567891julia> BigFloat("1.23456789012345678901")1.234567890123456789010000000000000000000000000000000000000000000000000000000004e+00 with 256 bits of precisionjulia> BigFloat(2.0^66) / 32.459565876494606882133333333333333333333333333333333333333333333333333333333344e+19 with 256 bits of precisionjulia> factorial(BigInt(40))815915283247897734345611269596115894272000000000 然而,基础数据类型和 BigInt/BigFloat 不能自动进行类型转换,需要明确指定:julia> x = typemin(Int64)-9223372036854775808julia> x = x - 19223372036854775807julia> typeof(x)Int64julia> y = BigInt(typemin(Int64))-9223372036854775808julia> y = y - 1-9223372036854775809julia> typeof(y)BigInt (constructor with 10 methods) BigFloat 运算的默认精度(有效数字的位数)和舍入模型,是可以改的。然后,计算就都按照更改之后的设置来运行了:julia> with_rounding(BigFloat,RoundUp) do BigFloat(1) + BigFloat("0.1") end1.100000000000000000000000000000000000000000000000000000000000000000000000000003e+00 with 256 bits of precisionjulia> with_rounding(BigFloat,RoundDown) do BigFloat(1) + BigFloat("0.1") end1.099999999999999999999999999999999999999999999999999999999999999999999999999986e+00 with 256 bits of precisionjulia> with_bigfloat_precision(40) do BigFloat(1) + BigFloat("0.1") end1.1000000000004e+00 with 40 bits of precision 代数系数 Julia 允许在变量前紧跟着数值文本,来表示乘法。这有助于写多项式表达式:julia> x = 33julia> 2x^2 - 3x + 110julia> 1.5x^2 - .5x + 113.0 指数函数也更好看

上一页  [1] [2] [3]  下一页


Julia 整数和浮点数