sin 1 ° auf dem rechner

    Eine wichtige Klarstellung - der Rechner ist normal, ohne den Sin- Button . Wie in der Buchhaltung oder auf dem Markt.

    Casio-Rechner

    Unter dem Kürzel gibt es drei verschiedene Lösungen aus verschiedenen Epochen, vom alten Samarkand bis in die USA während des Kalten Krieges.

    Einfache lösung


    Das erste , was in den Sinn kommt - , dass ein solcher Bann:

    355/113/180 = MC M + * = * MR / 6 + - = + MR =

    übersetzen die verwirrend diese Partitur für einen Rechner in eine verständlichere Sprache bc . Es wird häufig als Taschenrechner in der Befehlszeile von UNIX-ähnlichen Betriebssystemen verwendet. Wir werden so etwas wie folgendes sehen:

      scale = 7
      x = 355/113/180
      x-x^3/6
      .0174524
    

    Woher kommt es?
    Wir erweitern den Sinus in einer Reihe nahe Null, nehmen die ersten Mitglieder dieser Reihe und ersetzen ein Grad. In diesem Fall ist der Winkel klein ist , daher ist es möglich , das Polynom dritten Grades zu beschränken:

    sin (x) ≅ x - x 3 /6

    Vor Substitution Grad in Bogenmaß werden die Multiplikation mit übersetzen πund Dividieren durch 180 °.

    Ein separater Preis soll durch die seltsamen Nummern 355 und 113 auffallen. Sie wurden in unserem chinesischen Freund Zu Chunzhi (祖 祖 沖) sogar während der Qi-Dynastie (479-502) gefunden. Das Verhältnis 355/113 ist die einzige Annäherung der Zahl durch einen πrationalen Bruch, der kürzer als die Dezimaldarstellung mit ähnlicher Genauigkeit ist.


    Interessante Lösung


    Der oben beschriebene bekannte Trick tauchte erst 1715 auf. Trotzdem waren die Werte der trigonometrischen Funktionen viel früher und mit viel größerer Genauigkeit bekannt.

    Der Leiter des Samarkand-Observatoriums, Giyas ad-din Jamshid ibn Masud al-Kaschi (غیاغی الدین جمشید کاشانی), erstellte vor 1429 Tabellen mit trigonometrischen Funktionen mit einer Genauigkeit von bis zu 16 Stellen. Übersetzt von Persisch nach bc sah sein Zauber in Bezug auf unsere Aufgabe ungefähr so ​​aus:

      scale = 16
      sin30 = .5
      cos30 = sqrt(3)/2
      sin45 = sqrt(2)/2
      cos45 = sin45
      sin75 = sin30*cos45+cos30*sin45
      cos75 = sqrt(1-sin75^2)
      cos36 = (1+sqrt(5))/4
      sin36 = sqrt(1-cos36^2)
      sin72 = 2*sin36*cos36
      cos72 = sqrt(1-sin72^2)
      (sin3 = sin75*cos72-cos75*sin72)
      .0523359562429430
      (x = sin3/3)
      .0174453187476476
      (x = (sin3+4*x^3)/3)
      .0174523978055315
      (x = (sin3+4*x^3)/3)
      .0174524064267667
      (x = (sin3+4*x^3)/3)
      .0174524064372703
      (x = (sin3+4*x^3)/3)
      .0174524064372831
      (x = (sin3+4*x^3)/3)
      .0174524064372831
    

    Bitte beachten Sie, dass wir weiterhin nur Addition, Subtraktion, Multiplikation, Division und Quadratwurzel verwenden. Falls gewünscht, können alle diese Operationen im Allgemeinen an einem Stück Papier in einer Spalte durchgeführt werden. Früher wurde sogar in der Schule gelehrt, die Quadratwurzel in einer Spalte zu zählen. Das ist langweilig, aber nicht sehr schwierig.

    Was ist das für ein Schamanismus?
    Machen wir die Schritte von Al-Kashis Magie.

      sin30 = .5
      cos30 = sqrt(3)/2
      sin45 = sqrt(2)/2
      cos45 = sin45
    

    Der Sinus und der Cosinus von 30 ° und 45 ° waren den alten Griechen bekannt.

      sin75 = sin30*cos45+cos30*sin45
    

    Es gibt einen Sinus aus der Summe der Winkel 30 ° und 45 °. Noch vor al-Kashi wurde diese Formel von einem anderen persischen Astronomen abgeleitet, Abul-Wafa Muhammad ibn Muhammad ibn Yahya ibn Ismail ibn Abbas al-Buzjani.

      cos75 = sqrt(1-sin75^2)
    

    Pythagoreische Hosen sind in alle Richtungen gleich.

      cos36 = (1+sqrt(5))/4
      sin36 = sqrt(1-cos36^2)
    

    Dies ist aus dem regulären Fünfeck, auch von den alten Griechen bekannt.

      sin72 = 2*sin36*cos36
      cos72 = sqrt(1-sin72^2)
    

    Wieder der Sinus der Summe und der Satz des Pythagoras.

      (sin3 = sin75*cos72-cos75*sin72)
      .0523359562429430
    

    Wir betrachten den Sinus der Differenz 75 ° und 72 ° und erhalten einen Sinus von 3 °.

    Jetzt können Sie 3 ° in die Summe der drei Winkel von 1 ° zerlegen, aber es gibt einen Haken - wir erhalten die kubische Gleichung:

    sin 3 ° = 3 x - 4 x 3

    wobei x = sin 1 °. Niemand wusste damals, wie man kubische Gleichungen analytisch löst.

    Wise al-Kashi bemerkte, dass diese Gleichung in der folgenden Form ausgedrückt werden kann:

    f (x) = (sin 3 ° + 4 x 3 ) / 3

    und wende dann die einfache Iterationsmethode auf f (x) an . Ich erinnere mich, dass damals weder Newton noch Rafson geboren wurden.

      (x = sin3/3)
    

    Erste Annäherung.

      .0174453187476476
      (x = (sin3+4*x^3)/3)
      .0174523978055315
      (x = (sin3+4*x^3)/3)
      .0174524064267667
      (x = (sin3+4*x^3)/3)
      .0174524064372703
      (x = (sin3+4*x^3)/3)
      .0174524064372831
      (x = (sin3+4*x^3)/3)
      .0174524064372831
    

    Nach fünf Iterationen erhalten wir 16 Zeichen.


    Nach dem Rechner selbst


    Ein neugieriger Leser hat möglicherweise eine berechtigte Frage: Wie berechnet ein Taschenrechner mit einer solchen Schaltfläche den Sinuswert?

    Es stellt sich heraus, dass die meisten Taschenrechner eine vollständig dritte Methode verwenden - „ Ziffer für Ziffer “, die im Kalten Krieg im Darm des US-Militär-Industrie-Komplexes geboren wurde.

    Und hier der B-58 Bomber
    Dieser Algorithmus wurde von Jack Walder erfunden, der dann bei Convair am Navigationscomputer des oben genannten Bombers arbeitete.

    Der Hauptvorteil der ziffernweisen Methode besteht darin, dass sie nur Addition und Division durch zwei Operationen verwendet (was durch Verschieben nach rechts einfach zu implementieren ist).

    Außerdem kann der Algorithmus so eingestellt werden, dass er direkt im binären Dezimalcode funktioniert, der in den meisten Taschenrechnern verwendet wird. Im folgenden Beispiel wird dieser Dschungel jedoch nicht verwendet.

    Der Algorithmus ist iterativ und verwendet eine Arkustangens-Tabelle, eine pro Iteration. Die Tabelle muss im Voraus berechnet werden:

    #include 
    #include 
    int main(int argc, char **argv)
    {
      int bits = 32;
      int cordic_one = 1 << (bits - 2);
      printf("// Число с фиксированной точкой, соответствующее единице с плавающей точкой\n");
      printf("static const int cordic_one = 0x%08x;\n", cordic_one);
      printf("static const int cordic_table[] = {\n");
      double k = 1;
      for (int i = 0; i < bits; i++) {
        printf("0x%08x, // 0x%08x * atan(1/%.0f) \n", (int)(atan(pow(2, -i)) * cordic_one), cordic_one, pow(2, i));
        k /= sqrt(1 + pow(2, -2 * i));
      }
      printf("};\n");
      printf("static const int cordic_k = 0x%08x; // %.16f * 0x%08x\n", (int)(k * cordic_one), k, cordic_one);
    }
    

    Gleichzeitig wird ein Skalierungsfaktor berücksichtigt cordic_k.

    Danach kann die berüchtigte Sünde 1 ° wie folgt berechnet werden:

    #include 
    #include 
    // Число с фиксированной точкой, соответствующее единице с плавающей точкой
    static const int cordic_one = 0x40000000;
    static const int cordic_table[] = {
    0x3243f6a8, // 0x40000000 * atan(1/1) 
    0x1dac6705, // 0x40000000 * atan(1/2) 
    0x0fadbafc, // 0x40000000 * atan(1/4) 
    0x07f56ea6, // 0x40000000 * atan(1/8) 
    0x03feab76, // 0x40000000 * atan(1/16) 
    0x01ffd55b, // 0x40000000 * atan(1/32) 
    0x00fffaaa, // 0x40000000 * atan(1/64) 
    0x007fff55, // 0x40000000 * atan(1/128) 
    0x003fffea, // 0x40000000 * atan(1/256) 
    0x001ffffd, // 0x40000000 * atan(1/512) 
    0x000fffff, // 0x40000000 * atan(1/1024) 
    0x0007ffff, // 0x40000000 * atan(1/2048) 
    0x0003ffff, // 0x40000000 * atan(1/4096) 
    0x0001ffff, // 0x40000000 * atan(1/8192) 
    0x0000ffff, // 0x40000000 * atan(1/16384) 
    0x00007fff, // 0x40000000 * atan(1/32768) 
    0x00003fff, // 0x40000000 * atan(1/65536) 
    0x00001fff, // 0x40000000 * atan(1/131072) 
    0x00000fff, // 0x40000000 * atan(1/262144) 
    0x000007ff, // 0x40000000 * atan(1/524288) 
    0x000003ff, // 0x40000000 * atan(1/1048576) 
    0x000001ff, // 0x40000000 * atan(1/2097152) 
    0x000000ff, // 0x40000000 * atan(1/4194304) 
    0x0000007f, // 0x40000000 * atan(1/8388608) 
    0x0000003f, // 0x40000000 * atan(1/16777216) 
    0x0000001f, // 0x40000000 * atan(1/33554432) 
    0x0000000f, // 0x40000000 * atan(1/67108864) 
    0x00000008, // 0x40000000 * atan(1/134217728) 
    0x00000004, // 0x40000000 * atan(1/268435456) 
    0x00000002, // 0x40000000 * atan(1/536870912) 
    0x00000001, // 0x40000000 * atan(1/1073741824) 
    0x00000000, // 0x40000000 * atan(1/2147483648) 
    };
    static const int cordic_k = 0x26dd3b6a; // 0.6072529350088813 * 0x40000000
    void cordic(int theta, int& s, int& c)
    {
      c = cordic_k;
      s = 0;
      for (int k = 0; k < 32; ++k) {
        int d = (theta >= 0) ? 0 : -1;
        int tx = c - (((s >> k) ^ d) - d);
        int ty = s + (((c >> k) ^ d) - d);
        c = tx; s = ty;
        theta -= ((cordic_table[k] ^ d) - d);
      }
    }
    int main(void)
    {
      double alpha = M_PI / 180;
      int sine, cosine;
      cordic(alpha * cordic_one, sine, cosine);
      printf("CORDIC:   %.8f\nExpected: %.8f\n", (double)sine / cordic_one, sin(alpha));
    }
    

    Ergebnis:
    CORDIC:   0.01745240
    Expected: 0.01745241
    

    Es gibt 32 Iterationen, so dass ein kleiner Fehler bleibt. Taschenrechner verwenden normalerweise 40 Iterationen.


    Jetzt auch beliebt: