簡體   English   中英

在 C++ 中將浮點數/雙精度數轉換為其 IEEE754 表示

[英]To convert a float / double to its IEEE754 representation in C++

試圖弄清楚這是如何工作的,但我無法理解我所代表的內容。 我知道我們分配了一個unsigned long long ,因為它包含與float相同的位數。 但究竟代表的是什么?

我最好的解釋是我們試圖將 double 數字轉換為 unsigned long long int,因為它們具有相同的位數。 似乎最好的方法是取消引用我們設置的指針?

任何幫助將不勝感激!

void printDouble(double d) {

unsigned long long int i = *(unsigned long long int *)&d;

for (int j = 63; j >= 0; j--) {
    std::cout << ((i >> j) & 1);

    if (j == 63) std::cout << " ";
    else if (j == 52) std::cout << " ";
}

}

在大多數(但不是全部)平台上, floatdouble使用 IEEE 754 表示法來近似實數值。 有關位的含義,請參見例如https://en.wikipedia.org/wiki/IEEE_754 簡而言之,在 IEEE-754 64 位雙精度數中,有一個符號位、一個 11 位指數和一個 52 位有效數(又名尾數)以如下形式表示實數

sign ⋅ 2^(exponent − 1023) ⋅ (1.0 + significand / 2^52)

除此之外還有一些特殊情況(無窮大、 NaN次正規數、有符號零),但這是基本思想。 如果您正在尋找更深入的參考, Michael L. Overton是一本很棒的書,“Numerical Computing with IEEE Floating Point Arithmetic”

請注意,取消引用*(unsigned long long int *)&d是未定義的行為,正如其他人所評論的那樣。 如果您真的想將 double 的位轉換為 64 位 int,一個安全的方法是通過 memcpy:

uint64_t bits;
std::memcpy(&bits, &d, sizeof(d));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM