gpt4 book ai didi

java - for循环中奇怪的重复次数

转载 作者:行者123 更新时间:2023-11-29 04:32:10 26 4
gpt4 key购买 nike

我写了这个小程序来计算圆周率。

在尝试使用代码并尝试找到最准确的结果时,我发现我的计算机无法计算结果。它可以在几秒钟内执行 33554430 次重复,但如果我将 for 循环增加到 33554431 它不会输出任何内容。

那么33554430是一个特殊的数字吗?

public class CalculatePi{
public static void main(String[] args){
float pi=0;
int sign=1;
for(float i=1; i <= 33554430; i+=2){
pi += (sign*(1.0/i));
sign*= -1;
}
pi *= 4;
System.out.println(pi);
}

}

最佳答案

你得到了无限循环,因为在比较过程中 i <= 33554431 , int33554431promoted to a float 对于 float 来说“太精确”的值实际上等于 33554432 .然后,当您尝试将值增加 +2 时, float只是不够精确,无法从值 33554432 开始递增.为了说明我的观点:

float f = 33554432;
System.out.println(f); //33554432
f += 2;
System.out.println(f); //33554432

所以值f由于其精度限制而不会增加。如果你想增加它,比如说 11 ,你会得到 33554444 (而不是 33554443 ),因为这是可以用该精度表达的最接近的数字。

So is 33554430 a special number?

有点像,不是 33554430,而是 33554432。 float 的第一个“特殊数字”是 16777217 , 这是第一个不能表示为 float 的正整数(等于 16777216 作为 float )。所以,如果你增加你的 i变量 1 ,这是你会卡住的数字。现在,因为你递增了 2 ,你卡住的号码是16777216 * 2 = 33554432 .

关于java - for循环中奇怪的重复次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43393527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com