[英]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 ;
}
以上程序可以進入無限循環嗎?
是的,這是可能的。 以最大浮點數為例。
如此代碼所示,對於最大的浮點數m
, m
等於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太小而無法發揮作用。
是的,它可以。 例如,如果k
是FLT_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.