簡體   English   中英

IEEE 754 兩個 32 位浮點數的加法(-1 和 2^(-50))

[英]IEEE 754 Addition of two 32-bit floating point numbers (-1 and 2^(-50) )

考慮以下 C++ 代碼:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    cout.precision(1000000000);
    
    float a,b,c;
    
    a = 1;
    b = -1;
    c = pow(2, -50);
    
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
    
    float ab = a + b;
    float bc = b + c;
    float abc = ab + c;
    float bca = bc + a;
    
    cout << "a + b = " << ab << endl;
    cout << "b + c = " << bc << endl;
    cout << "(a + b) + c = " << abc << endl;
    cout << "(b + c) + a = " << bca << endl;

    return 0;
}

產生輸出:

a = 1
b = -1
c = 8.8817841970012523233890533447265625e-16
a + b = 0
b + c = -1
(a + b) + c = 8.8817841970012523233890533447265625e-16
(b + c) + a = 0

為什么 b + c = -1?

我不明白 IEEE 754 標准的這種影響。

據我了解,指數范圍從 -126 到 127。(偏置指數為 8 位,偏置為 127。)

所以 2^(-50) 可以像 1 或 -1 一樣沒有問題地表示。 如果我正確理解標准,它們都不是次正規(非正規化)數字。

但是為什么 -1 + 2^(-50) 的加法結果是 -1,從而忽略了較小的數字?

在此先感謝您的幫助!

IEEE 754 標准規定 1 個符號位、7 個指數位和 24 個尾數位。 在執行加法時,每個數字的尾數都會被標准化,因此 2^-50 相對於 1 右移 50 位 1。這導致它落在用於結果的 24 位尾數之外。 你應該嘗試用 2^-25 重復你的實驗來證明這一點。

您正在使用(至少)單精度float 使用double代替。

-1+9e-16在單精度的-1舍入范圍內。

暫無
暫無

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

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