diff --git a/src/polymesh/algorithms/normalize.hh b/src/polymesh/algorithms/normalize.hh
index e1340d31c1665dd1253b1f7bad983aac8744dc28..970d524aa736a9820a7ba26b1baad0c95257b74e 100644
--- a/src/polymesh/algorithms/normalize.hh
+++ b/src/polymesh/algorithms/normalize.hh
@@ -9,6 +9,8 @@ namespace polymesh
 template <class Pos3>
 void normalize(vertex_attribute<Pos3>& pos)
 {
+    using ScalarT = std::decay_t<decltype(pos.first()[0])>;
+
     if (pos.mesh().vertices().size() == 0)
         return;
 
@@ -16,15 +18,15 @@ void normalize(vertex_attribute<Pos3>& pos)
     auto mi = mm.min;
     auto ma = mm.max;
 
-    auto cx = (mi[0] + ma[0]) * 0.5f;
-    auto cy = (mi[1] + ma[1]) * 0.5f;
-    auto cz = (mi[2] + ma[2]) * 0.5f;
+    auto cx = (mi[0] + ma[0]) * ScalarT(0.5);
+    auto cy = (mi[1] + ma[1]) * ScalarT(0.5);
+    auto cz = (mi[2] + ma[2]) * ScalarT(0.5);
 
     auto sx = ma[0] - mi[0];
     auto sy = ma[1] - mi[1];
     auto sz = ma[2] - mi[2];
-    auto s = std::max(sx, std::max(sy, sz)) * 0.5f;
-    s = std::max(s, std::numeric_limits<float>::min());
+    auto s = std::max(sx, std::max(sy, sz)) * ScalarT(0.5);
+    s = std::max(s, std::numeric_limits<ScalarT>::min());
 
     for (auto& p : pos)
     {