簡體   English   中英

為什么C++中這個double值乘以2會出現計算錯誤?

[英]Why does a calculation error occur when this double value is multiplied by 2 in C++?

#include <iostream>
#include <stdint.h>
#include <bitset>
#include <sstream>
#include <string>
#include <iomanip>
using namespace std;
int main()
{
    uint64_t int_value = 0b0000000000001101000011110100001011000000110111111010111101110011;
    double double_value = (*((double *)((void *)&int_value)));
    printf("double initiate value: %e\n", double_value);
    cout << "sign " << setw(11) << "exp"
         << " " << setw(52) << "frac" << endl;
    for (int i = 0; i < 10; i++)
    {
        stringstream ss;
        ss << bitset<64>((*((uint64_t *)((void *)&double_value))));
        auto str = ss.str();
        cout << setw(4) << str.substr(0, 1) << " " << setw(11) << str.substr(1, 11) << " " << str.substr(12, 52) << endl;
        double_value *= 2;
    }
}

采用 ieee754 標准格式的二進制 output:

double initiate value: 1.816163e-308
sign         exp                                                 frac
   0 00000000000 1101000011110100001011000000110111111010111101110011
   0 00000000001 1010000111101000010110000001101111110101111011100110
   0 00000000010 1010000111101000010110000001101111110101111011100110
   0 00000000011 1010000111101000010110000001101111110101111011100110
   0 00000000100 1010000111101000010110000001101111110101111011100110
   0 00000000101 1010000111101000010110000001101111110101111011100110
   0 00000000110 1010000111101000010110000001101111110101111011100110
   0 00000000111 1010000111101000010110000001101111110101111011100110
   0 00000001000 1010000111101000010110000001101111110101111011100110
   0 00000001001 1010000111101000010110000001101111110101111011100110

double 值乘以 2、10 倍。

我認為只有 exp 部分應該改變(增加 1),但在我的系統上,frac 部分也會改變。

您遇到了非規范化數字 當指數為零但尾數不是時,尾數按原樣使用,沒有隱含的前導 1 位。 這樣做是為了表示可以處理非常小的數字,這些數字小於最小指數可以表示的數字。 所以在你的例子的前兩行:

              v
0 00000000000 1101000011110100001011000000110111111010111101110011
0 00000000001 1010000111101000010110000001101111110101111011100110

當指數增加到非零值時,我用v指示的前導 1 被刪除。

您還應該注意,指數值是有偏差的,這意味着0000000001不是 1 的指數,而是 -1022 的指數。

暫無
暫無

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

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