作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谁能告诉我为什么这段代码不起作用?我正在尝试实现具有给定精度限制的正弦函数(通过误差变量)。
此处给出了有关计算的某些详细信息:https://en.wikipedia.org/wiki/Taylor_series
berechnePot 计算电势berechneFak 计算教师berechneVZW 计算预号(加号或减号)
我不明白为什么函数计算得那么慢。
public class Sinus {
public static double sinus(double x) {
double error = 0.001;
double summand = 0;
double sum = 0;
int k = 0;
do {
double pot = 0;
double fak = 0;
pot = berechnePot(x, k);
fak = berechneFak(k);
summand = pot / fak;
berechneVZW(summand, k);
sum += summand;
k++;
} while (abs(summand) > error);
return sum;
}
public static double abs(double value) {
if (value < 0) return -value;
else return value;
}
public static double berechneVZW(double value, int k) {
if (k % 2 == 0) {
return value;
} else {
return value *= (-1);
}
}
public static double berechnePot(double x, double k) {
double pot = 0;
pot += x;
for (int i = 0; i <= k; i++) {
pot *= (x * x);
}
return pot;
}
public static double berechneFak(int k) {
double fak = 1;
if (k == 0) {
return 1;
} else {
for (int i = 0; i <= k; k++) {
fak *= (2 * i + 1);
}
}
return fak;
}
}
终于找到了正确的解决方案..
希望新结构能帮助您更好地理解我的实现。
感谢您的帮助!
public class Sinus {
public static double sinus(double x) {
double error = 0.00001;
double summand = 0;
double result = 0;
double fak = 0;
int k = 0;
do {
double pot = 0;
pot = calcNumeratorPotency(x, k);
fak = calcDenumeratorFaculty(k);
summand = pot / fak;
summand = definePreSign(summand, k);
result += summand;
k++;
} while (absoluteValue(summand) > error);
return result;
}
public static double absoluteValue(double value) {
if (value < 0)
return -value;
else
return value;
}
public static double definePreSign(double value, int k) {
if (k % 2 == 0) {
return value;
} else {
return value * (-1);
}
}
public static double calcNumeratorPotency(double x, double k) {
double pot = x;
for (int i = 0; i < 2 * k; i++) {
pot *= x;
}
return pot;
}
public static double calcDenumeratorFaculty(int k) {
double fak = 1;
if (k == 0) {
return 1;
} else {
for (int i = 1; i <= (2 * k + 1); i++) {
fak *= i;
}
}
return fak;
}
最佳答案
您之前似乎使用过另一种语言。 Java 的工作方式与您的预期略有不同。
for (int i = 0; i <= k; k++) {
fak *= (2 * i + 1);
}
这个特定的循环显然没有按预期工作。您递增 k
,但 i
应该增长?可能你想写:
for (int i = 0; i <= k; i++) {
fak *= (2 * i + 1);
}
因为循环计数 k
,而不是 i
,它会继续,直到 k 超出整数范围并变为 Integer.MIN_VALUE
。到那时,您的循环终于终止了。 :)
在一个完全不同的说明上,作为建设性的批评:您可能想看一下默认的 Java 风格指南 (https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/styleguide.md)
小摘录:
// Bad.
// - This offers poor visual separation of operations.
int foo=a+b+1;
// Good.
int foo = a + b + 1;
标识符和运算符之间的空格非常非常有用,可以处理数字,但也可以处理很多不同的东西。
关于java - 执行窦功能 |计算时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54380559/
我是一名优秀的程序员,十分优秀!