我一直在研究我的数学解析器,我意识到我使用的一些代码无法处理非整数的指数。我使用的这段代码似乎与int
配合得很好,但与double
配合不好。
else if ([[token stringValue] isEqualToString: @"^"])
{
NSLog(@"^");
double exponate = [[self popOperand] intValue];
double base = [[self popOperand] doubleValue];
result = base;
exponate--;
while (exponate)
{
result *= base;
exponate--;
}
[self.operandStack addObject: [NSNumber numberWithDouble: result]];
}
'使用Objective-C,我如何使类似5^5.5的东西正确评估?(6987.71242969)
让库代码为您完成工作:
double exponent = [[self popOperand] doubleValue];
double base = [[self popOperand] doubleValue];
[self.operandStack addObject:@(pow(base, exponent))];
Josh的回答是对的,我只是想添加一些关于在条件下使用浮点的内容:
double exponate = [[self popOperand] intValue];
exponate--;
while (exponate)
{
result *= base;
exponate--;
}
这可能导致无限循环,因为舍入误差while (exponate)
可能永远不会计算为false
。如果使用doubles
或floats
作为循环变量,请始终执行类似while (myFloat > 0.0)
的操作