Mailing List Archive: 49091 messages

# Arithmetic precision

### [1/6] from: sanghabum:aol at: 2-Feb-2001 4:50

Is there any way in Rebol that I can extend the number of significant digits when doing arithmetic? I'm trying (as a Rebol-learning exercise) to convert some old Rexx code. In Rexx, the problem is trivial: <rexx program:> /* rexx */ a = 1000000001 b = 71 say " default=" a / b numeric digits 25 say " 25 digit=" a / b numeric digits 250 say "250 digit=" a / b </rexx program> <result> default= 14084507.1 25 digit= 14084507.05633802816901408 250 digit14084507.056338028169014084507042253521126760563380281690140845070422535211267 605633802816901408450704225352112676056338028169014084507042253521126760563380 281690140845070422535211267605633802816901408450704225352112676056338028169014 08450704225352113 </result> Thanks, Colin.

### [2/6] from: gmassar::dreamsoft::com at: 2-Feb-2001 10:20

Colin, Arithmetic precision in REBOL is only 64 bits long including the exponent for a decimal! value according to some IEEE standard. I think REXX relies heavily on so called Math of numbers. For instance, most of divisions have some repetition in the decimal part. E.g., in your case, 1000000001 / 71 = 14084507.05633802816901408450704225352112676' The quote mark at the end indicates the repetition. REBOL code below will produce the precision as long as 250 digits.
>> S: "14084507." >> R: "05633802816901408450704225352112676" >> loop 7 [S: join S R] print S
Actually, it is 253 digits long. Compare the result against REXX result below. That's all I can help you. I majored Math some 35 years ago and I hardly remembered what I learned. Geo ... [Sanghabum--aol--com] wrote:

### [3/6] from: sanghabum:aol at: 3-Feb-2001 6:09

In a message dated 02/02/2001 18:32:44 GMT Standard Time, [gmassar--dreamsoft--com] writes:
> Arithmetic precision in REBOL is only 64 bits long including the exponent > for a decimal! value according to some IEEE standard. I think REXX relies > heavily on so called Math of numbers. For instance, most of divisions have > some repetition in the decimal part. E.g., in your case, <snip>
Thanks for the response. Rexx does all it's arithmetic long hand on strings, much the same way we learnt at school. Which gives it 10.01 out of 10.01 for precision, but minus several dozen for speed. Not a language you'd want to write a spreadsheet in, unless your users were very patient I thought I'd try thinking more like a Rebol than a Royalist (would that be an old Rexx supporter?) and try to recast my code using tuples. After all, at first glance, they seem to offer structured digit strings of arbitrary length. Unfortunately not. They only have a maximum of 10 parts, and each part must be less that 256. These limitations seem arbitrary and bizarre. Am I missing some awesome subtly of the language? (It wouldn't be the first time). In the meantime, I'll keep puzzling over how to get an exact result from something like: a: 123456789.123456789 - 123456789

### [4/6] from: al:bri:xtra at: 4-Feb-2001 11:35

[Sanghabum--aol--com] wrote:
> These limitations seem arbitrary and bizarre. Am I missing some awesome
subtly of the language? (It wouldn't be the first time). No one has written an arbitrary precision package for Rebol yet. Request it by sending an email with the details to [feedback--rebol--com]. Andrew Martin ICQ: 26227169 http://members.nbci.com/AndrewMartin/

### [5/6] from: gjones05:mail:orion at: 3-Feb-2001 18:40

Hi, Colin, Colin wrote:
> Is there any way in Rebol that I can extend the number of significant
digits
> when doing arithmetic?
... Andrew's email reminded me that I had started this message this morning, then left it unfinished. Geo pointed out a mathematical principle I had long since forgotten (thanks, Geo, for "reminding" me that I must suffer from Alzheimer's or Mad Cow disease, or both! ;-). Outside of doing higher precision math with strings, there are single purpose tricks for specific problems. You may already know this and are simply trying to make a point, for which I will apologize in advance. For the first example question, using the two original numbers 1000000001 and 71, the whole number portion can be obtained from division. Then obtain the fractional portion by starting with the remainder function (or //). Divide this "remainder" by 71. This then represents the fraction portion and allows more degrees of significance. Hardly very satisfying, I know. Only a more general purpose unit would really address the issue. Out of curiosity, I checked out vbscript and it gave 14084507.056338, the same level as REBOL. Then I checked Tcl set at it's default precision level of 12 giving 14084507.0563. Then I set Tcl to its maximum of 17, and received 14084507.056338029. These scripting languages seem to give similar, disappointing results if one is looking for high precision math. Next I checked out the equation 123456789.123456789 - 123456789. VBScript: 0.123456791043282. Tcl(set to its max): 0.12345679104328156. Again, I think REBOL hits in the same ballpark. I guess if one can really measure a phenomenon to a degree of precision that then the math warrants a high precision package, then none of these pre-baked scripting languages are going to do the trick. I suspect that the same prinicple is true with most languages, which generally require add-on units to attack these sorts of problems. Rexx seems special in this regard, but I know little about. Outside of decreased speed in mathematical functions, I guess using a string datatype can prove to be more of a hindrance in other areas. Well, as always, this information and 35 cents may buy you a phone call, if you are lucky. Good luck in the search for higher precision! -Scott

### [6/6] from: g:santilli:tiscalinet:it at: 4-Feb-2001 13:36

Hello [Sanghabum--aol--com]! On 03-Feb-01, you wrote: [tuples] S> Unfortunately not. They only have a maximum of 10 parts, and S> each part must be less that 256. S> These limitations seem arbitrary and bizarre. Am I missing S> some awesome subtly of the language? (It wouldn't be the first S> time). They're used for IP addresses and colors, or anything similar. If you need a generic "array of integers" you can use a block of integers (integer! is 32 bit); or you can use strings as Rexx does. Regards, Gabriele. -- Gabriele Santilli <[giesse--writeme--com]> - Amigan - REBOL programmer Amiga Group Italia sez. L'Aquila -- http://www.amyresource.it/AGI/