2017-03-17 4 views
-4

私はpythonで数学のパラドックスを扱っていますが、100%正確な数値変数が必要です。コンマの後ろにあります。私の英語が悪い場合は、ごめんなさい。どのように私は無限の数字をカンマの後ろに無限の数字を使って変数を作るのですか

addition = 0.5 
    time = 0 
    lengthWalked = 0 
    nr = 0 
    while True: 
     nr += 1 
     time += addition 
     lengthWalked += addition 
     addition = addition/2 
     print("nr: ",nr,"time: ",time,"Length walked: ",lengthWalked) 

このコードでは、0,5,5、またはその半分、または0,25、次に0,125を追加します。あなたはポイントを得る。変数が無限の数を保持できる場合は、半分の量を加えて1に達することはありませんが、53に1を加えて54に1になります。

これはZenoのパラドックス

+0

あなたの質問は何ですか? –

+0

このような番号を保持するためには、番号を入力する必要があります。最大浮動小数点数128を持つことができるため、最小差は2 ** - 128 –

+5

にしかなりません。これは数値的ではなく記号的に行わなければなりません。数値的に実行されると、最終的にはメモリ不足、ストレージ、そして宇宙の原子が不足します。 – Chris

答えて

5

ませ物理コンピュータは無限のデータを保持することはできませんが、あなたはfractionsモジュールを使用することによって、プロセスのメモリの限界まで高い精度を得ることができます:

>>> from fractions import Fraction 
>>> walked = Fraction(0) 
>>> addition = Fraction(1,2) 
>>> while True: 
...  walked += addition 
...  print(walked) 
...  addition /= 2 
... 
1/2 
3/4 
7/8 
15/16 
31/32 
63/64 
127/128 
255/256 
511/512 
1023/1024 
2047/2048 
4095/4096 
8191/8192 
#snip... 
35835915874844867368926665039455365204129607103827921929128897517135717358887465018319582487209796698111/35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852416 
71671831749689734737853330078910730408259214207655843858257795034271434717774930036639164974419593396223/71671831749689734737838152978190216899892655911508785116799651230841339877765150252188079784691427704832 
143343663499379469475706660157821460816518428415311687716515590068542869435549860073278329948839186792447/143343663499379469475676305956380433799785311823017570233599302461682679755530300504376159569382855409664 
0

sympyはあなたの問題を解決した後、いくつかになります。

>>> from sympy import symbols, summation, oo 
>>> i, n = symbols('i n', integer=True) 
>>> f = lambda n: summation(1/2**i, (i, 1, n)) 
>>> f(n) 
-2*2**(-n - 1) + 1 
>>> 1 - f(n) 
2*2**(-n - 1) 
>>> f(n) < 1 
True 
>>> f(1000) 
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069375/10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376 
>>> f(oo) 
1 

そうです、f(n)

  • 任意n
  • 1は、任意n
  • n->∞
  • の制限として1を認め、100%の精度でsympyによって計算することができるよりstricly小さいです
関連する問題