Julia 使用 @printf 打印错误的 Pi 数字

Sdi*_*idS 2 precision printf pi julia

当我比较 的输出时,结果@printf("%.50f", pi)BigFloat(pi)第 16 位不同。这可能是由于类型反转造成的。但我喜欢更深入地了解这里发生了什么?


朱莉娅> @printf("%.50f", pi)

   3.14159265358979311599796346854418516159057617187500
Run Code Online (Sandbox Code Playgroud)

朱莉娅> BigFloat(pi)

3.1415926535897932384626433832795028841971693993751058209749445923078164062861
Run Code Online (Sandbox Code Playgroud)

Col*_*ers 5

pi,以及其他几个众所周知的无理数,都有自己的特殊类型Irrational。这些都是精确存储的Float64,我不认为有任何计划在 v1.0 中改变这一点。

如果您想要比这更高的精度,请使用BigFloat(pi),就像您在问题中所做的那样。

但这里的关键点是@printf("%.50f", pi)不会自动包装对BigFloat(pi). 要获得这种行为,您需要@printf("%.50f", BigFloat(pi)). 您实际上在这里遇到的问题与本身无关pi,而是与 Julia 中打印浮点数的方式有关(事实上,在大多数编程语言中)。要明白我的意思,请尝试:

@printf("%.50f", rand())
Run Code Online (Sandbox Code Playgroud)

这本质上是要求 Julia 打印一个Float64从 [0,1] 区间到小数点后 50 位的随机数,这显然是一个超过小数点后 16 位的无意义请求。那么为什么在第 16 位之后会得到一大堆随机数呢?

以良好的人类可读格式快速准确地打印Float64本身就是一个主题。如果您真的对正在发生的事情感兴趣,那么这篇文章应该可以帮助您入门,但简单的答案是不要注意通常的浮点精度之后的任何内容

另外,据我所知,这种行为对于大多数编程语言来说都很常见。这不是您观察到的 Julia 特定行为,而是处理器级别的行为。