With the version of std.bigint packaged with dmd2.047 (on winxp / x86) 1. You get 'object.Error: Win32 Exception' when attempting any BigInt % BigInt(1) or BigInt % 1. Test case: import std.bigint; void main() { auto r1 = BigInt(6) % 1; auto r2 = BigInt(6) % BigInt(1); } 2. BigInt % BigInt(0) seems to go into an infinite loop import std.bigint; void main() { auto r = BigInt(6) % BigInt(0); }
The following tests should succeed when this issue has been fixed: unittest { try { scope(success) assert(0); auto r1 = BigInt(6) % BigInt(0); } catch {} try { scope(success) assert(0); auto r1 = BigInt(6) % 0; } catch {} assert(BigInt(6) % BigInt(1) == 1); assert(BigInt(6) % 1 == 1); assert(BigInt(-6) % BigInt(-1) == -1); assert(BigInt(-6) % -1 == -1); }
My bad! That should be: unittest { try { scope(success) assert(0); auto r1 = BigInt(6) % BigInt(0); } catch {} try { scope(success) assert(0); auto r1 = BigInt(6) % 0; } catch {} assert(BigInt(6) % BigInt(1) == 0); assert(BigInt(6) % 1 == 0); assert(BigInt(-6) % BigInt(-1) == 0); assert(BigInt(-6) % -1 == 0); }
This seems to crash with every power of two, int or BigInt. import std.bigint; void main() { foreach(a; 0..1000) { foreach(b; 0..1000) { try { scope(failure) writeln(a, " % ", b, " failed"); auto x = BigInt(a) % b; } catch {} try { scope(failure) writeln(a, " % BigInt(", b, ") failed"); auto x = BigInt(a) % BigInt(b); } catch {} } } }
Fixed svn 1764. The 'power of 2' bug was already fixed in svn 1673.