簡體   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