Negative Zahlen bei Addition von positiven?

  • Hallo,

    ich hatte vor, einfach mal ein einfaches Programm zur Berechnung der Fibonacci-Folge zu schreiben ( zur Info: Beginnt mit 0,1,1,2,3,5,8,13,... Es werden also immer die beiden letzten Zahlen addiert.)

    Hier der Code:

    [autoit]

    #include <Array.au3>
    Global $fib_fol[901]
    $fib_fol[0] = 0
    $fib_fol[1] = 1

    [/autoit][autoit][/autoit][autoit]

    For $i = 2 To 900
    $fib_fol[$i] = $fib_fol[$i - 1] + $fib_fol[$i - 2]
    Next
    _ArrayDisplay($fib_fol)

    [/autoit]

    Jetzt werden bei mir aber ab Nummer 93 plötzlich ab und zu negative Zahlen angezeigt... :S Woher kommt das? ?(

    Hoffe ihr könnt mir helfen :)

    Edit: Hab auch in der Hilfe nach dne maximalen Werten geguckt, aber 1.7E-308 sagt mir ziemlich wenig...

    • Offizieller Beitrag

    Du überschreitest den Zahlenbereich der Integer-Variablen. Dafür haben wir in einem µIT mal BigInt-Funktionen erstellt.
    Hier mal Dein Script mit meiner BigInt_Add:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Global $fib_fol[901]
    $fib_fol[0] = 0
    $fib_fol[1] = 1

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 2 To 900
    $fib_fol[$i] = _BigInt_Add($fib_fol[$i - 1], $fib_fol[$i - 2])
    Next
    _ArrayDisplay($fib_fol)

    [/autoit] [autoit][/autoit] [autoit]

    Func _BigInt_Add($sAdd1, $sAdd2)
    If StringLen($sAdd1) <= 18 And StringLen($sAdd2) <= 18 Then Return Int($sAdd1) + Int($sAdd2)
    Local $sOut, $sTemp, $iCarry = 0
    If StringLen($sAdd1) < StringLen($sAdd2) Then
    $sTemp = $sAdd1
    $sAdd1 = $sAdd2
    $sAdd2 = $sTemp
    EndIf
    Local $aAdd1 = StringRegExp($sAdd1, '\A\d{' & Mod(StringLen($sAdd1), 18) & '}|\d{18}+', 3), $iCountAdd1 = UBound($aAdd1) - 1
    Local $aAdd2 = StringRegExp($sAdd2, '\A\d{' & Mod(StringLen($sAdd2), 18) & '}|\d{18}+', 3), $iCountAdd2 = UBound($aAdd2) - 1
    For $i = 0 To $iCountAdd1
    If $i <= $iCountAdd2 Then
    $sTemp = Int($aAdd1[$iCountAdd1 - $i]) + Int($aAdd2[$iCountAdd2 - $i]) + $iCarry
    Else
    $sTemp = Int($aAdd1[$iCountAdd1 - $i]) + $iCarry
    EndIf
    $iCarry = Int($sTemp/1000000000000000000)
    $sOut = StringRight('000000000000000000' & $sTemp, 18) & $sOut
    Next
    Return StringRegExpReplace($sOut, '(\A0+)(\d+)', '$2')
    EndFunc

    [/autoit]