Sadece eğlence için ve çok kolay olduğu için, Grafting numbers oluşturmak için kısa bir program yazdım, ancak kayan nokta hassaslığı sorunları nedeniyle daha büyük örneklerden bazılarını bulamıyor.Python kayan nokta keyfi hassas kullanılabilir mi?
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
Bu kod bilinen en az bir Grafting numarası eksik. 9999999998 => 99999.99998999999999949999999994999999999374999999912...
10**5
ile çarpıldıktan sonra ekstra hassasiyet düşüyor gibi görünüyor.
>>> 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
Yani bir şekilde kayan nokta numarası veya python kısaltılıyor benim işlemci olup olmadığını görmek için kısa bir C++ programı yazdım. çıkışı
#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;
}
: Ben koşuyorum gibi
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
yüzden duyarlılığında sınırları karşı sert bakar ve düşündüğü için CPU kalan bitleri kesiyor kalan fark olduğunu kayan nokta hatasıdır. Python altında bunun üzerinde çalışmanın bir yolu var mı? Yoksa C'ye geçmek ve GMP'yi mi kullanmalıyım?
rasyonel sayı kesin aritmetik gerçekleştirmek için, [ 'fractions' modül] (https://docs.python.org/3/library/fractions.html) kullanılabilir . Mpmath için – jfs