diff options
| -rw-r--r-- | GNUmakefile | 11 | ||||
| -rw-r--r-- | MLKDoubleFloat.h | 3 | ||||
| -rw-r--r-- | MLKDoubleFloat.m | 120 | ||||
| -rw-r--r-- | MLKSingleFloat.m | 132 | 
4 files changed, 261 insertions, 5 deletions
| diff --git a/GNUmakefile b/GNUmakefile index 41b42c1..12b622d 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -18,11 +18,12 @@  include $(GNUSTEP_MAKEFILES)/common.make  TOOL_NAME = etoilisp -etoilisp_OBJC_FILES = MLKCharacter.m MLKCons.m MLKDynamicContext.m		\ -                      MLKEndOfFileError.m MLKEnvironment.m MLKError.m		\ -                      MLKFloat.m MLKInteger.m MLKLinkedList.m			\ -                      MLKLispValue.m MLKPackage.m MLKRatio.m MLKReader.m	\ -                      MLKReadtable.m MLKReaderError.m MLKStream.m		\ +etoilisp_OBJC_FILES = MLKCharacter.m MLKCons.m MLKDoubleFloat.m			\ +                      MLKDynamicContext.m MLKEndOfFileError.m			\ +                      MLKEnvironment.m MLKError.m MLKFloat.m			\ +                      MLKInteger.m MLKLinkedList.m MLKLispValue.m		\ +                      MLKPackage.m MLKRatio.m MLKReader.m MLKReadtable.m	\ +                      MLKReaderError.m MLKSingleFloat.m MLKStream.m		\                        MLKSymbol.m MLKThrowException.m				\                        MLKUndefinedVariableException.m diff --git a/MLKDoubleFloat.h b/MLKDoubleFloat.h index b915584..d7dbcd5 100644 --- a/MLKDoubleFloat.h +++ b/MLKDoubleFloat.h @@ -38,6 +38,9 @@                                        exponent:(NSString *)exponent                                exponentNegative:(BOOL)exponentNegative; +-(MLKDoubleFloat *) initWithDouble:(double)aDouble; ++(MLKDoubleFloat *) doubleFloatWithDouble:(double)aDouble; +  -(float) floatValue;  -(double) doubleValue; diff --git a/MLKDoubleFloat.m b/MLKDoubleFloat.m new file mode 100644 index 0000000..98daa09 --- /dev/null +++ b/MLKDoubleFloat.m @@ -0,0 +1,120 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008  Matthias Andreas Benkard. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKSingleFloat.h" +#import "MLKDoubleFloat.h" + +#import <Foundation/NSString.h> + +#include <stdio.h> + + +@implementation MLKDoubleFloat +-(MLKDoubleFloat *) initWithIntegerPart:(NSString *)intPart +                               negative:(BOOL)negative +                         fractionalPart:(NSString *)fractPart +                               exponent:(NSString *)exponent +                       exponentNegative:(BOOL)exponentNegative +{ +  self = [super init]; +  sscanf ([[NSString stringWithFormat:@"%c%@.%@e%c%@", +                     (negative ? '-' : '+'), +                     intPart, +                     fractPart, +                     (exponentNegative ? '-' : '+'), +                     ([exponent length] > 0 ? (id)exponent : (id)@"0")] +            UTF8String], +          "%lf", +          &value); +  return self; +} + ++(MLKDoubleFloat *) doubleFloatWithIntegerPart:(NSString *)intPart +                                      negative:(BOOL)negative +                                fractionalPart:(NSString *)fractPart +                                      exponent:(NSString *)exponent +                              exponentNegative:(BOOL)exponentNegative +{ +  return AUTORELEASE ([[self alloc] initWithIntegerPart:intPart +                                    negative:negative +                                    fractionalPart:fractPart +                                    exponent:exponent +                                    exponentNegative:exponentNegative]); +} + +-(MLKDoubleFloat *) initWithDouble:(double)aDouble +{ +  self = [super init]; +  value = aDouble; +  return self; +} + ++(MLKDoubleFloat *) doubleFloatWithDouble:(double)aDouble +{ +  return AUTORELEASE ([[self alloc] initWithDouble:aDouble]); +} + +-(float) floatValue +{ +  return value; +} + +-(double) doubleValue +{ +  return value; +} + +-(MLKFloat *) add:(MLKFloat *)arg +{ +  return [MLKDoubleFloat doubleFloatWithDouble:(value + [arg doubleValue])]; +} + +-(MLKFloat *) subtract:(MLKFloat *)arg +{ +  return [MLKDoubleFloat doubleFloatWithDouble:(value - [arg doubleValue])]; +} + +-(MLKFloat *) multiplyWith:(MLKFloat *)arg +{ +  return [MLKDoubleFloat doubleFloatWithDouble:(value * [arg doubleValue])]; +} + +-(MLKFloat *) divideBy:(MLKFloat *)arg +{ +  return [MLKDoubleFloat doubleFloatWithDouble:(value / [arg doubleValue])]; +} + +-(NSString *) description +{ +  NSString *str = [NSString stringWithFormat:@"%e", value]; +  int i; + +  for (i = 0; i < [str length]; i++) +    { +      if ([str characterAtIndex:i] == 'e') +        { +          str = [NSString stringWithFormat:@"%@d%@", +                          [str substringToIndex:i], +                          [str substringFromIndex:(i+1)]]; +          return str; +        } +    } + +  return [NSString stringWithFormat:@"%@d0",str]; +} +@end diff --git a/MLKSingleFloat.m b/MLKSingleFloat.m new file mode 100644 index 0000000..76965ec --- /dev/null +++ b/MLKSingleFloat.m @@ -0,0 +1,132 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008  Matthias Andreas Benkard. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#import "MLKSingleFloat.h" +#import "MLKDoubleFloat.h" + +#import <Foundation/NSString.h> + +#include <stdio.h> + + +@implementation MLKSingleFloat +-(MLKSingleFloat *) initWithIntegerPart:(NSString *)intPart +                               negative:(BOOL)negative +                         fractionalPart:(NSString *)fractPart +                               exponent:(NSString *)exponent +                       exponentNegative:(BOOL)exponentNegative +{ +  self = [super init]; +  sscanf ([[NSString stringWithFormat:@"%c%@.%@e%c%@", +                     (negative ? '-' : '+'), +                     intPart, +                     fractPart, +                     (exponentNegative ? '-' : '+'), +                     ([exponent length] > 0 ? (id)exponent : (id)@"0")] +            UTF8String], +          "%f", +          &value); +  return self; +} + ++(MLKSingleFloat *) singleFloatWithIntegerPart:(NSString *)intPart +                                      negative:(BOOL)negative +                                fractionalPart:(NSString *)fractPart +                                      exponent:(NSString *)exponent +                              exponentNegative:(BOOL)exponentNegative +{ +  return AUTORELEASE ([[self alloc] initWithIntegerPart:intPart +                                    negative:negative +                                    fractionalPart:fractPart +                                    exponent:exponent +                                    exponentNegative:exponentNegative]); +} + +-(MLKSingleFloat *) initWithFloat:(float)aFloat +{ +  self = [super init]; +  value = aFloat; +  return self; +} + ++(MLKSingleFloat *) singleFloatWithFloat:(float)aFloat +{ +  return AUTORELEASE ([[self alloc] initWithFloat:aFloat]); +} + +-(float) floatValue +{ +  return value; +} + +-(double) doubleValue +{ +  return value; +} + +-(MLKFloat *) add:(MLKFloat *)arg +{ +  if ([arg isKindOfClass:[MLKDoubleFloat class]]) +    return [MLKDoubleFloat doubleFloatWithDouble:(value + [arg doubleValue])]; +  else +    return [MLKSingleFloat singleFloatWithFloat:(value + [arg floatValue])]; +} + +-(MLKFloat *) subtract:(MLKFloat *)arg +{ +  if ([arg isKindOfClass:[MLKDoubleFloat class]]) +    return [MLKDoubleFloat doubleFloatWithDouble:(value - [arg doubleValue])]; +  else +    return [MLKSingleFloat singleFloatWithFloat:(value - [arg floatValue])]; +} + +-(MLKFloat *) multiplyWith:(MLKFloat *)arg +{ +  if ([arg isKindOfClass:[MLKDoubleFloat class]]) +    return [MLKDoubleFloat doubleFloatWithDouble:(value * [arg doubleValue])]; +  else +    return [MLKSingleFloat singleFloatWithFloat:(value * [arg floatValue])]; +} + +-(MLKFloat *) divideBy:(MLKFloat *)arg +{ +  if ([arg isKindOfClass:[MLKDoubleFloat class]]) +    return [MLKDoubleFloat doubleFloatWithDouble:(value / [arg doubleValue])]; +  else +    return [MLKSingleFloat singleFloatWithFloat:(value / [arg floatValue])]; +} + +-(NSString *) description +{ +  NSString *str = [NSString stringWithFormat:@"%e", value]; +  int i; + +  for (i = 0; i < [str length]; i++) +    { +      if ([str characterAtIndex:i] == 'e') +        { +          str = [NSString stringWithFormat:@"%@s%@", +                          [str substringToIndex:i], +                          [str substringFromIndex:(i+1)]]; +          return str; +        } +    } + +  return [NSString stringWithFormat:@"%@s0",str]; +} +@end | 
