Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C: Datentyp "long"
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule C: Datentyp "long"
JamesNguyen
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2021-02-26


Hallo,

wenn ich die Funktion für die n-te Fibonaccizahl habe

long fib(long n)
{
    long fN = 1, fNminus1 = 0, fNminus2;
    for(long i=0; i<n; i++) {
    fNminus2 = fNminus1;
    fNminus1 = fN;
   fN = fNminus1 + fNminus2;
}
    return fN;
}

wenn ich hier statt long überall unsigned long long schreiben würde, könnte ich dann größere fib zahlen abfragen?

Danke,
James




Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: im letzten Monat
Dabei seit: 04.03.2003
Mitteilungen: 27783
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2021-02-26


Warum beherzigst du nicht das, was dir reik hier geraten hat?
Immerhin hast du es gelesen und abgehakt


-----------------
Bild



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
reik
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 06.01.2010
Mitteilungen: 152
Herkunft: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2021-02-26


en.wikipedia.org/wiki/C_data_types

"Long long unsigned integer type. Contains at least the [0, +18,446,744,073,709,551,615] range.[3] Specified since the C99 version of the standard."

"The relation requirements are that the long long is not smaller than long, which is not smaller than int, which is not smaller than short."

Die tatsächliche Implementierung ist machine dependent. Du kannst mit dem sizeof Operator die Größe in Byte (vom Typ size_t) Dir ausgeben lassen - bei mir ist ein long bereits 8 Byte. Um Portabilität zu gewährleisten, verwendet man deshalb gerne die expliziten typedefs vom bereits bekannten Link: en.cppreference.com/w/cpp/types/integer

Ja, die größte Fib-Zahl erreichst Du mit der unsigned Variante aber vermutlich gibt es keinen Unterschied zwischen long und long long.




[Die Antwort wurde vor Beitrag No.1 begonnen.]



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
viertel
Senior Letzter Besuch: im letzten Monat
Dabei seit: 04.03.2003
Mitteilungen: 27783
Herkunft: Hessen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2021-02-26


2021-02-26 17:34 - JamesNguyen im Themenstart schreibt:
wenn ich hier statt long überall unsigned long long schreiben würde, könnte ich dann größere fib zahlen abfragen?
Frag das die Doku zu deinem Compiler!

[Die Antwort wurde nach Beitrag No.1 begonnen.]



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 6797
Herkunft: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2021-02-26


Ich würde das einfach mal ausprobieren.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, vom Themenstarter, eingetragen 2021-02-26


also ich habe das jetzt mal implementiert so wie ich mir das vorgestellt habe

#include <stdio.h>

int main ( void )
{
auto unsigned long long fN = 1ull , fNminus1 = 0ull , fNminus2 ;

int i ;

for ( i = 0 ; i < 90 ; i ++ )
{
fNminus2 = fNminus1 ;
fNminus1 = fN ;
fN = fNminus2 - fNminus1 ;
}

printf ( "%llu\n" , fN ) ;

return 0 ;
}

0.-te und 1.-te Fibonacci-zahl sind bei mir 1

jetzt stimmt bei mir die 90. Fibonacci-Zahl

4660046610375530309

aber bei der 91 müsste eig

7540113804746346429

rauskommen, bei mir kommt aber

10906630268963205187




wenn man sich die nächsten Fibonacci zahlen bis zur    unsigned long long grenze aufschreibt wäre eig noch platz.
bis zur 93. ?

4660046610375530309      90.

7540113804746346429      91.

12200160415122000000    92.

18446744073709551615   Grenze von unsigned long long

19740274219868000000    93.

[Die Antwort wurde nach Beitrag No.3 begonnen.]



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
StrgAltEntf
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 19.01.2013
Mitteilungen: 6797
Herkunft: Milchstraße
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2021-02-26


2021-02-26 18:30 - JamesNguyen in Beitrag No. 5 schreibt:
fN = fNminus2 - fNminus1 ;


Ich würde mal - durch + ersetzen.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
reik
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 06.01.2010
Mitteilungen: 152
Herkunft: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2021-02-26


1: 1
2: 1
3: 2
4: 3
5: 5
6: 8
7: 13
8: 21
9: 34
10: 55
11: 89
12: 144
13: 233
14: 377
15: 610
16: 987
17: 1597
18: 2584
19: 4181
20: 6765
21: 10946
22: 17711
23: 28657
24: 46368
25: 75025
26: 121393
27: 196418
28: 317811
29: 514229
30: 832040
31: 1346269
32: 2178309
33: 3524578
34: 5702887
35: 9227465
36: 14930352
37: 24157817
38: 39088169
39: 63245986
40: 102334155
41: 165580141
42: 267914296
43: 433494437
44: 701408733
45: 1134903170
46: 1836311903
47: 2971215073
48: 4807526976
49: 7778742049
50: 12586269025
51: 20365011074
52: 32951280099
53: 53316291173
54: 86267571272
55: 139583862445
56: 225851433717
57: 365435296162
58: 591286729879
59: 956722026041
60: 1548008755920
61: 2504730781961
62: 4052739537881
63: 6557470319842
64: 10610209857723
65: 17167680177565
66: 27777890035288
67: 44945570212853
68: 72723460248141
69: 117669030460994
70: 190392490709135
71: 308061521170129
72: 498454011879264
73: 806515533049393
74: 1304969544928657
75: 2111485077978050
76: 3416454622906707
77: 5527939700884757
78: 8944394323791464
79: 14472334024676221
80: 23416728348467685
81: 37889062373143906
82: 61305790721611591
83: 99194853094755497
84: 160500643816367088
85: 259695496911122585
86: 420196140727489673
87: 679891637638612258
88: 1100087778366101931
89: 1779979416004714189
90: 2880067194370816120
91: 4660046610375530309
92: 7540113804746346429
93: 12200160415121876738

94: 1293530146158671551
95: 13493690561280548289
96: 14787220707439219840
97: 9834167195010216513
98: 6174643828739884737
99: 16008811023750101250

\(2^{64} - 1 - 12200160415121876738 - 7540113804746346429 = -1293530146158671552\)

D.h. fib(94) kann nicht mehr mit 8 Byte unsigned dargestellt werden.


[Die Antwort wurde nach Beitrag No.5 begonnen.]



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
reik
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 06.01.2010
Mitteilungen: 152
Herkunft: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, eingetragen 2021-02-26

C
#include <stdio.h>
 
int main(void)
{
    unsigned long a, b, tmp;
 
    a = 0, b = 1;
 
    for (int i = 1; i < 100; i++)
    {
        printf("%i: %lu\n", i, b);
        tmp = a + b;
        a = b;
        b = tmp;
    }
    return 0;
}



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
pzktupel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 02.09.2017
Mitteilungen: 1861
Herkunft: Thüringen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2021-02-26


Bei 2^64-1 ist schluß. Will man größere Zahlen gewinnen, muss man diese allgemein zerteilen und wieder neu zusammenbauen. Das macht man meist mit Stringtypen.

Will man zum Bsp. 18991 + 23665 berechnen und hätte nur bis 2000 einen Zahlenraum, dann kann man dies tun.

 18 991
+23 665
_______
    656 mit Ü=1, wegen 991+665=1 656
 42=1+18+23
 
Ergebnis: 42656



Das kann man fortsetzen, bis der Hauptspeicher am Ende ist...


-----------------
zum Primzahl k-Tupel Thread
PDFs on "Mathematik alpha"
Hinweis: MP-Notizbuch



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 08.11.2020
Mitteilungen: 187
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2021-02-26


ah stimmt mit + klappt das nun richtig.


Danke!

[Die Antwort wurde nach Beitrag No.8 begonnen.]

ah ok das wäre eine Möglichkeit ohne weitere Bibiliotheken

Danke!



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
pzktupel
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 02.09.2017
Mitteilungen: 1861
Herkunft: Thüringen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.11, eingetragen 2021-02-26


Naja, oder man verwirft gleich "unsigned long" und arbeitet mit Strings.

Dabei implementiert man die schriftliche Addition, wie in der Schule...und baut von rechts nach links den String für das Ergebnis auf.

Zahl 1 = 871
Zahl 2 = 455

Erg. 1<3<2<6  

Setze Zahl 1 auf das Erg. usw.





Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
JamesNguyen hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]