// // MPPowerFunction.m // MathPad // // Created by Kim Wittenburg on 30.09.14. // Copyright (c) 2014 Kim Wittenburg. All rights reserved. // #import "MPPowerFunction.h" #import "MPExpression.h" #import "MPExpressionTree.h" #import "MPValueGroup.h" @implementation MPPowerFunction MPFunctionAccessorImplementation(ExponentExpression, _exponentExpression) - (NSArray *)childrenAccessors { return @[@"exponentExpression"]; } - (BOOL)validate:(NSError *__autoreleasing *)error { if (!self.baseValue) { if (error) { *error = MPParseError(11, NSLocalizedString(@"No Base For Power.", @"Error message. This is displayed when a power does not have a base value."), nil); } return NO; } return [self.baseValue validate:error] && [[self.exponentExpression parse] validate:error]; } - (NSDecimalNumber *)evaluate { NSDecimalNumber *base = [self.baseValue evaluate]; NSDecimalNumber *exponent = [[self.exponentExpression parse] evaluate]; if ([base isEqualToNumber:@(0)] && [exponent isEqualToNumber:@(0)]) { // The C pow function returns 1 for pow(0, 0). Mathematically this should be undefined. return [NSDecimalNumber notANumber]; } return [[NSDecimalNumber alloc] initWithDouble:pow(base.doubleValue, exponent.doubleValue)]; } - (NSString *)description { return [NSString stringWithFormat:@"^%@", self.exponentExpression.description]; } @end