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 特定行为,而是处理器级别的行为。
当我比较 @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 特定行为,而是处理器级别的行为。