gpt4 book ai didi

java - EXP4J : can't get a good factorial operator working

转载 作者:行者123 更新时间:2023-11-30 01:31:53 29 4
gpt4 key购买 nike

我声明了以下阶乘运算符:

Operator factorial = new Operator("!", 1, true, Operator.PRECEDENCE_POWER + 1) {
@Override public double apply(double... args) {
final long arg = (long) args[0];
if ((double) arg != args[0]) {
throw new IllegalArgumentException("Operand for factorial has to be an integer");
}
if (arg < 0) {
throw new IllegalArgumentException("The operand of the factorial can not " +
"be " +
"less than zero");
}
double result = 1;
for (int i = 1; i <= arg; i++) {
result *= i;
}
return result;
}
};

因此,当您使用简单的表达式(如 5! 等)时,它工作正常,但当您尝试模拟正常的计算器行为时,事情就开始崩溃了。以下示例抛出 IllegalArgumentException():

5!+5

为什么?我猜它与 2 个相邻的运算符或其他东西有关,因为使用 (5!)+5 没有问题。

这对我正在从事的项目来说是毁灭性的。有人建议将运算符转换为函数,但这会花费太多时间。我试过更改所有构造函数参数,但没有一个能解决问题。

最佳答案

我找到了一种解决方法,可以使阶乘按预期运行。诀窍是添加第二个变量并使阶乘成为伪单元运算符,因此:

我使用的不是:5!+5:5!(1)+5。这不需要在我的程序中进行重构,因为所做的唯一更改是输入运算符的方式。

这样,解析器就可以很好地工作了。您还需要将实际的 Operator 声明更改为:

Operator factorial = new Operator("!", 2, true, Operator.PRECEDENCE_POWER + 1) {
@Override public double apply(double... args) {
final long arg = (long) args[0];
if ((double) arg != args[0]) {
throw new IllegalArgumentException("Operand for factorial has to be an integer");
}
if (arg < 0) {
throw new IllegalArgumentException("The operand of the factorial can not " +
"be " +
"less than zero");
}
double result = 1;
for (int i = 1; i <= arg; i++) {
result *= i;
}
return result;
}
};

我认为在使用 EXP4J 时应该完全避免使用一元运算符。

关于java - EXP4J : can't get a good factorial operator working,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35632717/

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