PIC32MX370 - Multiplikation

Gast #5146572
Lesenswert?
• ▲
▼
Hallo,

ich habe ein kleines Problem:

Meiner Logik nach müsste eigentlic die folgende Zeile
1
    int64_t result = a * b;

das gleiche Ergebnis liefern, wie
1
     int64_t result = (int64_t)a * (int64_t)b;

Das ist aber in der Praxis nicht so, die obere Zeile liefert:
2147272840 * -812214784 = -1792036864 = falsch
In Hex: 0xFFFFFFFF952FB000

Laut Handbuch hat der Multiplizierer des PIC das vollständige Ergebnis 
aber berechnet : 32x32bit liefert ein 64Bit Ergebnis, welches der 
Compiler nur lesen muss.

Wie teile ich dem Compiler mit, dass er sich das 64-Bit Ergebnis holen 
soll, ohne die Multiplikation in 64Bit machen zu müssen?
Das klappt natürlich, macht die Sache aber langsam. Was wehtut, weil ich 
das für Filter benötige.
#5146588
Lesenswert?
• ▲
▼
int a, b;
int64_t result = a * b;
ist auf einer Maschine mit 32 Bit "int" eine 32-Bit Multiplikation, 
keine 64-Bit Multiplikation. Der Typ des Ergebnisses des "*" Operators 
ist nicht vom Typ links von "=" abhängig, sondern nur vom Typ der 
Operanden.

Der Rest hängt vom Compiler ab. Vielleicht gibts ein Builtin, vielleicht 
ist es der GCC und dann gehts per asm Statement.
Gast #5146663
Lesenswert?
• ▲
▼
A. K. schrieb:
> int a, b;
> int64_t result = a * b;
> ist auf einer Maschine mit 32 Bit "int" eine 32-Bit Multiplikation,
> keine 64-Bit Multiplikation. Der Typ des Ergebnisses des "*" Operators
> ist nicht vom Typ links von "=" abhängig, sondern nur vom Typ der
> Operanden.

Danke!
Auf die Idee, sich durch die Hilfe des Compilers zu wühlen, bin ich in 
einem Anfall geistiger Umnachtung natürlich nicht gekommen.

Die Hilfe hat folgendes zu sagen:
"To multiply 32 bits by 32 bits to obtain a 64-bit result, cast the 
32-bit integer to a 64-bit integer (long long) and then perform the 
multiplication operation as follows"
1
Ex:
2
  long long test (int a, int b)
3
  {
4
    return (long long) a * b;
5
    // Same as (long long) a * (long long) b
6
    // NOT the same as (long long) (a * b)
7
  }

Blos: Das ist das, was ich ja schon habe.  Anscheinend multipliziert er 
weiter 64Bit (siehe Anhang). Vermutlich deshalb, weil Optimierungsstufe 
1 beim XC32 das Maximum bei der freien Version ist.

Bleibt mir der inline-Assembler. Da muss ich mich erst mal hinsetzen, 
und mir das ansehen. Allerdings hat allein die Compileroptimierung schon 
die Rechenzeit auf 40% heruntergedrückt. Möglicherweise reicht das für 
meine Anwendung ja aus ;-)
Angehängte Dateien:
Beitrag #5146680 wurde von einem Moderator gelöscht.
#5146960
Lesenswert?
• ▲
▼
Hurra schrieb:
> A. K. schrieb:
>> int a, b;
>> int64_t result = a * b;
>> ist auf einer Maschine mit 32 Bit "int" eine 32-Bit Multiplikation,
>> keine 64-Bit Multiplikation. Der Typ des Ergebnisses des "*" Operators
>> ist nicht vom Typ links von "=" abhängig, sondern nur vom Typ der
>> Operanden.
>
> Danke!
> Auf die Idee, sich durch die Hilfe des Compilers zu wühlen, bin ich in
> einem Anfall geistiger Umnachtung natürlich nicht gekommen.

Hättest Du auch nicht machen müssen. Im C-Standard steht es auch drin. 
Das ist das in C so definierte Veralten und nichts XC32 oder gcc 
spezifisches.

fchk

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.