2010-05-31 22 views
48

Sto cercando una libreria di punti fissi C++ gratuita (principalmente per l'uso con dispositivi embedded, non per matematica di precisione arbitraria). Fondamentalmente, i requisiti sono:Libreria a virgola fissa C++?

  • Nessun sovraccarico di runtime non necessario: tutto ciò che può essere fatto in fase di compilazione, dovrebbe essere fatto in fase di compilazione.
  • Possibilità di passare in modo trasparente il codice tra punto fisso e virgola mobile, senza sovraccarico inerente.
  • Funzioni matematiche a punti fissi. Non c'è molto punto usando il punto fisso se hai bisogno di lanciare avanti e indietro per prendere una radice quadrata.
  • Ingombro ridotto.

Qualche suggerimento?

+0

Possibile dupe: http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-math –

+6

@Pavel: Grazie. La mia domanda non è come implementare la matematica in virgola fissa, però. Lo scriverei io stesso se dovessi farlo, ma sto cercando di evitare di scrivere tutto il codice dello standard. Ecco perché sto chiedendo una soluzione pronta. Inoltre, non ho trovato alcun riferimento alle funzioni matematiche a punto fisso su altri post simili in SO. – uj2

+2

Non definirei "boilerplate" le librerie matematiche. –

risposta

-3

Forse potresti provare le librerie GMP o MPFR. Sono abbastanza sicuro che soddisferanno le tue esigenze in termini di prestazioni, ma forse sono troppo per le tue esigenze e desideri qualcosa di più leggero. Ad ogni modo, guarda qui:

GMP library

o qui:

MPFR library

+0

Belle librerie, buone associazioni C++. Ma entrambi supportano solo big int, razional e big float: non credo che supportino il punto fisso. –

+0

Il mio male, ho pensato erroneamente che volevi dire "punto fluttuante". Dovrei leggere la domanda più attentamente in futuro. Scusate. – PeterK

-3

non ho mai usato SPUC, ma i tipi di dati la descrizione affermazioni in virgola fissa e alcune funzioni matematiche.

+2

Vedo menzionare "interi a larghezza fissa" sul sito, ma non valori a virgola fissa. Puoi indicarmi la parte fissa della libreria? –

+0

@BrooksMoses: sono la stessa cosa. Larghezza fissa significa che è possibile specificare la posizione del punto decimale, che quindi rimane in quella posizione fissa attraverso tutta la matematica. – mtrw

+2

Ne sei sicuro? Sto osservando il nucleo della loro implementazione di "interi a larghezza fissa" in http://spuc.cvs.sourceforge.net/viewvc/spuc/spuc/generic/int_s.h?view=markup, e sembra un implementazione di interi con ampiezze specifiche a sinistra del punto decimale (quindi i bit rimanenti nel tipo sottostante "lungo" vengono semplicemente mascherati), non di numeri a virgola fissa. Il punto di riferimento è che non c'è ridimensionamento della moltiplicazione, come mi aspetterei se il punto decimale non fosse nella parte destra del numero. –

6

C'è un progetto open-source libreria matematica punto che si può trovare seguendo i link qui sotto fisso:

È una libreria statica C con un'interfaccia di classe C++ per utenti C++, implementa le seguenti funzionalità: Trig. Funzioni: sin, cos, tan, asin, acos, atan, atan2 saturo aritmetiche: Sadd, ssub, Smul, SDIV Altre funzioni: sqrt, exp

Supporta solo 16.16 fixed-point datatype.

È un progetto open source attivamente sviluppato (in cerca di sviluppatori interessati).

+3

perché supporta solo Q16.16? quindi il valore massimo è 65536. Non abbastanza per molti casi. – javapowered

+0

16.16 è il più comune, è improbabile che venga utilizzato su 32 bit se si utilizza il punto fisso per motivi di prestazioni (non conosco alcun microcontrollore a 64 bit). Ci sono altri formati minori come 24.8 o 8.24 e immagino un gran numero di formati dispari, ma se sei nella fase di averne bisogno allora probabilmente devi solo scrivere il codice a mano (come faccio normalmente). – flatmush

+0

URL guasto ...... – Cuadue

1

Ho ottenuto una piccola intestazione C++. Puoi trovarlo sotto sweet::Fixed. Basta definire typedef sweet :: Fixed MyFloat; e usarlo come qualsiasi altro valore float. O scambiarlo con qualsiasi tipo di float che desideri in seguito. La classe ha due valori a 64 bit. Uno per la parte intera e avanti per la frazione.

Ho un piccolo punto fisso C++ 11 classe header impl in sweet.hpp chiamato fixed.hpp. Usa 32 bit per entrambe le parti.

typedef float MyFloat;   // This will feel the same 
typedef sweet::Fixed MyFloat; // like this 
5

Dai un'occhiata alle seguenti due buone implementazioni sulla gestione della rappresentazione a virgola fissa in C++ (non sono necessarie librerie esterne).

  1. Fixed-Point-Class di Peter Schregle. Implementa anche efficientemente le operazioni di base come addizione, moltiplicazione e divisione.

    Codice esempio:

    #include <fixed_point.h> 
    using namespace fpml; 
    
    main() 
    { 
        fixed_point<int, 16> a = 256; 
        fixed_point<int, 16> b = sqrt(a); 
    } 
    
  2. Implementing Fixed-Point Numbers in C++ da Khuram Ali.

1

Ecco una libreria open source-punto fisso su GitHub:

https://github.com/mbedded-ninja/MFixedPoint

Esso supporta numeri a 32 bit e 64 bit a virgola fissa (con un quoziente arbitrario) e sia veloce (tutto è basato sui modelli, ma un po 'più manuale) e numeri a virgola fissa lenti (più automatici, ma più lenti).

È orientato verso piattaforme embedded, tuttavia l'ho usato su entrambi i microcontrollori e Linux senza problemi.

Problemi correlati