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

Julia prints wrong Pi digits with @printf

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


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

   3.14159265358979311599796346854418516159057617187500

朱莉娅> BigFloat(pi)

3.1415926535897932384626433832795028841971693993751058209749445923078164062861

pi 与其他几个著名的无理数一样,都有自己的特殊类型 Irrational。这些存储为 Float64 精度,我认为没有任何计划将其更改为 v1.0。

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

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

@printf("%.50f", rand())

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

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

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