Christoph Zurnieden: Problem mit großen Zahlen

Beitrag lesen

Hi,

Und für jede dieser Zahlen auch ein System, in dem eben jene Zahl in endlich viel Speicherplatz dargestellt werden kann.

dann brauchst du unendlich viele systeme.

Nein, das glaube ich nicht, aber dazu später.

Aber das die Verluste bei der Transkription auftreten ist ja bereits durchgekaut.

was meinst du?

Meinetwegen auch "bei der Übersetzung von einem System in's andere".

Was hat ein Rightshift mit dem String "pi * 0,1" zu tun? ist zwar ein dezimaler right-shift, aber dauert trotzdem unendlich lange. ;-)

Nein, Du hast mich mißverstanden, ich meinte wirklich den String "pi * 0,1". Das ist bereits eine ausreichende Darstellung der vollständigen Zahl, da muß nix verschoben werden. (vid. Church et al)

nein. wenn man dafuer 9^(9^(9^(9^9))) byte speicher nicht "koennte", sondern "kann". ich rede von der gegenwart und was jetzt moeglich ist.

Es ist unbekannt, was jetzt möglich ist.

warum? oder muessen wir erst wieder begriffskonventionen bzgl. des begriffs "moeglich" treiben?

Ja, da "möglich" nunmal einfach alles umfaßt, Du meinst aber wharscheinlich nur so etwas in der Richtung "technisch realisierbar" o.ä.? Dann sage das bitte auch.

was ich sagen moechte: egal, wie viel speicher zur zeit hergestellt werden koennte (egal wie viel moeglich ist), ich kann dir unendlich viele zahlen nennen, die man nicht speichern koennte.

Ja, stell' die Worte nur so geschickt um, das eine Falsifikation praktisch nicht möglich ist, sehr schön ;-)

Meine Frage "Gibt es für jede unendliche Darstellungsform auch eine endliche Entsprechung?" ist dagegen leicht zu falsifizieren: Du mußt nur ein einziges Gegenbeispiel finden. Aber denk dran: jedes Gegenbeispiel, das Du beschreiben kannst, ist durch eben jene Beschreibung schon in endlicher Form dargestellt und kann nicht mehr als Gegenbeispiel dienen. Ganz so leicht, wie von mir bekrittelt ist es also doch nicht und also auch praktisch nicht falsifizierbar?

moechte man unendlich viele zahlen darstellen, koennte man das nur, wenn man unendlich lange worte (symbol-kombinationen) zulaesst oder das zugrunde liegende alphabet (also die menge der "ziffern") unendlich gross ist.

Klingt zwar einleuchtend, aber: wie kommst Du darauf?

angenommen du haettest du ein endlich grosses ziffernalphabet (mit genau x zeichen) und die worte duerften nur maximal y ziffern lang sein. dann koenntest du maximal y^x, also nur endlich viele kombinationen an worten erzeugen.

Aha, das habe ich mir gedacht, die Rechnung läßt -- mit Absicht? -- etwas aus.

Du hast ein endliches Alphabet. Die Worte daraus müssen endlich sein. Es gibt eine Grammatik mit einer endlichen Anzahl Regeln.

Frage: ist es möglich damit jedes Element einer unendlichen Menge zu beschreiben?

[umsonst]

Also ich habe dafür immer einen auf's Haupt bekommen. Mit rotem Strich und Abzug in der B-Note.

ja, es ist oft der fall, dass irgendwelche leute der meinung sind, ein wort duerfe/koenne so nicht existieren, weil sie es in dieser oder jener verwendung noch nie gehoert haben (oder dies zumindest glauben).

Nein, das glaube ich nicht, ich benutze es umgangssprachlich sehr wohl. Das etwas allgemein verstanden wird heißt jedoch nicht, das es auch guter und sauberer Stil ist. Auch wenn Du jetzt den Spruch vom Glashaus auf der Zunge haben magst, so kümmert es mich normalerweise doch. Insbesodnere, wenn ich Witze drüber mache heißt das ja fast schon zwingend, das mir auch alle Details durchaus bekannt sind. Die genaue etymologische Herkunft müßte ich zwar auch nachschlagen, aber der Unterschied zwischen "ohne Preis" und "ohne Lohn" existiert nunmal und wird im Deutschem durch die beiden Worte "umsonst" und "vergeblich" auch sehr schön getrennt. Das in einigen deutschsprachigen Regionen das Wort "umsonst" eine Bedeutung von "vergeblich" mit übernommen hat ändert nichts daran.

ein bekannteres beispiel als "umsonst" in seiner vergeblich-bedeutung ist z.b. "sinn machen", etwas, das es schon seit mindestens zig jahren im deutschen sprachgebrauch gibt, das aber immer noch von einigen leuten partout nicht anerkannt werden moechte.

Ist ein "false 'false friend'". Das ein englischer Ausdruck im deutschem existiert heißt nur sehr selten, das er von dort übernommen wurde. Das ist ein von den Nazis verbreiteter Mythos.

u.a. deswegen finde ich den duden so toll... einfach, weil er konventionen buendelt.

Der Duden ist alleine schon aufgrund seines Quasi-Monopols eine äußerst heikle Sache, wenn man ihn zu mehr als nur Rechtschreib- und Grammatikfragen zu Rate ziehen möchte. Rechtschreibung und Grammatik ist gesetzlich festgelegt, jedoch beruht alles andere auf redaktioneller Arbeit, der Meinung einiger Menschen also. Dort wird zwar mit sehr großer Sorgfalt gearbeitet, es ist jedoch ohne die Möglichkeit eine zweite Meinung einzuholen nicht möglich etwas davon beim Wort zu nehmen.

BTW: ich glaube folgender Code aus meinem Archiv dürfte Dich amüsieren:


#ifndef _ISOC99_SOURCE
#define _ISOC99_SOURCE
#endif

#define _XOPEN_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <errno.h>

#include <time.h>



/* Original von Tomohiko Sakamoto aus der C FAQ, Sektion 20.3 */

/*
   Da das gute Stück nicht unbedingt leicht verständlich
   ist, gibt es natürlich auch eine Erklärung:

   Tomohiko Sakamoto hat die in der FAQ der sci.math Newsgroup
   gepostete Formel in C übertragen und stieß dabei auf Probleme.
   Erst einmal der Eintrag der FAQ (Recht frei aber sinngemäß
   von mir übersetzt):

     Die folgende Formel, die nur für den gregorianischen Kalender gültig ist
     mag eher für die Umsetzung in ein Computerprogramm nützen. Zu beachten,
     ist, das in einigen Programmiersprachen die Modulofunktion ein negatives
     Resultat ausgibt, wenn eine negative Zahl gefüttert wurde.

         W == (k + [2.6m - 0.2] - 2C + Y + [Y/4] + [C/4]) mod 7
             [] deutet die Abrundung auf sie nächstniedrigere ganze Zahl
      an. Eigentlich ein paar eckige Klammern, denene die oberen
      Querstriche fehlen, aber das ist in ASCII leider nicht
      darzustellen.

  k ist der Tag im Monat (1 bis 31)
  m ist der Monat
      (1 = März, ..., 10 = Dezember, 11 = Jan, 12 = Feb)
        Januar und Februar sind Monate des vergangenen Jahres.

  C ist das Jahrhundert (für das Beispiel 1987 also C = 19)
  Y ist das Jahr (Für 1987 also Y = 87 außer für Januar
                  und Februar, da ist es Y = 86)
  W ist der Wochentag (0 = Sonntag, ..., 6 = Samstag)

     In obige Formel sind die Schaltjahre schon eingerechnet. Der etwas
     merkwürdige Term [2.6m-0.2] leitet sich von der Regel ab, die alle
     dreißigtägigen Monate zeigen wenn der März als Monat 1 geführt wird.

   Das führte aber natürlich bei der Implementation zu merkwürdigen Ergebnissen.
   Der 1. März 1900 zeigte schon das Problem der Modulorechnung, da sich als
   vorläufiges Endergebniss -31 ergab, das ist modulo 7 = -3 in einigen
   Systemen.

   Aus der ursprüngliche Berechnung

    (k + (int)(2.6*m - 0.2) - 2*C + Y + Y/4 + C/4) % 7

   wurde über die Modulo Regeln

    (7*C) % 7 == 0  --->  (-2*C) % 7 == (-2*C + 7*C) % 7 == (5*C) % 7

   demnach schon mal

    (k + (int)(2.6*m - 0.2) + 5*C + Y + Y/4 + C/4) % 7

   Floating Point Rechnungen sind erstes teuer und werfen zweitens meistens
   auch noch andere Probleme auf. Einfaches Erweitern gibt aber

    (k + (13*m - 1)/5 + 5*C + Y + Y/4 + C/4) % 7

   Y enthält die letzten zwei Stellen der Jahreszahl y und C die ersten,
   demnach gelten also

    Y = y % 100 und C = y/100

   das geht sauber auf zu

    Y = y - 100*C

   Das ganze in den Term (5*C + Y + Y/4 + C/4) % 7 eingebaut und gekürzt

        (5*C + (y - 100*C)  + (y/4 - 25*C) + C/4) % 7 | Y = y % 100
 <=> (y + y/4 + C/4 - 120*C) % 7     | C = y/100
 <=> (497*y/400) % 7

   Diesen Term dann wieder oben einbauen

    (k + (13*m - 1)/5) + 497*y/400) % 7

   Da die Monatsberechnung nur eine kleine zwölfteilige Tabelle benötigt
   kann man den Term ((13*m - 1)/5) % 7 auch im Voraus berechnen

        Monat: Jan  Feb  Mär  Apr  Mai  Jun  Jul  Aug  Sep  Okt  Nov  Dez
         m: 11   12   1    2    3    4    5    6    7    8    9    10
   ((13*m - 1)/5): 28   30   2    5    7    10   12   15   18   20   23   25
         modulo 7:  0   2    2    5    0    3    5    1    4    6    2    4


   Wer die Geschichte nachlesen will: groups.google.com hatte zur Drucklegung
   den Thread noch gespeichert
   http://groups.google.de/groups?selm=CoxBt3.Hny%40wsservra.sm.sony.co.jp&output=gplain

*/



static int dayofweek(int d, int m, int y){

  int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };

  y -= ((m) < 3);

  /*
    Die 1:1 Übernahme führt allerdings zu Rundungsfehlern,
    die aufwendiger abzufangen sind, als das Verkneifen
    der letztmöglichen Zusammenfassung
    return (( (497*y/400) + (t[m-1]) + (d)) % 7);*/

  return ((y + y/4 + y/400 - y/100 + (t[m-1]) + (d)) % 7);
}


int main(int argc, char **argv){
  int  year = 0;
  int month = 0;
  int   day = 0;

  struct tm  t;
  char buffer[256];

     /* Manche fangen ihre Woche am Montag an,
      andere wieder am Sonntag. */
  char *daynames[7] = { "Sonntag", "Montag", "Dienstag","Mittwoch",
     "Donnerstag", "Freitag", "Samstag" };

  if(argc == 4){

    day = (int)strtoul(argv[1],NULL,10);
    if(day <= 0 || day > 31 || day == ERANGE){
      fprintf(stderr,"%10s entspricht nicht den Konventionen für Monatstage\n",argv[1]);
      exit(EXIT_FAILURE);
    }

    month = (int)strtoul(argv[2],NULL,10);
    if(month <= 0 || month > 12 || month == ERANGE){
      fprintf(stderr,"%10s ist außerhalb der Spezifikation\n",argv[2]);
      exit(EXIT_FAILURE);
    }

    year = (int)strtoul(argv[3],NULL,10);
    /* Ja, wann war das denn mit Papst Gregor jetzt genau? */
    if(year <= 1582 || year > 3333 || year == ERANGE){
      fprintf(stderr,"¿%10s? ¡No me gusta!\n",argv[2]);
      exit(EXIT_FAILURE);
    }

  }
  else{
    fprintf(stderr,"Usage: %25s Tag Monat Jahr\n",argv[0]);
    exit(EXIT_FAILURE);
  }

  printf("Der %d. %d. %d. ist ein %10s\n",
    day, month, year,
  daynames[ dayofweek(day, month, year) ] );

  /* Test desselben */
#include <locale.h>
  setlocale(LC_ALL, "" );

  snprintf(buffer,255,"%d-%d-%d",day,month,year);

  strptime(buffer,"%d-%m-%Y",&t);
  strftime(buffer,255,"Der %d. %b. %Y. ist ein %A\n",&t);

  puts(buffer);

  exit(EXIT_SUCCESS);
}

Da schimpft der Christoph auf Dinger, die er selber benutzt? Ja, sowas aber auch! ;-)

so short

Christoph Zurnieden