[英]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.