C++-bibliotheek met vaste punten?

Ik ben op zoek naar een gratis C++ fixed-point bibliotheek (voornamelijk voor gebruik met embedded apparaten, niet voor willekeurige precisie wiskunde). De vereisten zijn in principe:

  • Geen onnodige runtime-overhead: alles wat tijdens het compileren kan worden gedaan, moet tijdens het compileren worden gedaan.
  • Mogelijkheid om code transparant te wisselen tussen vaste en drijvende komma, zonder inherente overhead.
  • Wiskundige functies met een vast punt. Het heeft niet veel zin om een ​​vast punt te gebruiken als je heen en weer moet werpen om een ​​vierkantswortel te nemen.
  • Kleine voetafdruk.

Heeft u suggesties?


Antwoord 1, autoriteit 100%

Er is een open-source wiskundebibliotheekproject met vaste punten dat gevonden kan worden door de onderstaande links te volgen:

Het is een statische C-bibliotheek met een C++-klasse-interface voor C++-gebruikers, het implementeert de volgende functionaliteit:
Trig. Functies: sin, cos, tan, asin, acos, atan, atan2
Verzadigde rekenkunde: sadd, ssub, smul, sdiv
Andere functies: sqrt, exp

Het ondersteunt alleen 16.16 fixed-point datatype.

Het is een actief ontwikkeld open-sourceproject (op zoek naar geïnteresseerde ontwikkelaars).


Antwoord 2, autoriteit 62%

Bekijk de volgende twee goede implementaties over het omgaan met vaste-puntweergave in C++ (er zijn geen externe bibliotheken nodig).

  1. Fixed-Point-Classdoor Peter Schregle. Het implementeert ook efficiënt de basisbewerkingen zoals optellen, vermenigvuldigenen delen.

    Codevoorbeeld:

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


Antwoord 3, autoriteit 38%

Hier is een open source fixed-point bibliotheek op GitHub:

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

Het ondersteunt 32-bits en 64-bits vaste-kommagetallen (met een willekeurig quotiënt) en zowel snelle (alles is in een sjabloon, maar een beetje meer handmatig) als langzame vaste-kommagetallen (meer automatisch, maar langzamer).

Het is gericht op embedded platforms, maar ik heb het zonder problemen op zowel microcontrollers als Linux gebruikt.


Antwoord 4, autoriteit 25%

Ik heb een leuke kleine c++-header. Je kunt het vinden onder sweet::Fixed. Definieer eenvoudig typedef sweet::Fixed MyFloat; en gebruik het zoals elke andere float-waarde. Of ruil het later om het even welk type vlotter je wilt. De klasse heeft twee 64-bits waarden. Een voor het gehele deel en een voor de breuk.

Ik heb een klein vast punt c++11 class header impl in sweet.hppgenaamd vast.hpp. Het gebruikt 32-bits voor beide delen.

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

Antwoord 5

Misschien kun je de GMP- of MPFR-bibliotheken proberen. Ik ben er vrij zeker van dat ze aan je prestatiebehoeften zullen voldoen, maar misschien zijn ze te veel voor je behoeften en wil je iets lichters. Hoe dan ook, kijk hier:

GMP-bibliotheek

of hier:

MPFR-bibliotheek


6

Ik heb het nooit gebruikt spucc , maar de beschrijving claimt vaste gegevenstypen en wat wiskunde functies.

Other episodes