繁体   English   中英

为浮点值分配精确的表示形式

[英]Assigning an exact representation to a floating point value

这个问题中 ,OP试图隔离大程序中难以捉摸的错误。 他观察到一些double值,然后尝试将其硬编码为较小的测试程序的输入。 想法非常适合隔离此类错误。

但是,选择的方法违反了字符串别名规则,引入了UB,因此测试是完全不可靠的:

  1. 在调试器中查看表达式:

     +------------------------+----------------------| | Watch Expression | Value | +------------------------+----------------------| | *(long long int *)(&a) | 4594681439063077250 | +------------------------+----------------------| 
  2. 然后在测试程序中分配它:

     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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM