首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在朱莉娅: Float64和BigFloat的平等

在朱莉娅: Float64和BigFloat的平等
EN

Stack Overflow用户
提问于 2018-09-10 04:15:10
回答 2查看 600关注 0票数 2

在Julia 1.0.0 REPL中,我得到了以下结果:

代码语言:javascript
复制
# Line 1: This make sense.  I did not expect a Float64 to equal a BigFloat.
julia> 26.1 == big"26.1"
false

# Line 2: This surprised me when Line 1 is considered.  Again, like Line 1, I 
# did not expect a Float64 to equal an equivalent BigFloat.
julia> 26.0 == big"26.0"
true

# Line 3: This I expected based on Line 1 behavior.
julia> 26.1 - 0.1 == big"26.1" - 0.1
false

# Line 4: This surprised me based on Line 1 behavior, but it might be 
# explained based on Line 2 behavior.  It seems to imply that if a Float64 
# can be converted to an Integer it will compare equal to an equivalent BigFloat.
julia> 26.1 - 0.1 == big"26.1" - big"0.1"
true

看起来Julia在这里暗地里做了一些与Float64和BigFloat的相等比较,这使得第2行和第4行为真,而第1行和第3行为假。有什么建议吗?

关于"==“的Julia文档似乎没有涵盖这类事情:https://docs.julialang.org/en/v1/base/math/#Base.:==

编辑:基于@EPo下面的一条有用的评论,很容易让上面的所有比较成为现实。例如,第1行和第3行在下面为真,但在上面为假:

代码语言:javascript
复制
# Line 1 is now true.
julia> 26.1 ≈ big"26.1"
true

# Line 3 is now true.
julia> 26.1 - 0.1 ≈ big"26.1" - 0.1
true
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-10 05:13:09

一些浮点数可以精确地表示(26.0),但不是全部,例如:

代码语言:javascript
复制
julia> using Printf
julia> @printf("%.80f",26.0)
26.00000000000000000000000000000000000000000000000000000000000000000000000000000000
julia> @printf("%.80f",0.1)
0.10000000000000000555111512312578270211815834045410156250000000000000000000000000

例如,小数0.5、0.25、0.125也可以用基于二进制的浮点表示精确地表示。举个例子,你有:

代码语言:javascript
复制
julia> 26.125 - 0.125 == big"26.125" - 0.125
true

但是0.1在二进制中是一个周期性的数字,所以它是四舍五入的。

代码语言:javascript
复制
julia> bitstring(0.1)
"0011111110111001100110011001100110011001100110011001100110011010"

最后52位以二进制形式表示分数。(https://en.wikipedia.org/wiki/Double-precision_floating-point_format)

票数 7
EN

Stack Overflow用户

发布于 2018-09-10 18:07:55

它们不同的原因是因为它们不同

代码语言:javascript
复制
julia> using Printf
julia> string(BigFloat("26.1")-BigFloat("26"))
"1.000000000000000000000000000000000000000000000000000000000000000000000000000553e-01"
julia> @printf("%.17e",Float64(26.1)-Float64(26))
1.00000000000001421e-01
julia> Float64(26.1)-Float64(26) > BigFloat("26.1")-BigFloat("26")
true
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52248341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档