diff --git a/src/dobjtype.cpp b/src/dobjtype.cpp
index 0a964917c1..552b8ee685 100644
--- a/src/dobjtype.cpp
+++ b/src/dobjtype.cpp
@@ -412,6 +412,12 @@ int PType::GetValueInt(void *addr) const
 	return 0;
 }
 
+double PType::GetValueFloat(void *addr) const
+{
+	assert(0 && "Cannot get value for this type");
+	return 0;
+}
+
 //==========================================================================
 //
 // PType :: GetStoreOp
@@ -724,6 +730,17 @@ int PInt::GetValueInt(void *addr) const
 	}
 }
 
+//==========================================================================
+//
+// PInt :: GetValueFloat
+//
+//==========================================================================
+
+double PInt::GetValueFloat(void *addr) const
+{
+	return GetValueInt(addr);
+}
+
 //==========================================================================
 //
 // PInt :: GetStoreOp
@@ -962,16 +979,27 @@ void PFloat::SetValue(void *addr, double val)
 //==========================================================================
 
 int PFloat::GetValueInt(void *addr) const
+{
+	return xs_ToInt(GetValueFloat(addr));
+}
+
+//==========================================================================
+//
+// PFloat :: GetValueFloat
+//
+//==========================================================================
+
+double PFloat::GetValueFloat(void *addr) const
 {
 	assert(((intptr_t)addr & (Align - 1)) == 0 && "unaligned address");
 	if (Size == 4)
 	{
-		return xs_ToInt(*(float *)addr);
+		return *(float *)addr;
 	}
 	else
 	{
 		assert(Size == 8);
-		return xs_ToInt(*(double *)addr);
+		return *(double *)addr;
 	}
 }
 
@@ -1145,6 +1173,18 @@ int PFixed::GetValueInt(void *addr) const
 	return *(fixed_t *)addr >> FRACBITS;
 }
 
+//==========================================================================
+//
+// PFixed :: GetValueFloat
+//
+//==========================================================================
+
+double PFixed::GetValueFloat(void *addr) const
+{
+	assert(((intptr_t)addr & (Align - 1)) == 0 && "unaligned address");
+	return FIXED2DBL(*(fixed_t *)addr);
+}
+
 //==========================================================================
 //
 // PFixed :: GetStoreOp
@@ -1212,6 +1252,18 @@ int PAngle::GetValueInt(void *addr) const
 	return *(angle_t *)addr / ANGLE_1;
 }
 
+//==========================================================================
+//
+// PAngle :: GetValueFloat
+//
+//==========================================================================
+
+double PAngle::GetValueFloat(void *addr) const
+{
+	assert(((intptr_t)addr & (Align - 1)) == 0 && "unaligned address");
+	return (double)(*(angle_t *)addr) / ANGLE_1;
+}
+
 //==========================================================================
 //
 // PAngle :: GetStoreOp
diff --git a/src/dobjtype.h b/src/dobjtype.h
index a5e2ab2a24..e9ff982454 100644
--- a/src/dobjtype.h
+++ b/src/dobjtype.h
@@ -192,6 +192,7 @@ public:
 
 	// Gets the value of a variable of this type at (addr)
 	virtual int GetValueInt(void *addr) const;
+	virtual double GetValueFloat(void *addr) const;
 
 	// Gets the opcode to store from a register to memory
 	virtual int GetStoreOp() const;
@@ -323,6 +324,7 @@ public:
 	virtual void SetValue(void *addr, int val);
 	virtual void SetValue(void *addr, double val);
 	virtual int GetValueInt(void *addr) const;
+	virtual double GetValueFloat(void *addr) const;
 	virtual int GetStoreOp() const;
 	virtual int GetLoadOp() const;
 	virtual int GetRegType() const;
@@ -348,6 +350,7 @@ public:
 	virtual void SetValue(void *addr, int val);
 	virtual void SetValue(void *addr, double val);
 	virtual int GetValueInt(void *addr) const;
+	virtual double GetValueFloat(void *addr) const;
 	virtual int GetStoreOp() const;
 	virtual int GetLoadOp() const;
 	virtual int GetRegType() const;
@@ -415,6 +418,7 @@ public:
 	virtual void SetValue(void *addr, int val);
 	virtual void SetValue(void *addr, double val);
 	virtual int GetValueInt(void *addr) const;
+	virtual double GetValueFloat(void *addr) const;
 	virtual int GetStoreOp() const;
 	virtual int GetLoadOp() const;
 };
@@ -428,6 +432,7 @@ public:
 	virtual void SetValue(void *addr, int val);
 	virtual void SetValue(void *addr, double val);
 	virtual int GetValueInt(void *addr) const;
+	virtual double GetValueFloat(void *addr) const;
 	virtual int GetStoreOp() const;
 	virtual int GetLoadOp() const;
 };