[英]Assigning an exact representation to a floating point value
在这个问题中 ,OP试图隔离大程序中难以捉摸的错误。 他观察到一些double
值,然后尝试将其硬编码为较小的测试程序的输入。 想法非常适合隔离此类错误。
但是,选择的方法违反了字符串别名规则,引入了UB,因此测试是完全不可靠的:
在调试器中查看表达式:
+------------------------+----------------------| | Watch Expression | Value | +------------------------+----------------------| | *(long long int *)(&a) | 4594681439063077250 | +------------------------+----------------------|
然后在测试程序中分配它:
double a; *(long long int *)(&a) = 4594681439063077250;
(我强烈怀疑)他这样做是为了一点一点保留精确的double
值。
问题:如何将调试会话中观察到的精确值(逐位)分配给双精度?
十六进制表示法是分配浮点值的精确位表示法的一种好方法。 如果由于尚未使用C ++ 17而不能使用文字,请注意strtod可以识别这种格式。
这可以通过将double表示为char
数组来实现:
double as_double = 0.0;
uint64_t as_uint64 = 4594681439063077250 ;
static_assert(sizeof(double) == sizeof(uint64_t), "");
memcpy(&as_double, &as_uint64_t, sizeof(double));
我对严格别名规则的解释是,这将是UB
uint64_t x = 4594681439063077250;
double * a = (double *) & x;
您的代码很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.