Как мне показать больше цифр числа пи в Haskell? - PullRequest
0 голосов
/ 27 декабря 2018

Я бы хотел take больше цифр значения Prelude pi.

Prelude> take 4 $ show pi
"3.14"

Но

Prelude> take 17 $ show pi
"3.141592653589793"

Prelude> take 170 $ show pi
"3.141592653589793"

Является ли константа pi только что сохраненной, усеченной?Есть ли в show возможность печатать в строку больше цифр?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

pi - это метод класса Floating:

class Fractional a => Floating a where
  pi :: a
  ...

Так что pi является полиморфным, и разработчик экземпляра должен определить его соответствующим образом.

Наиболее распространенные экземпляры - это Float и Double, которые имеют ограниченную точность:

Prelude> pi :: Float
3.1415927
Prelude> pi :: Double
3.141592653589793

, но ничто не мешает вам использовать другие пакеты, такие как long-double, который дает еще несколько битовнекоторые системы:

Numeric.LongDouble> pi :: LongDouble 
3.1415926535897932385

или rounded, которые дают произвольно много бит точности с помощью программной реализации MPFR:

Numeric.Rounded> pi :: Rounded TowardNearest 100
3.1415926535897932384626433832793
Numeric.Rounded> pi :: Rounded TowardNearest 500
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081283

Пакет numbers обеспечивает реализацию на чистом Haskell:Конструктивные (точные) действительные числа, которые могут отображаться в любом количестве цифр:

Data.Number.CReal> showCReal 100 pi
"3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068"

Вы также можете иметь меньшую точность с пакетом half, возможно, совместимым с GPU:

Numeric.Half> pi :: Half
3.140625

Когда вы оцениваете pi без указания конкретного типа, вступают в действие правила по умолчанию интерпретатора.

Каждая переменная по умолчанию заменяется первым типом в списке по умолчанию, которыйявляется экземпляром всех классов неоднозначной переменной.... Если в модуле не задано объявление по умолчанию, то предполагается, что оно будет: default (Integer, Double) - https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-790004.3.4

Prelude> :t pi
pi :: Floating a => a

Integer не Floating, а Double есть, поэтому неоднозначный тип разрешается по умолчанию Double.Вы можете получить больше информации, включив -Wtype-defaults:

Prelude> :set -Wtype-defaults 
Prelude> pi

<interactive>:2:1: warning: [-Wtype-defaults]
    • Defaulting the following constraints to type ‘Double’
        (Show a0) arising from a use of ‘print’ at <interactive>:2:1-2
        (Floating a0) arising from a use of ‘it’ at <interactive>:2:1-2
    • In a stmt of an interactive GHCi command: print it
3.141592653589793

(Примечание: я написал пакет long-double и являюсь текущим сопровождающим rounded.)

0 голосов
/ 27 декабря 2018

Пи определяется как

 pi = 3.141592653589793238

Так что есть все цифры, которые вы можете иметь.Имейте в виду, что Floating класс типов используется для его представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...