Есть ли способ рационализировать десятичную дробь в Pari / GP?

StackOverflow https://stackoverflow.com/questions/947445

  •  09-09-2019
  •  | 
  •  

Вопрос

Я ищу автоматический способ превратить десятичное значение в дробь в калькуляторе PARI / GP (gp).Например, я хочу превратить 0,759765625 в 389/512.Я знаю, что могу сделать это вручную, введя '759765625/10 ^ 9', но я бы хотел более простой способ, например 'rationalize (0.759765625);', который работал бы в Maxima.

Если он не может сделать это напрямую, может быть, есть функция для подсчета количества знаков после запятой?Тогда я мог бы увеличить 10 до результата этой функции.(Функция должна была бы подсчитывать начальные десятичные разряды 0, чтобы быть полезной.)

Это было полезно?

Решение

В pari-2.5 вы можете использовать bestappr(x) напрямую, без указания дополнительного аргумента количество цифр.Он будет использовать все внутренне доступные цифры:

? bestappr(Pi)
%1 = 17004845848539028973023/5412810546621363616752

Другие советы

Используйте функцию bestappr();для приведенного примера используйте bestappr(0.759765625,10^9).(Ответ любезно предоставлен списком рассылки PARI / GP.)

Это все еще имеет тот недостаток, что количество десятичных разрядов должно быть задано вручную, но это можно преодолеть:второму параметру bestappr() можно присвоить очень большую степень 10, большую, чем самая длинная десятичная дробь, которая вам когда-либо понадобится для "рационализации".

Осторожно:убедитесь, что установлена достаточно высокая точность, прежде чем вызывать bestappr, используя команду \p.

Два отличных способа сделать это:

а) использовать lindep:

x=Pi;digits=7;l=lindep([x,1],digits);-l[2]/l[1]

б) используйте непрерывные дроби, останавливаясь всякий раз, когда встречается большое частное (ниже я установил ограничение на 1000).:

x=Pi;maxquot=1000;p0=0;p1=1;q0=1;q1=0;a=floor(x);while(a<maxquot,p2=a*p1+p0;q2=a*q1+q0;p0=p1;p1=p2;q0=q1;q1=q2;x=1/frac(x);a=floor(x));p1/q1
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top