我已经在autoexp.dat中做了一些调整,以便在Visual Studio调试器中轻松检查自定义字符串和其他简单类(使用vs2005)。我真的很想直接看到我们的自定义浮点类的值(或近似值)。内部表示是一个四元整数(int尾数[4],x86上的128位),将除以10到指数的幂。所以它基本上是这样的:
class FloatingPoint
{
private:
char exponent;
int mantissa[4]
};
如果fp是FloatingPoint类型的对象:
,以下语句会将其转换为double(mantissa[0] +
* ((double)mantissa[1] * 32 * 2)
* ((double)mantissa[2] * 64 * 2)
* ((double)mantissa[3] * 96 * 2))
/ std::pow(10, fp.exponent)
是否有可能以某种方式使用此计算使Visual Studio调试器显示类型为FloatingPoint的对象?对pow的调用是一个额外的问题,因为这个函数没有外部链接而且调试器无法调用...也许有办法解决这个问题?
答案 0 :(得分:2)
由于可能的指数范围很小,因此添加(仅限调试)查找表double power10[256];
。调试器很乐意使用它。唯一的缺点:全局对象的调试构造函数可能在数组初始化之前发生,在这种情况下,这些值仍然是0.如果发生这种情况,您将需要自己从立即窗口调用初始化函数。
在略微相关的说明中,您需要为指数选择signed char
或unsigned char
。 (可能是signed
,否则没有必要浮动)。简单char
有一个实现定义的符号,这里符号非常相关。
快速尝试(未经测试):
FloatingPoint {
preview (
#([($c.mantissa[0] + $c.mantissa[1] * 64.0 + $c.mantissa[2] * 128.0 + $c.mantissa[3] * 192.0) / power10[$c.exponent], f])
)
stringview (
#([($c.mantissa[0] + $c.mantissa[1] * 64.0 + $c.mantissa[2] * 128.0 + $c.mantissa[3] * 192.0) / power10[$c.exponent], f])
)
children([$c,!])
}
答案 1 :(得分:2)
另一种可行的方法是
const char* FloatingPoint::ToString () const
{
static char buf[64];
double d = (mantissa[0] +
* ((double)mantissa[1] * 32 * 2)
* ((double)mantissa[2] * 64 * 2)
* ((double)mantissa[3] * 96 * 2))
/ std::pow(10, fp.exponent);
sprintf(buf, "%f", d);
return buf;
}
允许Floatingpoint =<ToString()>
部分中的[AutoExpand]
。