diff --git a/Makefile.am b/Makefile.am
index 3d6057cc..1339cb45 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -12,6 +12,7 @@ UTIL_INCLUDE = \
debug.hpp \
enable_if.hpp \
except.hpp \
+ fixed.hpp \
float.hpp \
io.hpp \
ip.hpp \
@@ -32,6 +33,7 @@ UTIL_INCLUDE = \
UTIL_FILES = \
debug.cpp \
except.cpp \
+ fixed.cpp \
float.cpp \
io.cpp \
ip.cpp \
diff --git a/fixed.cpp b/fixed.cpp
new file mode 100644
index 00000000..4514f559
--- /dev/null
+++ b/fixed.cpp
@@ -0,0 +1,119 @@
+/*
+ * This file is part of libgim.
+ *
+ * libgim is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libgim is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libgim. If not, see .
+ *
+ * Copyright 2011 Danny Robson
+ */
+
+#include "fixed.hpp"
+
+#include
+
+/*
+ * Constructors
+ */
+template
+fixed::fixed (integral_type val):
+ m_value (val << FRAC)
+{
+ static_assert (INT > 0, "must use positive integer bits");
+ static_assert (FRAC > 0, "must use positive fractional bits");
+}
+
+
+/*
+ * Conversions
+ */
+
+template
+double
+fixed::to_double (void) const
+ { return m_value / std::pow (2.0, FRAC); }
+
+
+template
+float
+fixed::to_float (void) const
+ { return m_value / std::pow (2.0f, FRAC); }
+
+
+template
+typename fixed::integral_type
+fixed::to_integral (void) const
+ { return m_value >> FRAC; }
+
+
+/*
+ * Integral operators
+ */
+
+template
+fixed&
+fixed::operator +=(integral_type val) {
+ m_value += val << FRAC;
+ return *this;
+}
+
+
+template
+fixed&
+fixed::operator -=(integral_type val) {
+ m_value -= val << FRAC;
+ return *this;
+}
+
+
+template
+fixed&
+fixed::operator *=(integral_type val) {
+ m_value *= val;
+ return *this;
+}
+
+
+template
+fixed&
+fixed::operator /=(integral_type val) {
+ m_value /= val;
+ return *this;
+}
+
+
+template
+fixed
+fixed::operator +(integral_type val) const
+ { return fixed(m_value + val << FRAC); }
+
+
+template
+fixed
+fixed::operator -(integral_type val) const
+ { return fixed(m_value - val << FRAC); }
+
+
+template
+fixed
+fixed::operator *(integral_type val) const
+ { return fixed(m_value * val); }
+
+
+template
+fixed
+fixed::operator /(integral_type val) const
+ { return fixed(m_value / val); }
+
+
+template class fixed<16,16>;
+template class fixed<32,32>;
diff --git a/fixed.hpp b/fixed.hpp
new file mode 100644
index 00000000..593f8253
--- /dev/null
+++ b/fixed.hpp
@@ -0,0 +1,65 @@
+/*
+ * This file is part of libgim.
+ *
+ * libgim is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * libgim is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with libgim. If not, see .
+ *
+ * Copyright 2011 Danny Robson
+ */
+
+#ifndef __UTIL_FIXED_HPP
+#define __UTIL_FIXED_HPP
+
+#include "types.hpp"
+
+#include
+
+template
+class fixed {
+ public:
+ typedef typename bits_type::uint combined_type;
+ typedef typename bits_type::uint integral_type;
+
+ combined_type m_value;
+
+ public:
+ explicit fixed(double);
+ explicit fixed(float);
+ explicit fixed(integral_type);
+
+ double to_double (void) const;
+ float to_float (void) const;
+ integral_type to_integral (void) const;
+
+ fixed& operator +=(const fixed);
+ fixed& operator -=(const fixed);
+ fixed& operator *=(const fixed);
+ fixed& operator /=(const fixed);
+
+ fixed operator +(const fixed) const;
+ fixed operator -(const fixed) const;
+ fixed operator *(const fixed) const;
+ fixed operator /(const fixed) const;
+
+ fixed& operator +=(integral_type);
+ fixed& operator -=(integral_type);
+ fixed& operator *=(integral_type);
+ fixed& operator /=(integral_type);
+
+ fixed operator +(integral_type) const;
+ fixed operator -(integral_type) const;
+ fixed operator *(integral_type) const;
+ fixed operator /(integral_type) const;
+};
+
+#endif // __UTIL_FIXED_HPP