Guest User

Untitled

a guest
Jun 24th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.82 KB | None | 0 0
  1. public static double infiniteSum(DoubleStream ds) { ... }
  2.  
  3. double sum = infiniteSum(IntStream.iterate(1, (i -> i + 1))
  4. .mapToDouble(n -> 1 / ((double)n * n)));
  5.  
  6. public static void yeOldeWaye() {
  7. double sum = 0;
  8. for (double n = 1; ; n++) {
  9. double term = 1 / (n * n);
  10. if (Math.abs(term) <= 1e-12 * Math.abs(sum)) {
  11. break;
  12. }
  13. sum += term;
  14. }
  15. System.out.println(sum);
  16. }
  17.  
  18. public static double infiniteSum1(DoubleStream ds) {
  19. double sum = 0;
  20. PrimitiveIterator.OfDouble it = ds.iterator();
  21. while (true) {
  22. double term = it.next();
  23. if (Math.abs(term) <= 1e-12 * Math.abs(sum)) {
  24. break;
  25. }
  26. sum += term;
  27. }
  28. return sum;
  29. }
  30.  
  31. private static class DoubleAccumulator {
  32. public double sum;
  33. public DoubleAccumulator() {
  34. sum = 0;
  35. }
  36. }
  37.  
  38. public static double infiniteSum(DoubleStream ds) {
  39. DoubleAccumulator summer = ds.limit(800000).collect
  40. (DoubleAccumulator::new,
  41. (s, d) -> s.sum += d,
  42. (s1, s2) -> s1.sum += s2.sum);
  43. return summer.sum;
  44. }
  45.  
  46. public static double infiniteSum(DoubleStream ds) {
  47. DoubleAccumulator summer = ds.collect
  48. (DoubleAccumulator::new,
  49. (s, d) -> { if (Math.abs(d) <= 1e-12 * Math.abs(s.sum)) {
  50. ds.close(); // AAACK
  51. } else
  52. s.sum += d;
  53. },
  54. (s1, s2) -> s1.sum += s2.sum);
  55. return summer.sum;
  56. }
  57.  
  58. class MutableDouble {
  59. double sum;
  60. }
  61. MutableDouble sumHolder=new MutableDouble();
  62. DoubleStream ds=IntStream.iterate(1, (i -> i + 1))
  63. .mapToDouble(n -> 1 / ((double)n * n));
  64. ds.peek(term -> sumHolder.sum+=term)
  65. .filter(term -> Math.abs(term)<1e-12*Math.abs(sumHolder.sum))
  66. .findFirst();
  67. System.out.println(sumHolder.sum);
  68.  
  69. double sum = 0;
  70. for (double n = 1; ; n++) {
  71. double term = 1 / (n * n);
  72. sum += term;
  73. if (Math.abs(term) <= 1e-12 * Math.abs(sum)) {
  74. break;
  75. }
  76. }
  77.  
  78. class MutableDouble {
  79. double sum, next;
  80. void add(double d) {
  81. sum=next;
  82. next+=d;
  83. }
  84. }
  85. MutableDouble sumHolder=new MutableDouble();
  86. DoubleStream ds=IntStream.iterate(1, (i -> i + 1))
  87. .mapToDouble(n -> 1 / ((double)n * n));
  88. ds.peek(sumHolder::add)
  89. .filter(term -> Math.abs(term)<1e-12*Math.abs(sumHolder.sum))
  90. .findFirst();
  91.  
  92. public static void yeStreamsWaye() {
  93. System.out.println(stream().sum());
  94. }
  95.  
  96. private static DoubleStream stream() {
  97. return StreamSupport.doubleStream(Spliterators.spliteratorUnknownSize(new Piterator(),
  98. Spliterator.ORDERED | Spliterator.IMMUTABLE | Spliterator.NONNULL), false);
  99. }
  100.  
  101. static class Piterator implements PrimitiveIterator.OfDouble {
  102. private double t = 1;
  103. @Override public boolean hasNext() { return 1 / (t * t) > 1e-12; }
  104. @Override public double nextDouble() { return 1 / (t * t++); }
  105. }
  106.  
  107. static int numOfRelevantTerms(IntToDoubleFunction termRule, double precision) {
  108. int[] fibonacci = {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903};
  109. for (int i : fibonacci) {
  110. double term = termRule.applyAsDouble(i);
  111. if (term < precision) {
  112. return i;
  113. }
  114. }
  115. return -1;
  116. }
  117.  
  118. for (int n = 8; ; n *= 2) {
  119. if (termRule.applyAsDouble(n) < precision) {
  120. return n;
  121. }
  122. }
  123.  
  124. static double findSum(IntToDoubleFunction termRule, double precision) {
  125. int lastInt = numOfRelevantTerms(termRule, precision);
  126. return IntStream.range(1, lastInt)
  127. .mapToDouble(termRule)
  128. .sum();
  129. }
Add Comment
Please, Sign In to add comment