簡體   English   中英

C ++中while循環中的浮點錯誤

[英]Floating point error in while loop in C++

int main()
 {
      float x = k ; // k is some fixed positive value 
      while(x>0)
           x-- ;
      return 0 ;
 }

以上程序可以進入無限循環嗎?

是的,這是可能的。 以最大浮點數為例。

如此代碼所示,對於最大的浮點數mm等於m - 1

#include <iostream>
#include <limits>

int main() {
    auto m = std::numeric_limits<float>::max();
    auto l = m;
    l--;
    std::cerr << (m == l) << "\n";
}

演示: http//ideone.com/Wr9zdN

因此,使用此起始值,循環將是無限的。

這是為什么?

float (與其他所有內置類型一樣)的精度有限。 為了使x - 1由比其它的數表示的x ,最大的數小於之間的差x必須小於2。

現在,讓我們計算的區別m的最大浮動和, x ,最大的浮動,這是嚴格小於m

#include <iostream>
#include <cmath>
#include <limits>

int main() {
    auto m = std::numeric_limits<float>::max();
    std::cout << "float max: " << m << "\n";
    auto x = std::nextafter(m, 0.0f);
    std::cout << "biggest value less than max: " << x << "\n";
    auto d = m - x;
    std::cout << "the difference: " << d << "\n";
}

演示: http//ideone.com/VyNgtE

事實證明,這兩個數字之間存在2.02824e+31的巨大差距。 遠遠大於1. 1太小而無法發揮作用。

是的,它可以。 例如,如果kFLT_MAX 沒有足夠的精度來處理這么大的數字之間的這么小的距離。

#include <float.h>
#include <stdio.h>

int main()
{
    float a = FLT_MAX;
    float b = a - 1;
    printf("%.10f\n", a - b);

    return 0;
}

輸出:

0.0000000000

實際上,我認為它可以。 如果k足夠大,四舍五入將吞噬你的減量。

暫無
暫無

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

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