summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GNUmakefile11
-rw-r--r--MLKDoubleFloat.h3
-rw-r--r--MLKDoubleFloat.m120
-rw-r--r--MLKSingleFloat.m132
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