gpt4 book ai didi

java - 基于圆周率的算术结果异常

转载 作者:行者123 更新时间:2023-11-30 10:20:22 26 4
gpt4 key购买 nike

代码:我原来的大代码有这样的问题,所以我把它分解成下面最小的代码示例:

public class test {
static double precision = 2;

public static void main(String[] args) {
for (; precision < 100; precision++) {
int PI = (int) Math.round(Math.PI * precision);

double x1 = makePrecise(Math.PI / 2), x2 = makePrecise(PI / precision - Math.PI / 2);

if (x1 == x2)
System.out.println(precision + "\t" + x1 + "\t" + PI / precision + "\t" + (x1 + x2));
else
System.out.println(precision + "\t" + x1 + "\t" + x2 + "\t" + PI / precision + "\t" + (x1 + x2));
}
}

static double makePrecise(double num) {
return Math.round(num * precision) / precision;
}
}

我的问题:

我不明白为什么 x1 == x2 仅在精度某些特定值 下。它们要么在所有 precision 值上都相等,要么它们相等的值应该遵循某种趋势。不幸的是,正如您在下面看到的,这里真的没有趋势。在较低的 precision 值下,它类似于 +3/+2/+2/+3/+2/+2/... 但在更高的 precision 值类似于 +1/+2/+2/+2/+1/+2/+2/+2/+1...。我不完全了解这里的基础工作。

Please explain exactly why such a output is generated, especially since there doesn't seem to be any trend in it.


x1==x2 的输出:(供引用)

2.0 1.5 3.0 3.0
5.0 1.6 3.2 3.2
7.0 1.5714285714285714 3.142857142857143 3.142857142857143
9.0 1.5555555555555556 3.111111111111111 3.111111111111111
12.0 1.5833333333333333 3.1666666666666665 3.1666666666666665
14.0 1.5714285714285714 3.142857142857143 3.142857142857143
16.0 1.5625 3.125 3.125
19.0 1.5789473684210527 3.1578947368421053 3.1578947368421053
21.0 1.5714285714285714 3.142857142857143 3.142857142857143
[rows deleted to avoid bloat]
79.0 1.5696202531645569 3.1392405063291138 3.1392405063291138
81.0 1.5679012345679013 3.1358024691358026 3.1358024691358026
82.0 1.5731707317073171 3.1463414634146343 3.1463414634146343
84.0 1.5714285714285714 3.142857142857143 3.142857142857143
86.0 1.569767441860465 3.13953488372093 3.13953488372093
88.0 1.5681818181818181 3.1363636363636362 3.1363636363636362
89.0 1.5730337078651686 3.146067415730337 3.146067415730337
91.0 1.5714285714285714 3.142857142857143 3.142857142857143
93.0 1.5698924731182795 3.139784946236559 3.139784946236559
95.0 1.568421052631579 3.136842105263158 3.136842105263158
96.0 1.5729166666666667 3.1458333333333335 3.1458333333333335
98.0 1.5714285714285714 3.142857142857143 3.142857142857143

x1 != x2的输出

3.0 1.6666666666666667  1.3333333333333333  3.0 3.0
4.0 1.5 1.75 3.25 3.25
6.0 1.5 1.6666666666666667 3.1666666666666665 3.166666666666667
8.0 1.625 1.5 3.125 3.125
10.0 1.6 1.5 3.1 3.1
11.0 1.5454545454545454 1.6363636363636365 3.1818181818181817 3.1818181818181817
13.0 1.5384615384615385 1.6153846153846154 3.1538461538461537 3.153846153846154
15.0 1.6 1.5333333333333334 3.1333333333333333 3.1333333333333337
17.0 1.588235294117647 1.5294117647058822 3.1176470588235294 3.117647058823529
18.0 1.5555555555555556 1.6111111111111112 3.1666666666666665 3.166666666666667
20.0 1.55 1.6 3.15 3.1500000000000004
22.0 1.5909090909090908 1.5454545454545454 3.1363636363636362 3.1363636363636362
[rows deleted to avoid bloat]
78.0 1.5769230769230769 1.564102564102564 3.141025641025641 3.141025641025641
80.0 1.575 1.5625 3.1375 3.1375
83.0 1.5662650602409638 1.5783132530120483 3.144578313253012 3.144578313253012
85.0 1.576470588235294 1.5647058823529412 3.1411764705882352 3.1411764705882352
87.0 1.5747126436781609 1.5632183908045978 3.1379310344827585 3.137931034482759
90.0 1.5666666666666667 1.5777777777777777 3.1444444444444444 3.1444444444444444
92.0 1.576086956521739 1.565217391304348 3.141304347826087 3.141304347826087
94.0 1.574468085106383 1.5638297872340425 3.1382978723404253 3.1382978723404253
97.0 1.5670103092783505 1.577319587628866 3.1443298969072164 3.1443298969072164
99.0 1.5757575757575757 1.5656565656565657 3.1414141414141414 3.1414141414141414

Complete output


PS:正如您在两个输出中看到的,x1+x2==PI 总是。因此,我在这段代码 ((PI/precision - Math.PI/2)) 中所做的唯一浮点运算确实没有被破坏。因此,我的问题不是 Is floating point math broken? 的重复

最佳答案

计算 precision = 3:

PI = Math.round(3.14 * 3) 
= Math.round(9.42)
= 9
x1 = Math.round(3.14 / 2 * 3) / 3
= Math.round(1.57 * 3) / 3
= Math.round(4.71) / 3
= 5/3
x2 = Math.round((9 / 3 - 3.14 / 2) * 3) / 3
= Math.round((3 - 1.57) * 3) / 3
= Math.round(1.43 * 3) / 3
= Math.round(4.29) / 3
= 4/3

关于java - 基于圆周率的算术结果异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48239338/

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