Removed primitive byte-array>bignum and digit_stream_to_bignum from vm/.
: random-integer ( n -- n' )
dup log2 7 + 8 /i 1 +
- [ random-bytes >byte-array byte-array>bignum ]
+ [ random-bytes le> ]
[ 3 shift 2^ ] bi / * >integer ;
PRIVATE>
\ bits>double { integer } { float } define-primitive \ bits>double make-foldable
\ bits>float { integer } { float } define-primitive \ bits>float make-foldable
\ both-fixnums? { object object } { object } define-primitive
-\ byte-array>bignum { byte-array } { bignum } define-primitive \ byte-array>bignum make-foldable
\ callstack { } { callstack } define-primitive \ callstack make-flushable
\ callstack-bounds { } { alien alien } define-primitive \ callstack-bounds make-flushable
\ callstack-for { c-ptr } { callstack } define-primitive \ callstack make-flushable
{ "load-locals" "locals.backend" "primitive_load_locals" (( ... n -- )) }
{ "bits>double" "math" "primitive_bits_double" (( n -- x )) }
{ "bits>float" "math" "primitive_bits_float" (( n -- x )) }
- { "byte-array>bignum" "math" "primitive_byte_array_to_bignum" (( x -- y )) }
{ "double>bits" "math" "primitive_double_bits" (( x -- n )) }
{ "float>bits" "math" "primitive_float_bits" (( x -- n )) }
{ "(format-float)" "math.parser.private" "primitive_format_float" (( n format -- byte-array )) }
USING: io.binary tools.test classes math ;
IN: io.binary.tests
+[ HEX: 03020100 ] [ B{ 0 1 2 3 } le> ] unit-test
+[ HEX: 00010203 ] [ B{ 0 1 2 3 } be> ] unit-test
+
+[ HEX: 332211 ] [
+ B{ HEX: 11 HEX: 22 HEX: 33 } le>
+] unit-test
+
+[ HEX: 7a2c793b2ff08554 ] [
+ B{ HEX: 54 HEX: 85 HEX: f0 HEX: 2f HEX: 3b HEX: 79 HEX: 2c HEX: 7a } le>
+] unit-test
+
+[ HEX: 988a259c3433f237 ] [
+ B{ HEX: 37 HEX: f2 HEX: 33 HEX: 34 HEX: 9c HEX: 25 HEX: 8a HEX: 98 } le>
+] unit-test
+
[ B{ 0 0 4 HEX: d2 } ] [ 1234 4 >be ] unit-test
[ B{ 0 0 0 0 0 0 4 HEX: d2 } ] [ 1234 8 >be ] unit-test
[ B{ HEX: d2 4 0 0 } ] [ 1234 4 >le ] unit-test
USING: kernel math sequences ;
IN: io.binary
-: le> ( seq -- x ) B{ } like byte-array>bignum >integer ;
-: be> ( seq -- x ) <reversed> le> ;
+: le> ( seq -- x ) dup length iota 0 [ 8 * shift + ] 2reduce ;
+: be> ( seq -- x ) 0 [ [ 8 shift ] dip + ] reduce ;
: mask-byte ( x -- y ) HEX: ff bitand ; inline
[ 14 ] [ 13 2 align ] unit-test
[ 11 ] [ 11 1 align ] unit-test
-[ HEX: 332211 ] [
- B{ HEX: 11 HEX: 22 HEX: 33 } byte-array>bignum
-] unit-test
-
-[ HEX: 7a2c793b2ff08554 ] [
- B{ HEX: 54 HEX: 85 HEX: f0 HEX: 2f HEX: 3b HEX: 79 HEX: 2c HEX: 7a } byte-array>bignum
-] unit-test
-
-[ HEX: 988a259c3433f237 ] [
- B{ HEX: 37 HEX: f2 HEX: 33 HEX: 34 HEX: 9c HEX: 25 HEX: 8a HEX: 98 } byte-array>bignum
-] unit-test
-
[ t ] [ 256 power-of-2? ] unit-test
[ f ] [ 123 power-of-2? ] unit-test
{ $description "Applies the quotation to each integer from " { $snippet "n" } " down to 0, inclusive. Iteration stops when the quotation outputs a true value or 0 is reached. If the quotation yields a true value for some integer, the word outputs that integer. Otherwise, the word outputs " { $link f } "." }
{ $notes "This word is used to implement " { $link find-last } "." } ;
-HELP: byte-array>bignum
-{ $values { "x" byte-array } { "y" bignum } }
-{ $description "Converts a byte-array, interpreted as little-endian, into a bignum integer. User code should call " { $link le> } " or " { $link be> } " instead." } ;
-
ARTICLE: "division-by-zero" "Division by zero"
"Behavior of division operations when a denominator of zero is used depends on the data types in question, as well as the platform being used."
$nl
ERROR: unknown-ifd-type n ;
: bytes>bits ( n/byte-array -- n )
- dup byte-array? [ byte-array>bignum ] when ;
+ dup byte-array? [ le> ] when ;
: value-length ( ifd-entry -- n )
[ count>> ] [ type>> ] bi {
return (digit & mask) ? 1 : 0;
}
-/* Allocates memory */
-bignum *factor_vm::digit_stream_to_bignum(unsigned int n_digits, unsigned int (*producer)(unsigned int, factor_vm*), unsigned int radix, int negative_p)
-{
- BIGNUM_ASSERT ((radix > 1) && (radix <= BIGNUM_RADIX_ROOT));
- if (n_digits == 0)
- return (BIGNUM_ZERO ());
- if (n_digits == 1)
- {
- fixnum digit = ((fixnum) ((*producer) (0,this)));
- return (fixnum_to_bignum (negative_p ? (- digit) : digit));
- }
- {
- bignum_length_type length;
- {
- unsigned int radix_copy = radix;
- unsigned int log_radix = 0;
- while (radix_copy > 0)
- {
- radix_copy >>= 1;
- log_radix += 1;
- }
- /* This length will be at least as large as needed. */
- length = (BIGNUM_BITS_TO_DIGITS (n_digits * log_radix));
- }
- {
- bignum * result = (allot_bignum_zeroed (length, negative_p));
- while ((n_digits--) > 0)
- {
- bignum_destructive_scale_up (result, ((bignum_digit_type) radix));
- bignum_destructive_add
- (result, ((bignum_digit_type) ((*producer) (n_digits,this))));
- }
- return (bignum_trim (result));
- }
- }
-}
-
}
bignum_comparison_greater = 1
};
-bignum * digit_stream_to_bignum(unsigned int n_digits, unsigned int (*producer)(unsigned int,factor_vm*), unsigned int radix, int negative_p);
-
}
return parent->bignum_producer(digit);
}
-void factor_vm::primitive_byte_array_to_bignum()
-{
- unsigned int n_digits = (unsigned int)array_capacity(untag_check<byte_array>(ctx->peek()));
- bignum * result = digit_stream_to_bignum(n_digits,factor::bignum_producer,0x100,0);
- ctx->replace(tag<bignum>(result));
-}
-
cell factor_vm::unbox_array_size_slow()
{
if(tagged<object>(ctx->peek()).type() == BIGNUM_TYPE)
_(bits_double) \
_(bits_float) \
_(byte_array) \
- _(byte_array_to_bignum) \
_(callback) \
_(callstack) \
_(callstack_bounds) \
bignum *bignum_integer_length(bignum * x);
int bignum_logbitp(int shift, bignum * arg);
int bignum_unsigned_logbitp(int shift, bignum * bignum);
- bignum *digit_stream_to_bignum(unsigned int n_digits, unsigned int (*producer)(unsigned int, factor_vm *), unsigned int radix, int negative_p);
//data heap
void init_card_decks();
void primitive_bignum_bitp();
void primitive_bignum_log2();
unsigned int bignum_producer(unsigned int digit);
- void primitive_byte_array_to_bignum();
inline cell unbox_array_size();
cell unbox_array_size_slow();
void primitive_fixnum_to_float();