1 回答

TA貢獻1835條經驗 獲得超7個贊
您的程序中發生了很多事情以及一些不必要的代碼。不過,你走在正確的軌道上。我做了一些更改以簡化計算。你應該能夠跟隨他們。
具體來說。
交替標志。從 開始
sign = 1
,然后設置sign = -sign
后續術語。對于分母和階乘,我只使用了 for 循環,從 1 開始,遞增 2 得到 1,3,5,7
對于相同值的冪,我只需乘以
d
一個dSquared
常數即可達到相同的效果。我重寫了階乘以使其更簡單。
為了減少較大的值,
d
我只是使用remainder
運算符使它們小于 360。我添加了一些打印語句來顯示計算進度并確保一切正常工作。
最后,適合 long 的最大階乘是
20!
。之后,它們會因溢出而變為負數。因此需要減少項數。
public class Sine {
public static void main(String[] args) {
// This code solves sine according yo the general expansion of sine
// sin x = x - x3/3! +x^5/5! - x^7/7! +...
for (double degrees = 0; degrees < 700; degrees += 17) {
double simplified_degrees = simplify(degrees);
System.out.println("simplified_degrees = " + simplified_degrees);
double radians = converttoradian(simplified_degrees);
System.out.println("radians = " + radians);
double sin = continued(radians);
System.out.println(sin);
System.out.println(Math.sin(radians));
System.out.println("------------------------------------------");
}
}
// This Makes all the angles that are more than 360
// To become less than 360 and Generates the simplified
// Angles for obtuse and reflex angles
static double simplify(double x) {
x = x % 360;
return x;
}
// Simple enough and explains itself
// Converts the angles to radian
static double converttoradian(double d) {
return Math.PI / 180. * d;
}
// This Method about to open generates each term and adds them together
// The number of terms solved in this case is 33
static double continued(double d) {
double result = 0;
double sign = 1;
double dSquared = d * d;
int pow = 1;
for (int pow = 1; pow < 21; pow += 2) {
long fact = factorial(pow);
System.out.println("d = " + d + ", fact = " + fact + ", pow = " + pow
+ ", sign = " + sign);
result = result + (d / fact) * sign;
d *= dSquared; // effective powers 3, 5, 7,9
sign = -sign; // alternate sign for every other term
}
return result;
}
// Evaluates factorials
static long factorial(int n) {
if (n == 0 || n == 1) {
return 1;
}
long fact = 1;
for (long i = 2; i <= n; i++) {
fact *= i;
}
return fact;
}
}
添加回答
舉報