Доступна ли произвольная точность Python с плавающей точкой?

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

def isGrafting(a):
  for i in xrange(1, int(ceil(log10(a))) + 2):
    if a == floor((sqrt(a) * 10**(i-1)) % 10**int(ceil(log10(a)))):
      return 1

a = 0
while(1):
  if (isGrafting(a)):
    print "%d %.15f" % (a, sqrt(a))
  a += 1

В этом коде пропущен хотя бы один известный номер прививки.9999999998 => 99999.99998999999999949999999994999999999374999999912...  Кажется, что снижается дополнительная точность после умножения на10**5.

>>> a = 9999999998
>>> sqrt(a)
99999.99999
>>> a == floor((sqrt(a) * 10**(5)) % 10**int(ceil(log10(a))))
False
>>> floor((sqrt(a) * 10**(5)) % 10**int(ceil(log10(a))))
9999999999.0
>>> print "%.15f" % sqrt(a)
99999.999989999996615
>>> print "%.15f" % (sqrt(a) * 10**5)
9999999999.000000000000000

Поэтому я написал короткую программу на C ++, чтобы узнать, урезал ли мой процессор число с плавающей запятой или каким-то образом Python.

#include <cstdio>
#include <cmath>
#include <stdint.h>

int main()
{
  uint64_t a = 9999999998;
  printf("%ld %.15f %.15f %.15f %.15f\n", a, sqrt((double)a), sqrt((double)a)*1e4, sqrt((double)a)*1e5, sqrt((double)a)*1e6);
  a = 999999999998;
  printf("%ld %.15f %.15f %.15f %.15f\n", a, sqrt((double)a), sqrt((double)a)*1e5, sqrt((double)a)*1e6, sqrt((double)a)*1e7);
  a = 99999999999998;
  printf("%ld %.15f %.15f %.15f %.15f\n", a, sqrt((double)a), sqrt((double)a)*1e6, sqrt((double)a)*1e7, sqrt((double)a)*1e8);
  return 0;
}

Какие выводы:

9999999998 99999.999989999996615 999999999.899999976158142 9999999999.000000000000000 99999999990.000000000000000
999999999998 999999.999998999992386 99999999999.899993896484375 999999999999.000000000000000 9999999999990.000000000000000
99999999999998 9999999.999999899417162 9999999999999.900390625000000 99999999999999.000000000000000 999999999999990.000000000000000

Таким образом, похоже, что я сильно бегаю по пределам точности с плавающей запятой, и ЦПУ обрезает оставшиеся биты, потому что считает, что оставшееся различие является ошибкой с плавающей запятой. Есть ли способ обойти это под Python? Или мне нужно перейти на C и использовать GMP или что-то?

Ответы на вопрос(5)

Ваш ответ на вопрос