From e60a004c48a14d0b5bb109fe7be5552643289925 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Mon, 16 Jun 2008 11:32:38 +0200 Subject: Add classes MLKDoubleFloat and MLKSingleFloat. --- GNUmakefile | 11 ++--- MLKDoubleFloat.h | 3 ++ MLKDoubleFloat.m | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++ MLKSingleFloat.m | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 261 insertions(+), 5 deletions(-) create mode 100644 MLKDoubleFloat.m create mode 100644 MLKSingleFloat.m 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 . + */ + +#import "MLKSingleFloat.h" +#import "MLKDoubleFloat.h" + +#import + +#include + + +@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 . + */ + +#import "MLKSingleFloat.h" +#import "MLKDoubleFloat.h" + +#import + +#include + + +@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 -- cgit v1.2.3