Skip to content

Simple header-only library for Fixed-Point Number operations

License

Notifications You must be signed in to change notification settings

CW-B-W/FixedPointNumberLibrary

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

77 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FixedPointNumberLibrary

Simple C++ header-only library for Fixed-Point Number operations

C version here, designed to be compact

Main files

  • include/FixedPointNumber.hpp
    • the header-only library of class FixedPointNumber
  • src/FixedPointNumberTest.cpp
    • the test of class FixedPointNumber
  • src/FixedPointNumberDemo.cpp
    • the demo of 1D-convolution using class FixedPointNumber
    • more examples will be listed below
  • makefile

Usage

Include library

#include "FixedPointNumber.hpp"

MUST be compiled with C++17 or above, e.g.,

g++ YourCPP.cpp --std=c++17

Create a FixedPointNumber object

  • sign_bit is always of width 1
  • int_bits is the width of integer part bits
  • frac_bits is the width of fraction part bits

The below example instantiates a FixedPointNumber which has

  • 1bit sign-bit
  • Xbits int-bit
  • Ybits frac-bit
FixedPointNumber<X, Y> fp(...);

And the constructor arguments can be of type

  • uint32_t
  • int32_t
  • double
  • FixedPointNumber<V, W>
    • This will construct this FixedPointNumber<X, Y> from the value of another object which is a FixedPointNumber<V, W>

e.g.

FixedPointNumber<3, 16> fp1(0xFFF9EU);
FixedPointNumber<7, 8>  fp2(0x0067);
FixedPointNumber<7, 8>  fp3(1.2345678);
FixedPointNumber<3, 16> fp4(fp3);
// support operator=
FixedPointNumber<3, 16> fp5 = 1.2345678;
FixedPointNumber<3, 16> fp6 = fp1;

Functions

  • to_double
FixedPointNumber<3, 16> fp(3.14159265359);
cout << setprecision(10) << fp.to_double() << endl;
// output:
// 3.141586304
  • get_value
FixedPointNumber<7, 8> fp(0x1234);
cout << "0x" << hex << fp.get_value() << endl;
// output:
// 0x1234
  • operator- (negative)
FixedPointNumber<3, 16> fp(3.14159265359);
cout << setprecision(10) << (-fp).to_double() << endl;
// output:
// -3.141586304
  • operator+
FixedPointNumber<3, 16> fp1(3.14159265359);
FixedPointNumber<3, 16> fp2(2.71828182846);
cout << setprecision(10) << (fp1+fp2).to_double() << endl;
FixedPointNumber<3, 16> fp3(3.14159265359);
FixedPointNumber<7, 8>  fp4(2.71828182846);
cout << setprecision(10) << (fp3+fp4).to_double() << endl; // result will be FixedPointNumber<3, 16>
cout << setprecision(10) << (fp4+fp3).to_double() << endl; // result will be FixedPointNumber<7, 8>
// output:
// 5.859863281
// 5.856430054
// 5.85546875
  • operator*
FixedPointNumber<7, 8>  fp1(3.14159265359);
FixedPointNumber<7, 8>  fp2(2.71828182846);
cout << setprecision(10) << (fp1*fp2).to_double() << endl;
FixedPointNumber<7, 8>  fp3(3.14159265359);
FixedPointNumber<5, 10> fp4(2.71828182846);
cout << setprecision(10) << (fp3*fp4).to_double() << endl; // result will be FixedPointNumber<7, 8>
cout << setprecision(10) << (fp4*fp3).to_double() << endl; // result will be FixedPointNumber<5, 10>
// output:
// 8.5234375
// 8.5234375
// 8.53515625
  • operator<<
FixedPointNumber<7, 8> fp1(0x1234);
cout << fp1 << endl;
cout << fp1.to_double() << endl;
FixedPointNumber<7, 8> fp2(18.203125);
cout << fp2 << endl;
cout << fp2.to_double() << endl;
// output:
// 0x1234
// 18.203125
// 0x1234
// 18.203125

Examples

Convolution
FIR Filter
FFT

About

Simple header-only library for Fixed-Point Number operations

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published