Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > а как работает Math.cos()


Автор: malah 28.2.2008, 23:14
Сестра попросила вычислить значения cos(a)^2 для углов от 0 до 360 градусов с шагом в 15 градусов...
написал следующее...
Код

import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
/**
 *
 * @author sergey.malahov
 */
public class Cos extends JFrame{
    String[] header = new String[]{"Угол", "Cos()","Cos()^2"};
    String [][] body = new String [25][3];
    Cos(){
        super("Таблица значений косинуса");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        for(int i = 0; i < 25; i++){
            body[i][0] = Integer.toString(15*i);
            body[i][1] = Double.toString(Math.cos(Math.toRadians(i*15)));            
            body[i][2] = Double.toString(Math.cos(i*15*2*Math.PI/360)*Math.cos(i*15*2*Math.PI/360));
        }        
        JTable table = new JTable(body,header);
        table.setRowHeight(20);
        table.setFont(new Font(Font.SERIF,Font.TRUETYPE_FONT,14));
        getContentPane().add(new JScrollPane(table));
        setSize(300,560);
        setVisible(true);        
    }
    public static void main(String[] args){
        new Cos();
    }
}


то что я увидел далее меня поразило....

http://ipicture.ru/uploads/080228/VCzJ6VxBer.jpg 

так что вопрос: кто нибудь может рассказать почему так или как так получилось? 

Автор: niasilil 28.2.2008, 23:25
прогнал код, увидел что 6.123233995736766E-17 трансформируется в 6.1232339 когда используешь toString

Автор: malah 28.2.2008, 23:37
То есть toString халявит... А как выходить из такого положения, мысли есть?

Автор: niasilil 28.2.2008, 23:41
Код

    DecimalFormat f = new DecimalFormat("#.######");

    Cos() {
// skipped

        for (int i = 0; i < 25; i++) {
            body[i][0] = Integer.toString(15 * i);
            body[i][1] = f.format(Math.cos(Math.toRadians(i * 15)));
            body[i][2] = f.format(Math.cos(i * 15 * 2 * Math.PI / 360)
                    * Math.cos( i * 15 * 2 * Math.PI / 360));
        }
    }

Автор: malah 28.2.2008, 23:46
Спасибо за ответ )
p.s. только что заметил свой косяк.... нужно фрейм делать было шире smile 

Автор: niasilil 28.2.2008, 23:57
кстати, есть такая штука как статик импорт, очень удобно в случае если переменная или метод используется много раз в классе. В случае Math классов часто задалбывает писать Math.cos() 
Код

import java.text.DecimalFormat;
import static java.lang.Math.PI;
import static java.lang.Math.cos;

public class Test {
    String[][] body = new String[25][3];

    DecimalFormat f = new DecimalFormat("#.####");

    Test() {
        for (int i = 0; i < 25; i++) {
            body[i][0] = Integer.toString(15 * i);
            body[i][1] = f.format(cos(Math.toRadians(i * 15)));
            body[i][2] = f.format(cos(i * 15 * 2 * PI / 360) * cos(i * 15 * 2 * PI / 360));

            System.out.println(body[i][0]+ "\t"+ body[i][1] + "\t" + body[i][2]);
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}

Автор: malah 29.2.2008, 09:11
 smile  спасибо за совет! действительно так намного красивше...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)