diff --git a/frontends/ast/ast.cc b/frontends/ast/ast.cc
index 25ea3a824..cc7f442bb 100644
--- a/frontends/ast/ast.cc
+++ b/frontends/ast/ast.cc
@@ -775,17 +775,20 @@ int AstNode::isConst()
 double AstNode::asReal(bool is_signed)
 {
 	if (type == AST_CONSTANT) {
-		RTLIL::Const val;
-		val.bits = bits;
+		RTLIL::Const val(bits);
 
-		double p = exp2(int(val.bits.size())-32);
-		if (val.bits.size() > 32)
-			val.bits.erase(val.bits.begin(), val.bits.begin()+(int(val.bits.size())-32));
-		int32_t v = val.as_int() << (32-int(val.bits.size()));
+		bool is_negative = is_signed && val.bits.back() == RTLIL::State::S1;
+		if (is_negative)
+			val = const_neg(val, val, false, false, val.bits.size());
 
-		if (is_signed)
-			return v * p;
-		return uint32_t(v) * p;
+		double v = 0;
+		for (size_t i = 0; i < val.bits.size(); i++)
+			if (val.bits.at(i) == RTLIL::State::S1)
+				v += exp2(i);
+		if (is_negative)
+			v *= -1;
+
+		return v;
 	}
 
 	if (type == AST_REALVALUE)
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc
index ed5ee1721..80fd28d55 100644
--- a/frontends/ast/simplify.cc
+++ b/frontends/ast/simplify.cc
@@ -533,7 +533,7 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
 			if (children[0]->type == AST_REALVALUE) {
 				RTLIL::Const constvalue = children[0]->realAsConst(width);
 				log("Warning: converting real value %e to binary %s at %s:%d.\n",
-						realvalue, log_signal(constvalue), filename.c_str(), linenum);
+						children[0]->realvalue, log_signal(constvalue), filename.c_str(), linenum);
 				delete children[0];
 				children[0] = mkconst_bits(constvalue.bits, sign_hint);
 				did_something = true;