mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.3 KiB
99 lines
2.3 KiB
using System; |
|
|
|
namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness |
|
{ |
|
class FloatingPointArithmetic |
|
{ |
|
public static int Main(string[] args) |
|
{ |
|
Issue999(); |
|
Issue1656(); |
|
Issue1794(); |
|
return 0; |
|
} |
|
|
|
static void Issue999() |
|
{ |
|
for (float i = -10f; i <= 10f; i += 0.01f) |
|
Console.WriteLine("{1:R}: {0:R}", M(i), i); |
|
} |
|
|
|
static float M(float v) |
|
{ |
|
return 0.99f * v + 0.01f; |
|
} |
|
|
|
static void Issue1656() |
|
{ |
|
double primary = 'B'; |
|
CxAssert((++primary) == 'C'); |
|
CxAssert((--primary) == 'B'); |
|
CxAssert((primary++) == 'B'); |
|
CxAssert((primary--) == 'C'); |
|
} |
|
|
|
static void Issue1794() |
|
{ |
|
Console.WriteLine("CastUnsignedToFloat:"); |
|
Console.WriteLine(CastUnsignedToFloat(9007199791611905).ToString("r")); |
|
Console.WriteLine("CastUnsignedToDouble:"); |
|
Console.WriteLine(CastUnsignedToDouble(9007199791611905).ToString("r")); |
|
Console.WriteLine("CastUnsignedToFloatViaDouble:"); |
|
Console.WriteLine(CastUnsignedToFloatViaDouble(9007199791611905).ToString("r")); |
|
|
|
Console.WriteLine("CastSignedToFloat:"); |
|
Console.WriteLine(CastSignedToFloat(9007199791611905).ToString("r")); |
|
Console.WriteLine("ImplicitCastSignedToFloat:"); |
|
Console.WriteLine(ImplicitCastSignedToFloat(9007199791611905).ToString("r")); |
|
Console.WriteLine("CastSignedToDouble:"); |
|
Console.WriteLine(CastSignedToDouble(9007199791611905).ToString("r")); |
|
Console.WriteLine("CastSignedToFloatViaDouble:"); |
|
Console.WriteLine(CastSignedToFloatViaDouble(9007199791611905).ToString("r")); |
|
} |
|
|
|
static float CastUnsignedToFloat(ulong val) |
|
{ |
|
return (float)val; |
|
} |
|
|
|
static double CastUnsignedToDouble(ulong val) |
|
{ |
|
return (double)val; |
|
} |
|
|
|
static float CastUnsignedToFloatViaDouble(ulong val) |
|
{ |
|
// The double-rounding can increase the rounding error |
|
return (float)(double)val; |
|
} |
|
|
|
static float CastSignedToFloat(long val) |
|
{ |
|
return (float)val; |
|
} |
|
|
|
|
|
static double CastSignedToDouble(long val) |
|
{ |
|
return (double)val; |
|
} |
|
|
|
static float CastSignedToFloatViaDouble(long val) |
|
{ |
|
// The double-rounding can increase the rounding error |
|
return (float)(double)val; |
|
} |
|
|
|
static float ImplicitCastSignedToFloat(long val) |
|
{ |
|
return val; |
|
} |
|
|
|
static void CxAssert(bool v) |
|
{ |
|
if (!v) { |
|
throw new InvalidOperationException(); |
|
} |
|
} |
|
} |
|
}
|
|
|