MPIR (gmp) zeigt Fehler im Header (erledigt)



  • Ich möchte gmpxx.h usw. einsetzen bei meinen MS VC++ Projekten (MSVS 2015). Dazu habe ich mir MPIR 2.7.0 herunter geladen und gebaut. In einem Verzeichnis habe ich nun gmpxx.h, mpirxx.h, mpir.lib, mpir.dll usw.
    Die Include-/Lib-Verzeichnisse habe ich dem Projekt unter Eigenschaften hinzugefügt. Die Header-datei wird gefunden.

    Beim probeweisen Kompilieren von

    #include "stdafx.h"
    #include <cstdio>
    #include <cstdlib>
    #include <gmpxx.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    
    	mpz_class answer_a = 226153980;
    	mpz_class answer_b = 1766319049;
    
    	if ((61 * answer_a*answer_a + 1) == (answer_b * answer_b))
    		cout << "Euler was right!\n";
    	else
    		cout << "Oooops.  My math package has failed me.\n";
    
    }
    

    kommen folgende Fehler/Warnings:
    gmpxx.h(121): error C4146: Einem vorzeichenlosen Typ wurde ein unärer Minus-Operator zugewiesen. Das Ergebnis ist weiterhin vorzeichenlos.
    (mehrfaches Auftreten)
    gmpxx.h(1674): warning C4800: "int": Variable wird auf booleschen Wert ("True" oder "False") gesetzt (Auswirkungen auf Leistungsverhalten möglich)
    (mehrfaches Auftreten)

    Alle meldungen: http://pastebin.com/tavLaLwk

    Wie komme ich darüber hinweg? Im Netz finde ich leider bisher nichts dazu.

    Eine bemängelte Zeile sieht z.B. so aus:

    __mpz_set_ui_safe(p, -static_cast<mpir_ui>(l));
    

    Es dürfte wohl diese Minuszeichen vor static... sein.



  • Das ist mir auch schon aufgefallen mit MPIR. Ich hab den Fehler einfach deaktiviert in den Projekteinstellungen. Keine Ahnung was die sich bei der Zeile gedacht haben.



  • Ich hab den Fehler einfach deaktiviert in den Projekteinstellungen.

    Wie geht denn das? Habe ich bisher noch nicht nötig gehabt. 😃



  • In den Projekteinstellungen C/C++ -> Advanced -> Disabled Specific Warnings und dort einfach die Nummer (also 4146) eintragen.



  • aha, warnings, OK, klappt. danke!



  • Bei der Zeile wollte jemand schlau sein vermute ich. So sieht z.B. eine der Funktion aus:

    inline void __mpz_set_si_safe(mpz_ptr p, mpir_si l)
    {
      if(l < 0)
      {
        __mpz_set_ui_safe(p, -static_cast<mpir_ui>(l));
        mpz_neg(p, p);
      }
      else
        __mpz_set_ui_safe(p, l);
        // Note: we know the high bit of l is 0 so we could do slightly better
    }
    

    Als ich das gerade gelesen habe war ich mir sicher, dass das Minus in den Cast gehört. Dann habe ich mich gefragt was ein Minus überhaupt bei unsigned Typen macht und gemerkt, dass wenigstens noch das rauskommt was man erwartet. Nach noch mehr Überlegen bin ich jetzt der Meinung, dass der original Code sogar die korrektere Variante ist. Man stelle ich vor l ist der kleinste von mpir_si darstellbare Wert. Dieser Wert ist aber als positive Zahl nicht mehr darstellbar weil im Zweierkomplement die positiven Zahlen eins weniger sind. Es gibt also einen signed Integer Overflow der streng genommen nicht definiert ist. Wenn man erst zu unsigned castet passt alles und unsigned Overflows sind wohldefiniert.



  • Aber errors unterdrücken, das ist schon übel. Gib mal W4 ein. 😃

    Ich bin aber froh, dass ich MPIR / GMP nun auf Windows mit MS VS zum Laufen bekommen habe. Die Berechnungen sind wirklich schnell, für meine Untersuchungen zu Mersenne-Primzahlen, Goldbachvermutung, Collatz essentiell.


Anmelden zum Antworten