Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. import java.awt.EventQueue;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.awt.event.KeyAdapter;
  5. import java.awt.event.KeyEvent;
  6. import java.math.BigDecimal;
  7. import java.math.RoundingMode;
  8. import java.util.concurrent.ExecutionException;
  9.  
  10. import javax.swing.JButton;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JPanel;
  14. import javax.swing.JScrollPane;
  15. import javax.swing.JSlider;
  16. import javax.swing.JTextArea;
  17. import javax.swing.JTextField;
  18. import javax.swing.SwingWorker;
  19. import javax.swing.event.ChangeEvent;
  20. import javax.swing.event.ChangeListener;
  21. import javax.swing.text.DefaultCaret;
  22.  
  23. import net.miginfocom.swing.MigLayout;
  24.  
  25. @SuppressWarnings("serial")
  26. public class SquareRoot extends JFrame {
  27. private BigDecimal SQRT_DIG = new BigDecimal(150);
  28.  
  29. private SquareRoot() {
  30. super("Square Rooter");
  31. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  32. createLayout(this);
  33. pack();
  34. setLocationRelativeTo(null);
  35. setVisible(true);
  36. }
  37.  
  38. private void createLayout(JFrame addTo) {
  39. JPanel rootPanel = new JPanel(new MigLayout("wrap", "grow", ""));
  40. JLabel acc = new JLabel("Accuracy: " + SQRT_DIG);
  41. JSlider accSlide = new JSlider(1, 1000000, 150);
  42. JLabel numRoot = new JLabel("Number to Square Root");
  43. JTextField num = new JTextField();
  44. JButton root = new JButton("Root");
  45. JLabel ansRoot = new JLabel("Answer");
  46. JTextArea ans = new JTextArea();
  47. JScrollPane ansHolder = new JScrollPane(ans);
  48.  
  49. accSlide.addChangeListener(new ChangeListener() {
  50. @Override
  51. public void stateChanged(ChangeEvent arg0) {
  52. SQRT_DIG = new BigDecimal(accSlide.getValue());
  53. acc.setText("Accuracy: " + SQRT_DIG);
  54. }
  55. });
  56. rootPanel.add(acc);
  57. rootPanel.add(accSlide, "grow");
  58.  
  59. root.addActionListener(new ActionListener() {
  60. @Override
  61. public void actionPerformed(ActionEvent e) {
  62. ans.setText("Please Wait");
  63. new SwingWorker<BigDecimal, Object>() {
  64. @Override
  65. protected BigDecimal doInBackground() throws Exception {
  66. return bigSqrt(new BigDecimal(num.getText()));
  67. }
  68.  
  69. @Override
  70. protected void done() {
  71. try {
  72. ans.setText(get().toPlainString());
  73. } catch (InterruptedException | ExecutionException e) {
  74. e.printStackTrace();
  75. }
  76. }
  77. }.run();
  78. }
  79. });
  80. rootPanel.add(numRoot);
  81. rootPanel.add(num, "grow");
  82. rootPanel.add(root, "right");
  83.  
  84. ans.setEditable(false);
  85. ((DefaultCaret) ans.getCaret()).setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
  86. ansHolder.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
  87. rootPanel.add(ansRoot);
  88. rootPanel.add(ansHolder, "grow");
  89.  
  90. addTo.add(rootPanel);
  91. }
  92.  
  93. private BigDecimal sqrtNewtonRaphson(BigDecimal c, BigDecimal xn, BigDecimal precision) {
  94. BigDecimal fx = xn.pow(2).add(c.negate());
  95. BigDecimal fpx = xn.multiply(new BigDecimal(2));
  96. BigDecimal xn1 = fx.divide(fpx,2*SQRT_DIG.intValue(),RoundingMode.HALF_DOWN);
  97. xn1 = xn.add(xn1.negate());
  98. BigDecimal currentSquare = xn1.pow(2);
  99. BigDecimal currentPrecision = currentSquare.subtract(c);
  100. currentPrecision = currentPrecision.abs();
  101. if (currentPrecision.compareTo(precision) <= -1)
  102. return xn1;
  103. return sqrtNewtonRaphson(c, xn1, precision);
  104. }
  105.  
  106. private BigDecimal bigSqrt(BigDecimal c) {
  107. return sqrtNewtonRaphson(c, new BigDecimal(1), new BigDecimal(1).divide(new BigDecimal(10).pow(SQRT_DIG.intValue())));
  108. }
  109.  
  110. public static void main(String[] args) {
  111. EventQueue.invokeLater(() -> new SquareRoot());
  112. }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement