gpt4 book ai didi

java - 执行窦功能 |计算时间

转载 作者:行者123 更新时间:2023-12-02 14:53:18 25 4
gpt4 key购买 nike

谁能告诉我为什么这段代码不起作用?我正在尝试实现具有给定精度限制的正弦函数(通过误差变量)。

此处给出了有关计算的某些详细信息:https://en.wikipedia.org/wiki/Taylor_series

berechnePot 计算电势berechneFak 计算教师berechneVZW 计算预号(加号或减号)

enter image description here

我不明白为什么函数计算得那么慢。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com