簡體   English   中英

IEEE 754浮點數,最大數<1?

[英]IEEE 754 floating point, what is the largest number < 1?

當使用IEEE 754浮點表示(c ++中的double類型)時,非常接近(可表示)整數的數字將四舍五入到它們最接近的整數並精確表示。 真的嗎?
在舍入之前,數字究竟與最接近的可表示整數有多接近?
這個距離是否恆定?
例如,假設1可以精確表示,那么最大的double小於1是多少?

當使用IEEE 754浮點表示(c ++中的double類型)時,非常接近(可表示)整數的數字將四舍五入到它們最接近的整數並精確表示。

這取決於數字是否更接近整數而不是其他可表示的值。 0.99999999999999994不等於1 ,但是0.99999999999999995是。

這個距離是否恆定?

不,它在更大的范圍內變得更小 - 特別是在表示中具有更大的指數。 較大的指數意味着尾數覆蓋較大的間隔,這反過來意味着整體精度較低。

例如,最小的雙倍小於1是多少?

std::nexttoward(1.0, 0.0) 例如, 在Coliru的0.999999999999999889

你會發現更多關於1.0的相反方向的明確陳述1.0和下一個更大的數字之間的差異記錄在這里:

std::numeric_limits<double>::epsilon()

浮點的工作方式,下一個較小的數字應該與下一個較大的數字正好相差一半。

低於1的第一個IEEE雙精度數可以明確地寫為0.99999999999999989,但正好是0.99999999999999988897769753748434595763683319091796875。

距離不是恆定的,它取決於數字的指數(以及數量)。 最終差距變得大於1,意味着偶數(不是奇數 - 奇數整數是第一個得到舍入的)整數將有點圓(或者,最終,很多)。

增加IEEE浮點數的二進制表示可以看作是遞增的整數表示:

示例Hack(英特爾):

#include <cstdint>
#include <iostream>
#include <limits>

int main() {
    double one = 1;
    std::uint64_t one_representation = *reinterpret_cast<std::uint64_t*>(&one);
    std::uint64_t lesser_representation = one_representation - 1;
    std::cout.precision(std::numeric_limits<double>::digits10 + 1);
    std::cout << std::hex;
    std::cout << *reinterpret_cast<double*>(&lesser_representation)
              << " [" << lesser_representation
              << "] < " << *reinterpret_cast<double*>(&one_representation)
              << " [" << one_representation
              << "]\n";
}

輸出:

0.9999999999999999 [3fefffffffffffff] < 1 [3ff0000000000000]

當將整數表示推進到其極限時,如果指數位改變,則連續浮點數的差異正在增加。

另見: http//randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

當使用IEEE 754浮點表示(c ++中的雙精度類型)時,非常接近精確整數的數字將四舍五入為最接近的整數並精確表示。 真的嗎?

這是錯誤的。

在舍入之前,數字到底是多么接近最接近的int?

當您執行二進制到字符串轉換時,使用當前舍入模式將浮點數舍入為當前精度(對於printf系列函數,默認精度為6)。

暫無
暫無

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

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