Dri*_*zzy 4 java printing for-loop add fractions
我需要添加一系列分数.我查看for了添加分数的其他循环,但没有遇到我遇到的问题.分数分母每次增加1.0,直到它加起来1.0/1.0 + 1.0/2.0 + .... + 1.0/150,000,000.0.我的代码通过添加分数为我工作,直到我在for循环中略微超过10,000,000.一旦我说了15,000,000,它就不会打印任何东西,程序继续运行.我犯了什么错误?当它超过一定数量时,为什么不打印答案呢?
这是代码:
float sum = 0;
float numerator = 1;
float denominator = 1;
for(float i = 1; i <= 10000000; i++)
{
sum = ((float)numerator/denominator) + sum;
denominator++;
}
System.out.println("The sum is " + sum);
Run Code Online (Sandbox Code Playgroud)
添加1到足够大将float不再有任何影响.问题是float-23位的精度有限.一旦达到约1600万(约2 24),连续浮点值之间的差值大于1.您可以通过打印出Math.ulp(最后一位的单位)值的结果来看到这一点.
if (denominator % 1000 == 0)
System.out.println("Denominator is " + denominator + ", ulp is " + Math.ulp(denominator));
Run Code Online (Sandbox Code Playgroud)
在输出停止的点,ulp为1.0.
...
Denominator is 1.6775E7, ulp is 1.0
Denominator is 1.6776E7, ulp is 1.0
Denominator is 1.6777E7, ulp is 1.0
Run Code Online (Sandbox Code Playgroud)
在2 24,ulp跳到2.0,并且在遵循统一规则的IEEE轮次之后加上1.0,并且总和不变.
将数据类型更改double为更大的精度(53位).请注意,此更改只会延长问题,直到达到2 53.这也会让你的程序运行得更长.如果你真的想要超出这个数额,那就用BigDecimals吧.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |