2013-08-06 2 views
0

Я немного работаю над своим математическим парсером, и я понял, что немного кода, который я использую, не может обрабатывать экспонента, который не является межсетевым. Бит кода, который я использую, кажется, отлично работает с int, но не с double.Вычисление нецелых показателей в iOS

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)

+2

По какой-либо причине вы не используете 'pow()' для возведения в степень? – Sebastian

+0

Я никогда не был до этого момента, чтобы использовать его. Я довольно самоучкой. Но спасибо, еще один инструмент, который я не знал о добавлении в панель инструментов. –

+0

@JoeMillion. Кроме того, FYI, второй операнд называется «экспонентом», а не «exponate». –

ответ

4

Пусть library code сделать работу за вас:

double exponent = [[self popOperand] doubleValue]; 
double base = [[self popOperand] doubleValue]; 

[self.operandStack addObject:@(pow(base, exponent))]; 
+0

Не забудьте '#include ' –

2

Ответ Джоша прав, я просто хотел бы добавить что-нибудь об использовании поплавков в условиях:

double exponate = [[self popOperand] intValue]; 
exponate--; 
while (exponate) 
{ 
    result *= base; 
    exponate--; 
} 

Это может привести к бесконечный цикл из-за округления erros while (exponate) никогда не может быть оценен до false. Если вы используете doubles или floats в качестве переменных цикла, всегда делайте что-то вроде while (myFloat > 0.0)

 Смежные вопросы

  • Нет связанных вопросов^_^