mikrocontroller.net

Forum: Compiler & IDEs Preprocessor frage ARM<->Xmega


Autor: H. R. (hacker_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
versteht einer warum ich hier 2 verschiedene Resultate kriege?
Jeweils der IAR Compiler für XMEGA und Stm32F0 ARM
es geht um folgende Zuweisung:

volatile uint32_t Temp = (u32)((357.796/ 40ul) *16777216ul);

Auf Xmega16 ist Temp = 0x08F1E4F0
Auf STM32F0 ist Temp = 0x08F1E4F7
???????

Autor: Martin B. (ratazong)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Habs mal kurz ausprobiert und wie vermutet bekomme ich Deine beiden 
ergebnisse mit nur einem Compiler.

XMEGA rechnet mit floats

#include <stdio.h>
#include <stdint.h>

void main(void)
{
double xd=357.796;
float xf=357.796;
uint32_t Temp1 = (uint32_t)((xd/ 40ul) *16777216ul);
uint32_t Temp2 = (uint32_t)((xf/ 40ul) *16777216ul);


printf("%x %x\n",Temp1,Temp2);
}

Autor: H. R. (hacker_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
passt danke

Autor: Martin B. (ratazong)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja,
man könnte noch probieren ob der STM Compiler in float rechnet, wenn man

volatile uint32_t Temp = (u32)((357.796f/ 40ul) *16777216ul);

Aber eigentlich sollte der XMEGA Preprocessor ja in double rechnen.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Martin B. schrieb:
> Aber eigentlich sollte der XMEGA Preprocessor ja in double rechnen.

Präprozessor wurde im Beispiel nicht verwendet.

avr-gcc/++ implementiert nur ein 32-Bit double und ist damit nicht 
Standard-konform, siehe "Deviations from the Standard"

http://gcc.gnu.org/wiki/avr-gcc#Deviations_from_the_Standard

Autor: Martin B. (ratazong)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Präprozessor wurde im Beispiel nicht verwendet.
>
> avr-gcc/++ implementiert nur ein 32-Bit double und ist damit nicht
> Standard-konform, siehe "Deviations from the Standard"
>
> http://gcc.gnu.org/wiki/avr-gcc#Deviations_from_the_Standard

Stimmt. Präprozessor wurde nicht verwendet.

Der Compiler kam von IAR.
Nehmen die den GCC?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin B. schrieb:
> Der Compiler kam von IAR.
> Nehmen die den GCC?

My bad.  Hab nicht richtig hingelesen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin B. schrieb:
> Aber eigentlich sollte der XMEGA Preprocessor ja in double rechnen.

Daumenregel: Zu 99.9% ist die Aussage falsch, dass der Präprozessor 
irgendwas berechnet.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Martin B. schrieb:
>> Aber eigentlich sollte der XMEGA Preprocessor ja in double rechnen.
>
> Daumenregel: Zu 99.9% ist die Aussage falsch, dass der Präprozessor
> irgendwas berechnet.

Wenn es um Gleitkomma geht, ist die Aussage zu 100% falsch.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin B. schrieb:
>> avr-gcc/++ implementiert nur ein 32-Bit double und ist damit nicht
>> Standard-konform, siehe "Deviations from the Standard"

> Der Compiler kam von IAR.

Die Erklärung dürfte trotzdem richtig sein, denn der IAR für AVR macht 
das auch so, wenn man nicht --64bit_doubles angibt.

: Bearbeitet durch User
Autor: Martin B. (ratazong)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf M. schrieb:
> A. K. schrieb:
>> Martin B. schrieb:
>>> Aber eigentlich sollte der XMEGA Preprocessor ja in double rechnen.
>>
>> Daumenregel: Zu 99.9% ist die Aussage falsch, dass der Präprozessor
>> irgendwas berechnet.
>
> Wenn es um Gleitkomma geht, ist die Aussage zu 100% falsch.

Mensch, wie kann ich das nur wieder gut machen? Hatte es schon 
zugegeben. Hoffentlich verzeiht ihr mir.

Der Praeprocessor ist unschuldig.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles gut. Nimm's nicht so schwer, kann ja jedem mal passieren ;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ging nicht nur an Rolf. Der Thread selbst heisst so.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.