mikrocontroller.net

Forum: Compiler & IDEs zum leidigen Thema double


Autor: Michael Korb (michaelkorb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gleich vorweg, ich möchte keine erneute Diskussion zum Thema double 
anzetteln. Trotzdem habe ich das Problem, dass ich mit einem externen 
Steuerrechner fest definierte Datenstrukturen austauschen muss, die zum 
größten Teil aus 8-Byte-double Feldern bestehen.
Für die interne Rechnerei würde auch 4Byte-double reichen.

Leider ist in AVR-Studio (gcc) der double- und auch der real- Typ nur 
mit 4Byte definiert. Bisher konnte ich auch keine Compilereinstellung 
finden, die 8Byte zuläßt.
Ausserdem funktioniert sprintf auf double und real mit %f nicht. Da wird 
ein ? geliefert. Hat jemand eine Ahnung was das bedeutet?

Für Tipps bezüglich 8Byte double wäre ich sehr dankbar. Gibt es 
vielleicht doch einen Compilerschalter oder einen anderen Compiler, der 
das kann?

Autor: Francesco Na (franceso-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn das hier fuer echten double gedacht ist, kann dieser Code
als basis dienen.
/*
 * C O N V E R T   F R O M   I E E E   E X T E N D E D  
 */

/* 
 * Copyright (C) 1988-1991 Apple Computer, Inc.
 * All rights reserved.
 *
 * Machine-independent I/O routines for IEEE floating-point numbers.
 *
 * NaN's and infinities are converted to HUGE_VAL or HUGE, which
 * happens to be infinity on IEEE machines.  Unfortunately, it is
 * impossible to preserve NaN's in a machine-independent way.
 * Infinities are, however, preserved on IEEE machines.
 *
 * These routines have been tested on the following machines:
 *    Apple Macintosh, MPW 3.1 C compiler
 *    Apple Macintosh, THINK C compiler
 *    Silicon Graphics IRIS, MIPS compiler
 *    Cray X/MP and Y/MP
 *    Digital Equipment VAX
 *
 *
 * Implemented by Malcolm Slaney and Ken Turkowski.
 *
 * Malcolm Slaney contributions during 1988-1990 include big- and little-
 * endian file I/O, conversion to and from Motorola's extended 80-bit
 * floating-point format, and conversions to and from IEEE single-
 * precision floating-point format.
 *
 * In 1991, Ken Turkowski implemented the conversions to and from
 * IEEE double-precision format, added more precision to the extended
 * conversions, and accommodated conversions involving +/- infinity,
 * NaN's, and denormalized numbers.
 */

#ifndef HUGE_VAL
# define HUGE_VAL HUGE
#endif /*HUGE_VAL*/

# define UnsignedToFloat(u)         (((double)((long)(u - 2147483647L - 1))) + 2147483648.0)

/****************************************************************
 * Extended precision IEEE floating-point conversion routine.
 ****************************************************************/

double ConvertFromIeeeExtended(bytes)
unsigned char *bytes;  /* LCN */
{
    double    f;
    int    expon;
    unsigned long hiMant, loMant;
    
    expon = ((bytes[0] & 0x7F) << 8) | (bytes[1] & 0xFF);
    hiMant    =    ((unsigned long)(bytes[2] & 0xFF) << 24)
            |    ((unsigned long)(bytes[3] & 0xFF) << 16)
            |    ((unsigned long)(bytes[4] & 0xFF) << 8)
            |    ((unsigned long)(bytes[5] & 0xFF));
    loMant    =    ((unsigned long)(bytes[6] & 0xFF) << 24)
            |    ((unsigned long)(bytes[7] & 0xFF) << 16)
            |    ((unsigned long)(bytes[8] & 0xFF) << 8)
            |    ((unsigned long)(bytes[9] & 0xFF));

    if (expon == 0 && hiMant == 0 && loMant == 0) {
        f = 0;
    }
    else {
        if (expon == 0x7FFF) {    /* Infinity or NaN */
            f = HUGE_VAL;
        }
        else {
            expon -= 16383;
            f  = ldexp(UnsignedToFloat(hiMant), expon-=31);
            f += ldexp(UnsignedToFloat(loMant), expon-=32);
        }
    }

    if (bytes[0] & 0x80)
        return -f;
    else
        return f;
}


Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>die zum größten Teil aus 8-Byte-double Feldern bestehen.
du übernimmst die doch nicht etwa binär???

arbeite im AVR mit 4 Byte double und übergib es als ASCII.
>Ausserdem funktioniert sprintf auf double und real mit %f nicht.
möglicherweise hast du vergessen die floating point library zu linken.

>inen anderen Compiler, der das kann?
IAR

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Fragezeichen wird von der schlankeren nicht-float-printf-Library 
ausgegeben; Du musst nur die fettere float-unterstützende printf-Library 
verwenden und schon geht's. Überprüfe die Linkereinstellungen bzw. die 
gelinkten Libraries.

Eine manuelle Konvertierung von double nach float müsste mit partiellem 
Kopieren der höchstwertigen Bits der Mantisse und Bitschieben des 
Exponenten möglich sein; Du solltest Dir mal die binäre Repräsentation 
der entsprechenden Formate ansehen. Natürlich ist der Wertebereich von 
float gegenüber double beschränkt, bei zu großen Exponenten musst Du Dir 
also eine sinnvolle Fehlerbehandlung einfallen lassen.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Francesco: das ist eine Konvertierung von 80Bit nach 64 Bit

aber was ist denn das?
>double ConvertFromIeeeExtended(bytes)
>unsigned char *bytes;  /* LCN */
>{
funktion Convert... gibt double zurück hat als Parameter bytes 
unbekannter Typ
in Fkt. wird lokale Variable (pointer) bytes auf char definiert
oder interpretiere ich da was falsch?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> double ConvertFromIeeeExtended(bytes)
>> unsigned char *bytes;  /* LCN */
>> {
> funktion Convert... gibt double zurück hat als Parameter bytes
> unbekannter Typ
> in Fkt. wird lokale Variable (pointer) bytes auf char definiert
> oder interpretiere ich da was falsch?

Das ist altes K&R C

im neueren ANSI C würde es heissen:

double ConvertFromIeeeExtended( unsigned char* bytes )
{
  ...

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Erklärung, hatte schon so ne Ahnung...

Autor: Michael Korb (michaelkorb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfram wrote:
> möglicherweise hast du vergessen die floating point library zu linken.
Ich habe die Lib libprintf_flt.a unter Librarys in den 
Projekteinstellungen übernommen - keine Änderung.

> IAR
Was kostet das Teil?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Korb wrote:

> Ich habe die Lib libprintf_flt.a unter Librarys in den
> Projekteinstellungen übernommen - keine Änderung.

AVR Studio bietet keine sehr nutzerfreundliche Bedienerführung für
diese Art Einstellung.  <Werbung>Mfile ist da besser.</Werbung>

Du musst noch -Wl,-u,vfprintf in die Optionen aufnehmen (vor allen
Bibliotheken).

>> IAR

> Was kostet das Teil?

Mehr als ein gebrauchtes Auto.  Offizielle Preise wirst du nur vom
IAR Salesdroiden deines geringsten Misstrauens erfahren.

Autor: Michael Korb (michaelkorb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> Du musst noch -Wl,-u,vfprintf in die Optionen aufnehmen (vor allen
> Bibliotheken).

Compileroption oder Linkoption?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Linker.

Autor: Michael Korb (michaelkorb)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
klappt nicht.
Hab mal als externes Makefile exportiert - s. Anhang.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-uvfprintf

ist eine Option

Nochmal zum Mitschreiben:
AVR Studio, Project Configuration

'Libraries' anwählen:

   libprintf_flt.a    'Add Library'
   libc.a             'Add Library'

'Custom Options' anwählen:

   Linker Options auswählen

      -uvfprintf   'Add'


'OK'

Die Reihenfolge der Libraries scheint wichtig zu sein.
Wenn man die umdreht, gehts nicht mehr.

Autor: Michael Korb (michaelkorb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, jetzt hab ichs gerafft und es funzt.

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.