digitalmars.D.learn - recursive template at ctfe
- bioinfornatics (6/6) Nov 26 2013 Hi,
- bearophile (6/10) Nov 26 2013 Instead of template recursion, have you tried regular code run at
- bioinfornatics (2/13) Nov 26 2013 Thanks i will take a look
- bioinfornatics (6/24) Nov 26 2013 this one seem to be interesting
- Shammah Chancellor (19/41) Nov 26 2013 I think you just have a bug in your template code not terminating. At
- bioinfornatics (3/51) Nov 26 2013 Thanks your way is much easier to write, works fine :-)
- Shammah Chancellor (22/70) Nov 26 2013 I would suggest turning it into a compile-time-function though as this
- Shire (39/39) Apr 06 2014 Another one ctfe log2, integer and real versions:
Hi, I wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd That works for small number but after i got an error about limit recursion how to work around this in my case ?
Nov 26 2013
bioinfornatics:I wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd That works for small number but after i got an error about limit recursionInstead of template recursion, have you tried regular code run at compile time? http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious Bye, bearophile
Nov 26 2013
On Tuesday, 26 November 2013 at 20:29:00 UTC, bearophile wrote:bioinfornatics:Thanks i will take a lookI wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd That works for small number but after i got an error about limit recursionInstead of template recursion, have you tried regular code run at compile time? http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious Bye, bearophile
Nov 26 2013
On Tuesday, 26 November 2013 at 20:50:13 UTC, bioinfornatics wrote:On Tuesday, 26 November 2013 at 20:29:00 UTC, bearophile wrote:this one seem to be interesting http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup is like i do but use a table than me i used a recursive way. I go to try it :-)bioinfornatics:Thanks i will take a lookI wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd That works for small number but after i got an error about limit recursionInstead of template recursion, have you tried regular code run at compile time? http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious Bye, bearophile
Nov 26 2013
On 2013-11-26 21:00:56 +0000, bioinfornatics said:On Tuesday, 26 November 2013 at 20:50:13 UTC, bioinfornatics wrote:I think you just have a bug in your template code not terminating. At most you should execute 4 times. I think there's a problem with casting down from byte to bool. However, not user if LesserType is what you're after, but this works: template log2(ulong x) { static if( x >> 8 ) { enum log2 = log2!(x >> 8) + 8; } else static if( x >> 1) { enum log2 = log2!(x>>1) + 1; } else { enum log2 = 1; } }On Tuesday, 26 November 2013 at 20:29:00 UTC, bearophile wrote:this one seem to be interesting http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup is like i do but use a table than me i used a recursive way. I go to try it :-)bioinfornatics:Thanks i will take a lookI wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd That works for small number but after i got an error about limit recursionInstead of template recursion, have you tried regular code run at compile time? http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious Bye, bearophile
Nov 26 2013
On Tuesday, 26 November 2013 at 21:18:29 UTC, Shammah Chancellor wrote:On 2013-11-26 21:00:56 +0000, bioinfornatics said:Thanks your way is much easier to write, works fine :-)On Tuesday, 26 November 2013 at 20:50:13 UTC, bioinfornatics wrote:I think you just have a bug in your template code not terminating. At most you should execute 4 times. I think there's a problem with casting down from byte to bool. However, not user if LesserType is what you're after, but this works: template log2(ulong x) { static if( x >> 8 ) { enum log2 = log2!(x >> 8) + 8; } else static if( x >> 1) { enum log2 = log2!(x>>1) + 1; } else { enum log2 = 1; } }On Tuesday, 26 November 2013 at 20:29:00 UTC, bearophile wrote:this one seem to be interesting http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup is like i do but use a table than me i used a recursive way. I go to try it :-)bioinfornatics:Thanks i will take a lookI wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd That works for small number but after i got an error about limit recursionInstead of template recursion, have you tried regular code run at compile time? http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious Bye, bearophile
Nov 26 2013
On 2013-11-26 21:31:55 +0000, bioinfornatics said:On Tuesday, 26 November 2013 at 21:18:29 UTC, Shammah Chancellor wrote:I would suggest turning it into a compile-time-function though as this will instantiate a large number of templates if you use is repetitively. Remember that templates are cached by DMD. int log2(const ulong x) { if( x >> 8 ) { return log2(x >> 8) + 8; } else if( x >> 1) { return log2(x>>1) + 1; } else { return 1; } } void main() { pragma(msg, log2(1UL<<63)); }On 2013-11-26 21:00:56 +0000, bioinfornatics said:Thanks your way is much easier to write, works fine :-)On Tuesday, 26 November 2013 at 20:50:13 UTC, bioinfornatics wrote:I think you just have a bug in your template code not terminating. At most you should execute 4 times. I think there's a problem with casting down from byte to bool. However, not user if LesserType is what you're after, but this works: template log2(ulong x) { static if( x >> 8 ) { enum log2 = log2!(x >> 8) + 8; } else static if( x >> 1) { enum log2 = log2!(x>>1) + 1; } else { enum log2 = 1; } }On Tuesday, 26 November 2013 at 20:29:00 UTC, bearophile wrote:this one seem to be interesting http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup is like i do but use a table than me i used a recursive way. I go to try it :-)bioinfornatics:Thanks i will take a lookI wrote some template to compute at compile time how many bits is need for a number x. http://www.dpaste.dzfl.pl/99a842fd That works for small number but after i got an error about limit recursionInstead of template recursion, have you tried regular code run at compile time? http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious Bye, bearophile
Nov 26 2013
Another one ctfe log2, integer and real versions:
[code]
module util.ctfelog2;
uint ctfe_ilog2(ulong arg) pure {
assert(arg != 0);
uint result = 0;
while(arg >>= 1)
result++;
return result;
}
ulong ctfe_log2(real arg, uint fracBits) pure {
import std.math : sqrt, SQRT2;
uint intPart = ctfe_ilog2(cast(ulong)arg);
ulong result = intPart;
if(fracBits == 0 || arg == (1 << intPart))
return result << fracBits;
real sq = arg / (1 << intPart);
for(uint i = fracBits; i; i--) {
if(sq > 2) {
result |= 1;
sq /= 2;
}
sq *= sq;
result <<= 1;
}
return result;
}
real ctfe_log2(real arg) pure {
return ctfe_log2(arg, 56) / cast(real)(1UL << 56);
}
unittest {
import std.math : log2, abs;
for(real l = 1; l < 256; l += 0.3) {
double d1 = ctfe_log2(l);
double d2 = log2(l);
assert(abs(d1 - d2) < (cast(real)1.0)/(1UL << 48));
}
}
[/code]
Apr 06 2014









Shammah Chancellor <anonymous coward.com> 