只是为了好玩,因为它非常简单,我编写了一个简短的程序来生成嫁接数,但由于浮点精度问题,它没有找到一些更大的例子.
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
Run Code Online (Sandbox Code Playgroud)
此代码缺少至少一个已知的嫁接编号.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) …Run Code Online (Sandbox Code Playgroud) 我尝试的时候正在玩python
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
Run Code Online (Sandbox Code Playgroud)
由于浮点不准确,我认为这是正常的.我还预计0.1*10会略大于1.0
然后我试过了
>>> Decimal(0.1 * 10)
Decimal('1')
>>> 0.1 * 10 == 1.0
True
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为它们不应该是平等的.
>>> sum = 0.0
>>> for i in range(10):
sum += 0.1
>>> Decimal(sum)
Decimal('0.99999999999999988897769753748434595763683319091796875')
Run Code Online (Sandbox Code Playgroud)
这也很奇怪,因为它应该略大于1.0
谁可以给我解释一下这个.
我不确定这是否相关,但我在Windows 8.1 64位上使用了python 3.5.2和python 2.7.12.