World: r3wp
[rebcode] Rebcode discussion
older newer | first last |
BrianH 14-Oct-2005 [239x2] | Carl (or Gabriele), is that formula you gave for LOG-2 the way it is implemented in the LOG-2 native? I thought a binary logarithm would have a more efficient implementation on a binary machine. |
I've been using it to calculate IP subnets and the like. | |
Ladislav 14-Oct-2005 [241] | binary logarithm: you can spare one multiplication, that doesn't look like a big difference |
BrianH 14-Oct-2005 [242] | Remembering the constant could be :( |
Ladislav 14-Oct-2005 [243x2] | I do not understand |
do you mean that it is a problem for you to remember the constant? | |
BrianH 14-Oct-2005 [245x3] | Still, it would surprise me if that is how C has to calculate a binary logarithm. I thought there'd be an instruction or something. Spoiled by CISC processors I suppose. |
Actually, there is a lot of things I have to remember and adding long numeric constants to the list would be a problem. That isn't sufficient justification (to me) to add another opcode. Greater efficiency would be, as would making the log-* set as complete as REBOL's natives are to save on silly questions like mine in the future :) | |
(Another thing to remember: Grammar-check my posts - I can't fix them later) | |
Gabriele 14-Oct-2005 [248x3] | you don't have to remember it... |
log-e 2 | |
>> log-e 2 == 0.693147180559945 | |
BrianH 14-Oct-2005 [251] | See, that solves one problem. |
Gabriele 14-Oct-2005 [252] | log base b (x) = log (x) / log (b) |
BrianH 14-Oct-2005 [253] | I still think the native version would be more efficient than that. Base-2 logs help a lot with binary to decimal conversion (or was it vice-versa?). I may be wrong here though... |
Pekr 14-Oct-2005 [254] | one opcode more or less should not be the difference,no? So why not to add it if found usefull? :-) |
BrianH 14-Oct-2005 [255x3] | Wasn't there a log2 instruction in x86 before the floating-point processor was incorporated onto the main chip? |
Floating point division on x86 is quite slow in comparison to integer operations, sometimes more than 10 times as slow. | |
(depending on the cpu) | |
Pekr 14-Oct-2005 [258] | and log2 does help with it? Just asking - most of the time I dunno what you are talking about here :-) |
Ladislav 14-Oct-2005 [259] | you don't have to use division: (log-2 x) = (log-e x) * (log-2 e) |
BrianH 14-Oct-2005 [260x2] | They used division in their above solution. |
Adding a mul instead of a div isn't such a big deal, in comparison. | |
Ladislav 14-Oct-2005 [262] | I think, that everyone knows, that division by a constant can be replaced multiplication by its reciprocal, which is a constant too :-) |
BrianH 14-Oct-2005 [263] | So your example would be (log-2 x) = (log-e x) * (1 / (log-e 2)) especially since e isn't defined as a constant in REBOL, and log-2 isn't a rebcode opcode so we can't use it here. |
Ladislav 14-Oct-2005 [264x2] | of course you can, just define: log-2e: log-2 e |
log-2e: log-2 exp 1 | |
BrianH 14-Oct-2005 [266] | Ah, exp 1. It has been a while, I had forgotten. |
Ladislav 14-Oct-2005 [267] | actually, it may be of a value to have: e: exp 1 |
BrianH 14-Oct-2005 [268x3] | I suppose those "constants" could be calculated ahead of time and just inserted in the code as local variables. Well, that solves the functionality and memory (mine) problems. Still, it seems like C libraries and such must have a better way of doing this - it seems a bit inefficient. |
On a binary machine, wouldn't log-e and log-10 be implemented on a lower level on top of log-2, instead of the other way around? | |
I'm probably just misunderstanding logarithms. | |
Gabriele 14-Oct-2005 [271] | i don't think there's any way to implement log-2 any faster then log-e |
Ladislav 14-Oct-2005 [272x2] | On a binary machine, wouldn't log-e and log-10 be implemented on a lower level on top of log-2, instead of the other way around? not exactly, it is a kind of a "mix" AFAICT |
see http://en.wikipedia.org/wiki/Natural_logarithm | |
eFishAnt 14-Oct-2005 [274] | log-2 (and 8, 16, etc) should just be bit shifting and "bit-tabling" since 2 is a "natural number" in computers....no "Math" needed...;-) |
Ladislav 14-Oct-2005 [275x3] | only if you want just integer part of the result, though |
otherwise you really need some multiplication | |
(which is a bit shifting etc. too ;-) | |
Pekr 14-Oct-2005 [278] | Do you think anything like following would be possible? (simply trying to get some real-life example usability of rebcode, e.g rewriting some mezzanines). Some time ago, we've got 'remove-each. But initially there was not any such function available ... so I wanted to filter directory listing - it was rather slow in rebol, untill remove-each appeared. I would like to teas rebol level vs native vs rebcode. Could such functionality be achieved in rebcode? I mean - take a block, traverse it, remove each element where last char is #"/"? |
Gabriele 14-Oct-2005 [279x2] | Steve: but you need a loop! so, unless you have that in hardware (and it still doesn't seem doable to me for floating point), log-e will be easier to compute (see wikipedia article) |
petr: PARSE is probably going to be much faster than rebcode for something like that, IMHO. after all, PARSE is a specialized virtual machine. | |
Ladislav 14-Oct-2005 [281x2] | the REMOVE-EACH success is based on a better algorithm. It is possible to implement a pure REBOL mezzanine doing much better than a "dummy approach does" |
...as well as you may be able to implement a C algorithm doing worse than a proper REBOL approach can do | |
Pekr 14-Oct-2005 [283x2] | Gabriele - thanks for the idea with parse and the note about it being a VM of some kind .... now I get it a little bit better :-) |
we currently have insert, copy, do you think 'find would make sense? It is like moving in loop till some char :-) well, could be done in rebcode itself or so it seems :-) | |
Gabriele 14-Oct-2005 [285x2] | apply result find [series value] :-) |
Brian: it's confirmed, BRAW takes a relative offset like BRA. | |
BrianH 14-Oct-2005 [287x2] | Ladislav, looking back on the code I've written in REBOL using logarithms, it turns out that the integer part of log-2 was all I was interested in. Apparently I have just been using it to find out how many bits are needed to hold a particular integer value when I've needed such info. I haven't used logarithms for regular computation since I was in grade school. Oh well, I guess I'm not the target market for the log-* functions. Thanks for the link, it's been interesting reading! |
Gabriele, a relative offset. Darn. That is going to make BRAW a lot more difficult to use for me. What kind of programming tasks are made easier with a relative computed goto? | |
older newer | first last |