--- /dev/null
+def max_positive list {
+ let result = 0
+
+ list.each => element {
+ result = element if element > result
+ }
+
+ result
+}
+
+def factors num {
+ let list = []
+ let candidate = 2
+ let max = math::sqrt num
+ while candidate <= max {
+ list.push candidate if num %% candidate
+ candidate = candidate + 1
+ }
+ list
+}
+
+def prime? num {
+ factors(num).length == 0
+}
+
+println max_positive factors(600851475143).filter => num { prime? num }
trim_bigint(result);
- hInteger ret = finalize_bigint(a, b, result);
-
- return ret;
+ return finalize_bigint(a, b, result);
}
}
if (!is_bigint(a)) {
return (double)a;
} else {
- PANIC("agh! i haven't done this!");
+ bigint *big = find_bigint_for_handle(a);
+ i8 sgn = int_sign(big, a);
+ isize size = int_size(big);
+ double result = 0.0;
+ for (isize i = size - 1; i >= 0; i--) {
+ /* this definitely loses precision. i wonder if there is a better way to do this */
+ result *= BIGINT_PIECE_MAX;
+ result += int_piece(big, a, i);
+ }
+
+ if (sgn < 0) result *= -1;
+
+ return result;
}
}
#include "data/value.h"
-#define SARABANDE_INT_MAX ((1LL << 31) - 1)
-#define SARABANDE_INT_MIN (-(1LL << 31) + 1)
+#define SARABANDE_INT_MAX ((1LL << 48) - 1)
+#define SARABANDE_INT_MIN (-(1LL << 48) + 1)
void sbInteger_sys_init();
usize sbInteger_snprint(char *buf, usize size, hInteger a);
+double sbInteger_as_double(hInteger a);
+
void sbInteger_method(hVm vm);
#include "data/list.h"
#include "data/string.h"
#include "data/symbol.h"
+#include "data/integer.h"
#include "vm/exec.h"
#include <math.h>
double original_value;
if (argument->type == IT_INTEGER) {
- original_value = (double)argument->integer;
- printf("%g\n", original_value);
+ original_value = sbInteger_as_double(argument->integer);
} else if (argument->type == IT_FLOAT) {
original_value = argument->float_val;
} else {