Try debugging the following simple program, and mouse over x in each step (or “Add Watch” for x or whatever).
using System;
using System.Globalization;
static class Program
{
static double x;
static void Main()
{
x = 2d;
// now debugger shows "2.0", as if it has used
// x.ToString("F1", CultureInfo.InvariantCulture)
x = 8.0 / 7.0;
// now debugger shows "1.1428571428571428", as if it had used
// x.ToString("R", CultureInfo.InvariantCulture)
// Note that 17 significant figures are shown, not the usual 15.
x = -1e-200 / 1e200;
// now debugger shows "0.0"; there is no indication that this is really negative zero
//
Console.WriteLine(1.0 / x); // this is negative infinity
}
}
So, apparently VS has its own way to display a System.Double. Which method does it call for this purpose? Is there a way I can get the very same string representation programmatically?
(Tried this out with Visual Studio 2010 Professional.)
At their core both the C# and VB.Net EE’s use the
_ecvt_sfunction for formatting adoubleinto a string.Both do a little bit of cleanup on the resulting string to make the display more C# and VB like and handle some corner cases a bit nicer. Either the
_ecvt_sfunction or the cleanup code could be responsible for the differences you see. Hard to tell at a glanceSome may ask why we would go through all of this trouble instead of saying just calling
ToStringon the value and displaying that. There are a couple of reasons we don’t do this.The first is simply that function evaluation, even
ToString, is the single most expensive action the EE can undertake. Profiles of common real scenarios show that over 98% of our time was spent doing function evaluation. Any time we can avoid a func eval we do because of the performance implications.The second reason is simply that function evaluation isn’t always available. There are a number of cases where func eval is unavailable yet people still expect to see a display for primitive types like
double,int, etc … Taking them away would essentially kill the debugging experience. Hence we need to solve this problem withoutToStringsupport.