This progam:
import std.math;
import std.stdio;
import std.typetuple;
ulong log2(ulong n)
{
return n == 1 ? 0
: 1 + log2(n / 2);
}
void print(ulong value)
{
writefln("%s: %s %s", value, log2(value), std.math.log2(value));
}
void main()
{
foreach(T; TypeTuple!(byte, ubyte, short, ushort, int, uint, long, ulong))
print(T.max);
}
prints out
127: 6 6.98868
255: 7 7.99435
32767: 14 15
65535: 15 16
2147483647: 30 31
4294967295: 31 32
9223372036854775807: 62 63
18446744073709551615: 63 64
So, the question is: Is std.math.log2 buggy, or is it just an issue with the
fact that std.math.log2 is using reals, or am I completely misunderstanding
something here?
- Jonathan M Davis