Git Product home page Git Product logo

fixedpointnumberlibrary's Introduction

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

fixedpointnumberlibrary's People

Contributors

cw-b-w avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

fixedpointnumberlibrary's Issues

No rounding when multiplying

Inside

template<int INT_BIT_LEN, int FRAC_BIT_LEN>
template<int T1, int T2>
FixedPointNumber<INT_BIT_LEN, FRAC_BIT_LEN> FixedPointNumber<INT_BIT_LEN, FRAC_BIT_LEN>::operator* (const FixedPointNumber<T1, T2> &rhs) const

The bits behind LSB are discarded, but it's better to round it to LSB.

FixedPointNumber res;
uint64_t product = lv * rv;
product >>= T2; // No rounding here

to_double(): Is using bit-operation really faster

234b58d

Originally, only one main instruction. This may be faster on modern CPU even if it's floating point number multiplication.

d /= (double)(1ULL << FRAC_BIT_LEN);

Beside, bit-operation method uses a while-loop, it may be a bigger burden than floating point number multiplication.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.