home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / EFFO / forum13.lzh / LETTERS / brief.boenigk < prev    next >
Text File  |  1990-09-04  |  8KB  |  265 lines

  1. Reinhard Boenigk
  2. Theodor-Heuss-Strasse 20
  3. D-4400 Muenster
  4. Tel. 0251/619267
  5.  
  6.                                              Muenster, 25.05.1990
  7.  
  8.  
  9. Betr.:  EFFO-Forumsdisketten; dies u. das.
  10. ------------------------------------------
  11.  
  12. Sehr geehrter Herr Schiele,
  13.  
  14. Ich hatte vor einiger Zeit von EFFO die grundlegenden Informa-
  15. tionen erhalten: herzlichen Dank auch!
  16.  
  17. Ich benutze OS-9 auf dem mc68000, Board II, Grafik-System von VCS
  18. Muenchen, in einigen Tagen auch mit 68020/68881-Karte. BS-Version
  19. ist z.Zt. V2.3.
  20. << Wie waer's mit einer kleinen Beschreibung des Grafik-Systems von
  21. VCS Muenchen? Sie sind der erste Besitzer, der sich bei uns bemerkbar
  22. gemacht hat. Ueber was fuer Erfahrungen koennen Sie berichten?
  23. Wie bewaehrt sich die Software unter OS-9? TGS >>
  24.  
  25. Professionelle Programme erstelle ich nicht - bin nur ein "Hob-
  26. byist", obgleich ich Informatik unterrichte :-).
  27. Daher habe ich auch leider nichts anzubieten, was von allge-
  28. meinem Interesse sein koennte. Allerdings arbeite ich, sofern mir
  29. mein Beruf Zeit laesst, u.a. an einem Zufallszahlengenerator fuer
  30. den OS-9 C Compiler; die Arbeit ist aber noch lange nicht been-
  31. det. Dabei fiel aber eine Arbeit an, die ich in dieser Form nur
  32. als geschriebenen Text beilegen kann (s. Anlage). Vorsichtshal-
  33. ber sind die entsprechenden, voellig undokumentierten C-Sourcen
  34. auch auf einer der beiden beigelegten Disketten. Ggf. wuerde ich
  35. auch den gedruckten Text an Interessenten versenden.
  36.  
  37. << Aus der Einfuehrung der 11 Seiten umfassenden Dokumentation:
  38.  
  39.    "Das Modul 'chiquadrat.c' enthaelt Implementierungen von drei
  40.    Funktionen, die sich auf die in der Statistik verwendete
  41.    chi^2-Funktion beziehen:
  42.    1. flaechechiq(): Berechnung der Flaeche unter einer chi^2-Kurve
  43.       von null bis zu einem gegebenen chi^2-Wert.
  44.    2. suchchiq(): Berechnung des chi^2-Wertes fuer eine gegebene
  45.       Flaeche.
  46.    3. f_von_chiq(): Berechnung des Funktionswertes f(chi^2)."
  47.  
  48. Wir haben beschlossen, die 'voellig undokumentierten C-Sourcen'
  49. diesem Brief ausnahmsweise als Postskriptum anzufuegen, da sie
  50. nur 175 Zeilen umfassen. Ohne Dokumentation und Anwendungsbeispiele
  51. ist der Quellcode als eigenstaendiger Beitrag noch nicht geeignet.
  52. Allfaellige Interessenten werden gebeten, direkt mit dem Autor
  53. Kontakt aufzunehmen. TGS >>
  54.  
  55. Um EFFO zu unterstuetzen, moechte ich ein sog. ordentliches Mit-
  56. glied werden, bitte also um Uebersendung eines Antragformulars
  57. o. ae.
  58. Anbei zwei formatierte Disketten fuer die Forums-Beitraege; auch
  59. die vorhergehenden Forums-Disketten waeren fuer mich interessant,
  60. so dass ich um Informationen ueber die Beschaffungsmodalitaeten
  61. bitte.
  62. Wenn ich wuesste wie, uebernaehme ich gern die Portokosten usf. fuer
  63. die Ruecksendung der Disketten...
  64. << Bitte die Unterverzeichnisse EFFO und INFO der Forumsrunden
  65. beachten. Dort sind (fast) alle lebenswichtigen Informationen
  66. ueber EFFO zu finden, wie z.B. die Vereinsstatuten, ein Antrags-
  67. formular fuer die Mitgliedschaft, "Beschaffungsmodalitaeten" fuer
  68. alte Forumsrunden oder PD Disks und sogar der Name unseres
  69. demokratisch gewaehlten Praesidenten. TGS >>
  70.  
  71. Uebrigens habe ich eine TEX-Version fuer OS-9 erworben - die Por-
  72. tierung ist von Dipl.-Kaufmann Norbert Kuehne, Blostwiete 1,
  73. D-2000 Hamburg 74, Tel. 040/655 35 13 (innerhalb BRD).
  74. Noch hatte ich keine Zeit, diese nicht-PD-Software ausfuehrlicher
  75. zu testen, da der Druckertreiber fuer meinen STAR SG 15 nicht
  76. korrekt funktionierte. Z.Zt. durchforste ich den zugehoerigen
  77. Quellcode zwecks Fehlersuche/Anpassung.
  78. << Wir klaeren zur Zeit ab, ob und wie wir in Zukunft TeX bzw. LaTeX
  79. und METAFONT unterstuetzen werden. Falls es klappt, dann wird
  80. natuerlich nur eine Version zur freien Weitergabe vertrieben. TGS >>
  81.  
  82. So, das soll fuer's erste genuegen,
  83. mit freundlichen Gruessen
  84.  
  85. Reinhard Boenigk
  86.  
  87.  
  88. << PS: Hier der versprochene Quellcode... TGS >>
  89.  
  90. #define GRENZE -14.
  91.  
  92. typedef char ZEILE[50];
  93. typedef ZEILE TEXT[10];
  94.  
  95. static TEXT text = { "\x7\x1bR2function: ",
  96.                      "\n\n\x1bR0",
  97.                      "\nUnzul{ssiger Wert ",
  98.                      " f}r Freiheitsgrade!\n",
  99.                       " f}r chiquadrat!\n",
  100.                      " f}r die Fl{che!\n",
  101.                      " Die Fl{che ist nicht berechenbar (unendlich)!\n",
  102.                      "Zul{ssig: Freiheitsgrade > 0.",
  103.                      "Zul{ssig: chiquadrat >= 0.",
  104.                      "Zul{ssig: 0 <= Fl{che <= 1."
  105.                    };
  106.  
  107. double flaechechiq(chiq,f)
  108. int f;
  109. double chiq;
  110. {
  111.     register int i,j,k,zaehler1,zaehler2;
  112.     double summe,summealt,ergebnis,divisor1,divisor2,grenze,
  113.            vorkomma,nachkomma,faktor,summand;
  114.     if (f < 1) {
  115.         fprintf(stderr,"%sflaechechiq():%s%d%s%s%s",
  116.                             text[0],text[2],f,text[3],text[7],text[1]);
  117.         return (-1.);
  118.     }
  119.     if (chiq < 0.) {
  120.         fprintf(stderr,"%sflaechechiq():%s%G%s%s%s",
  121.                             text[0],text[2],chiq,text[4],text[8],text[1]);
  122.         return (-1.);
  123.     }
  124.     if (chiq == 0.) return (chiq);
  125.     if (f % 2)    zaehler1 = (f-1) / 2;
  126.     else zaehler1 = f/2;
  127.     nachkomma = modf(-chiq/2.,&vorkomma);
  128.     zaehler2 = abs((long)vorkomma);
  129.     faktor = exp(-1.);
  130.     divisor1 = (double)f;
  131.     ergebnis = 1;
  132.     i = j = k = 0;
  133.     while (i++ < zaehler1) {
  134.         ergebnis *= chiq;
  135.         while ((ergebnis > 1.) && (j++ < zaehler1)) {
  136.             ergebnis /= divisor1;
  137.             divisor1 -= 2.;
  138.         }
  139.         while ((ergebnis > 1.) && (k++ < zaehler2))    ergebnis *= faktor;
  140.         while ((ergebnis < .1) && (chiq * ergebnis < 1.) && 
  141.                                                     (i++ < zaehler1)) {
  142.             ergebnis *= chiq; 
  143.             if (ergebnis == 0.) return (0.);
  144.         }
  145.     }
  146.     ergebnis *= exp(nachkomma);
  147.     if (f % 2) ergebnis *= sqrt(2.* chiq / PI);
  148.     grenze = pow(10.,GRENZE);
  149.     summe = summand = 1.; divisor2 = (double)(f+2);
  150.     do {
  151.         summealt = summe;
  152.         summand *= chiq/divisor2;
  153.         summe +=  summand;
  154.         while ((summe > 1.) && (j++ < zaehler1)) {
  155.             summe /= divisor1; summand /= divisor1; 
  156.             summealt /= divisor2; divisor1 -= 2.;
  157.         }
  158.         while ((summe > 1.) && (k++ < zaehler2)) {
  159.             summe *= faktor; summand *= faktor; summealt *= faktor;
  160.         }
  161.         divisor2 += 2.;
  162.     }
  163.     while (summe - summealt > grenze);
  164.     ergebnis *= summe;
  165.     while (j++ < zaehler1) {
  166.         ergebnis /= divisor1; divisor1 -= 2.;
  167.     }
  168.     while (k++ < zaehler2) ergebnis *= faktor;
  169.     return ((ergebnis > 1.) ? 1. : ergebnis);
  170. }
  171.         
  172. double suchchiq(wunsch,f)
  173. double wunsch;
  174. int f;
  175. {
  176.     double mfl,add,links,rechts,mitte,grenze,help;
  177.     if (f < 1) {
  178.         fprintf(stderr,"%ssuchchiq():%s%d%s%s%s",
  179.                         text[0],text[2],f,text[3],text[7],text[1]);
  180.         return (-1.);
  181.     }
  182.     if ((wunsch < 0.) || (wunsch > 1.)) {
  183.         fprintf(stderr,"%ssuchchiq():%s%G%s%s%s",
  184.                     text[0],text[2],wunsch,text[5],text[9],text[1]);
  185.         return (-1.);
  186.     }
  187.     grenze = pow(10.,GRENZE);
  188.     if ((wunsch == 0.) || (flaechechiq(grenze,f) >= wunsch)) return (0.);
  189.     links = grenze;
  190.     if (f == 1) rechts = .455;
  191.     else if (f == 2) rechts = 1.39;
  192.     else rechts = f - 2;
  193.     add = rechts;
  194.     while (flaechechiq(rechts,f) < wunsch) {
  195.         links = rechts; rechts += add;
  196.     }
  197.     mitte = 0;
  198.     while (1) {
  199.         help = mitte;
  200.         mitte = (links + rechts)/2.;
  201.         if ((mitte - links <= grenze) || (help == mitte)) return mitte;
  202.         mfl = flaechechiq(mitte,f);
  203.         if (wunsch > mfl) links = mitte;
  204.         else rechts = mitte;
  205.     }
  206.     return mitte;
  207. }
  208.  
  209. double f_von_chiq(chiq,f)
  210. double chiq;
  211. int f;
  212. {
  213.     register int i,j,k,zaehler1,zaehler2;
  214.     double ergebnis,divisor,vorkomma,nachkomma,faktor;
  215.     if (f < 1) {
  216.         fprintf(stderr,"%sf_von_chiq():%s%d%s%s%s",
  217.                             text[0],text[2],f,text[3],text[7],text[1]);
  218.         return (-1.);
  219.     }
  220.     if (chiq < 0.) {
  221.         fprintf(stderr,"%sf_von_chiq():%s%G%s%s%s",
  222.                         text[0],text[2],chiq,text[4],text[8],text[1]);
  223.         return (-1.);
  224.     }
  225.     if ((chiq == 0.) && (f == 1)) {
  226.         fprintf(stderr,"%sf_von_chiq():%s%s",text[0],text[6],text[1]);
  227.         return (-1.);
  228.     }
  229.     if ((chiq == 0.) && (f != 2)) return (0.);
  230.     if ((chiq == 0.) && (f == 2)) return (.5);
  231.     if (f % 2) {
  232.         if (f == 1) return (1./sqrt(2.*PI*chiq)/exp(chiq/2.));
  233.         zaehler1 = (f-3)/2; ergebnis = sqrt(chiq/2./PI);
  234.     }
  235.     else {
  236.         if (f == 2) return (.5/exp(chiq/2.));
  237.         zaehler1 = f/2 - 1; ergebnis = .5;
  238.     }
  239.     nachkomma = modf(-chiq/2.,&vorkomma);
  240.     ergebnis *= exp(nachkomma);
  241.     zaehler2 = abs((long)vorkomma);
  242.     faktor = exp(-1.);
  243.     divisor = (double)f - 2.;
  244.     k = i = j = 0;
  245.     while (i++ < zaehler1) {
  246.         ergebnis *= chiq;
  247.         while ((ergebnis > 1.) && (j++ < zaehler1)) {
  248.             ergebnis /= divisor; divisor -= 2.;
  249.         }
  250.         while ((ergebnis > 1.) && (k++ < zaehler2))
  251.             ergebnis *= faktor;
  252.         while ((ergebnis < .1) && (chiq * ergebnis < 1.) && 
  253.                                                     (i++ < zaehler1)) {
  254.             ergebnis *= chiq; 
  255.             if (ergebnis == 0.) return (0.);
  256.         }
  257.     }
  258.     while (j++ < zaehler1) {
  259.         ergebnis /= divisor; divisor -= 2.;
  260.     }
  261.     while (k++ < zaehler2) ergebnis *= faktor;
  262.     return ergebnis;
  263. }
  264.  
  265.