Как рассчитать PI в Ruby? - PullRequest
0 голосов
/ 12 октября 2019

Мне нужно получить точное количество десятичных цифр числа пи, поэтому я попытался использовать этот метод:

require "bigdecimal/math"
include BigMath
input = 9
output = BigMath.PI(input).to_s
puts output

, но вместо этого получил в результате:

output: 3.141592653 # Which are the first 9 decimal digits of PI

Я получаю это:

output: 0.3141592653589793238462643313830947690870926e1

Что я делаю не так?

1 Ответ

1 голос
/ 13 октября 2019

Поскольку π является иррациональным числом , его десятичное представление никогда не заканчивается и никогда не превращается в постоянно повторяющийся шаблон .

Следовательно, алгоритмы вычисленияиз π можно найти только результаты с указанной точностью.

BigMath.PI - не исключение.

Параметр precкоторый мы передаем в качестве первого аргумента, означает точность (то есть число точных цифр после десятичной точки).

Когда мы выполняем BigMath.PI(9), мы получаем BigDecimal экземпляр, строковое представление которого равно 0.3141592653589793238462643313830947690870926e1.

Если мы посмотрим более внимательно на эту строку, мы увидим e1 в конце.

Такое обозначение встречается в математике и означает:

E-notation Image

Следовательно, в нашем случае

0.3141592653589793238462643313830947690870926e1

совпадает с

0.3141592653589793238462643313830947690870926 * 10 = 3.141592653589793238462643313830947690870926

Поскольку мы передали 9 в BigMath.PI у нас есть по крайней мере 9 точных цифр после десятичной точки

3.141592653589793238462643313830947690870926
3.141592653_________________________________

(На самом деле, когда мы передаем 9 в BigMath.PI, он возвращает более 9 точных цифр после десятичной точки, но мы не должны полагаться на этот факт. Вы можете попытаться сравнить , если хотите).

И, вероятно, последнее, что следует упомянуть: мы не можем просто преобразовать BigDecimal в Float, если мы заботимся о точности,потому что Float обычно хранит только 15 цифр после десятичной точки.

Итак, если ваша цель - показать π с произвольным числом цифр после десятичной точки, вы можете использовать следующий метод:

require 'bigdecimal/math'

##
# Returns PI as a string with number_of_digits_after_decimal_dot.
#
def pi(number_of_digits_after_decimal_dot: 2)
  # Let's assume presicion equals to 2 as an example
  precision = number_of_digits_after_decimal_dot

  result = BigMath.PI(precision)
  # => ВigDecimal 0.31415926535897932384671233672993238432e1

  result = result.truncate(precision).to_s
  # => String 0.314e1

  # Remove '0.'
  result = result[2..-1]
  # => String 3141e1

  # Remove 'e1'
  result = result.split('e').first
  # => String 3141

  result = result.insert(1, '.')
  # => String 3.141

  result
end

(спецификации можно найти здесь ).

Если нет, то, пожалуйста, обновите свой вопрос, чтобы сделать его менее двусмысленным.

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