- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
代码:我原来的大代码有这样的问题,所以我把它分解成下面最小的代码示例:
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
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/
python计算的位数 在电脑上做了一个实验,看看python能计算到多少位,一下是结果。 ?
我是一名优秀的程序员,十分优秀!