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

时间:2018-04-20 04:50:46

标签: printf julia precision pi

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

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

   3.14159265358979311599796346854418516159057617187500

朱莉娅> BigFloat(PI)

3.1415926535897932384626433832795028841971693993751058209749445923078164062861

1 个答案:

答案 0 :(得分:4)

pi以及其他一些着名的非理性数字都有自己的特殊类型Irrational。这些存储精度为Float64,我认为没有任何计划将其更改为v1.0。

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

但这里的关键点是@printf("%.50f", pi) 会自动将调用包裹到BigFloat(pi)。要获得该行为,您需要@printf("%.50f", BigFloat(pi))。你在这里遇到的实际上与pi本身无关,而是与朱莉娅打印浮点数的方式有关(实际上,在大多数编程语言中)。要明白我的意思,请尝试:

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

基本上要求Julia从[0,1]间隔打印一个随机Float64到50个小数位,这显然是一个无意义的请求,大约是16位小数。那你为什么在第16名之后得到很多随机数呢?

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

此外,AFAIK,这种行为在大多数编程语言中都很常见。这不是您正在观察的特定于Julia的行为,而是处理器级别的行为。