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