diff --git a/AUTHORS.md b/AUTHORS.md
index 9f4060c25..434c57801 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -27,6 +27,7 @@
- Joe Frayne ([@jfrayne](https://github.com/jfrayne))
- John Burnett ([@johnburnett](https://github.com/johnburnett))
- Luke Stratman ([@lstratman](https://github.com/lstratman))
+- Konstantin Posudevskiy ([@konstantin-posudevskiy](https://github.com/konstantin-posudevskiy))
- Matthias Dittrich ([@matthid](https://github.com/matthid))
- Patrick Stewart ([@patstew](https://github.com/patstew))
- Raphael Nestler ([@rnestler](https://github.com/rnestler))
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 728c8c69b..f3bcdfe16 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
- Fixed crash on exit of the Python interpreter if a python class
derived from a .NET class has a `__namespace__` or `__assembly__`
attribute (#481)
+- Fixed conversion of 'float' and 'double' values (#486)
+
## [2.3.0][] - 2017-03-11
diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj
index fc887d815..d45c622f9 100644
--- a/src/embed_tests/Python.EmbeddingTest.csproj
+++ b/src/embed_tests/Python.EmbeddingTest.csproj
@@ -84,6 +84,7 @@
+
diff --git a/src/embed_tests/TestConverter.cs b/src/embed_tests/TestConverter.cs
new file mode 100644
index 000000000..346c8afdc
--- /dev/null
+++ b/src/embed_tests/TestConverter.cs
@@ -0,0 +1,48 @@
+using NUnit.Framework;
+using Python.Runtime;
+
+namespace Python.EmbeddingTest
+{
+ public class TestConverter
+ {
+ [OneTimeSetUp]
+ public void SetUp()
+ {
+ PythonEngine.Initialize();
+ }
+
+ [OneTimeTearDown]
+ public void Dispose()
+ {
+ PythonEngine.Shutdown();
+ }
+
+ [Test]
+ public void TestConvertSingleToManaged(
+ [Values(float.PositiveInfinity, float.NegativeInfinity, float.MinValue, float.MaxValue, float.NaN,
+ float.Epsilon)] float testValue)
+ {
+ var pyFloat = new PyFloat(testValue);
+
+ object convertedValue;
+ var converted = Converter.ToManaged(pyFloat.Handle, typeof(float), out convertedValue, false);
+
+ Assert.IsTrue(converted);
+ Assert.IsTrue(((float) convertedValue).Equals(testValue));
+ }
+
+ [Test]
+ public void TestConvertDoubleToManaged(
+ [Values(double.PositiveInfinity, double.NegativeInfinity, double.MinValue, double.MaxValue, double.NaN,
+ double.Epsilon)] double testValue)
+ {
+ var pyFloat = new PyFloat(testValue);
+
+ object convertedValue;
+ var converted = Converter.ToManaged(pyFloat.Handle, typeof(double), out convertedValue, false);
+
+ Assert.IsTrue(converted);
+ Assert.IsTrue(((double) convertedValue).Equals(testValue));
+ }
+ }
+}
diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs
index 0bf882cc5..5179c849b 100644
--- a/src/runtime/converter.cs
+++ b/src/runtime/converter.cs
@@ -770,10 +770,14 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo
goto type_error;
}
double dd = Runtime.PyFloat_AsDouble(op);
+ Runtime.CheckExceptionOccurred();
Runtime.XDecref(op);
if (dd > Single.MaxValue || dd < Single.MinValue)
{
- goto overflow;
+ if (!double.IsInfinity(dd))
+ {
+ goto overflow;
+ }
}
result = (float)dd;
return true;
@@ -785,11 +789,8 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo
goto type_error;
}
double d = Runtime.PyFloat_AsDouble(op);
+ Runtime.CheckExceptionOccurred();
Runtime.XDecref(op);
- if (d > Double.MaxValue || d < Double.MinValue)
- {
- goto overflow;
- }
result = d;
return true;
}
diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py
index 9152e30d0..53e5d8051 100644
--- a/src/tests/test_conversion.py
+++ b/src/tests/test_conversion.py
@@ -466,17 +466,6 @@ def test_double_conversion():
with pytest.raises(TypeError):
ConversionTest().DoubleField = None
- with pytest.raises(OverflowError):
- ConversionTest().DoubleField = 1.7976931348623159e308
-
- with pytest.raises(OverflowError):
- ConversionTest().DoubleField = -1.7976931348623159e308
-
- with pytest.raises(OverflowError):
- _ = System.Double(1.7976931348623159e308)
-
- with pytest.raises(OverflowError):
- _ = System.Double(-1.7976931348623159e308)
def test_decimal_conversion():