Re: Ask for recommended module for precise number
- From: "harryfmudd [AT] comcast [DOT] net" <"harryfmudd [AT] comcast [DOT] net">
- Date: Wed, 25 Jan 2006 09:51:20 -0500
Tom wrote:
Sorry, I should call you "Tom"...........
No problem. Harry Mudd is a quasi-alias (quasi- because I always sign my real name), and a character from the original Star Trek. It was intended to be thrown away when it started collecting too much spam, but so far I haven't done that. Though I'm tempted daily.
Tom wrote:
Hi Harry,
Thanks for you help. It was really my misunderstanding before. I write another program which simulate my typical application: calculating posterior from prior and likelihood, which are very small number.
================================================================ use strict;
use Math::BigFloat; use Carp;
my $x = new Math::BigFloat(0.1); my $y = new Math::BigFloat(0.1); my $num = 100;
foreach my $i (0..$num) { $x = $x * 0.1; } foreach my $j (0..$num-1) { $y = $y * 0.1; }
my $z = $x/$y;
printf "z: %.5f\n", $z; ================================================================ Now, the z is "0.1". It fits my usage as those small numbers are only stored internally. :)
For the printf() issue, it seems to be inconsistency between the string and the printf() function. I have tried the following tiny program:
================================================================ use strict; use Carp;
my $i = 0; while (1) { my $zeroString = join('', map { "0" } (1..$i)); my $numString = sprintf("0.%s1", $zeroString); eval { printf "%d: %.5f\n", $i, $numString; }; confess ($@) if ($@);
# confess (qq{Convert to "0" at $i-th iterations.\n}) if ($numString == 0);
$i++; } ================================================================ With the "commented" statement, the program always output "0.00000" without error (the program was terminated at 9xxx-th iterations).
With the "commented" statement, the program converts to "0" at around 300 iterations. (it means the Math::BigFloat case is not reproductable at normal PERL operations?)
Tom
[snip! /]
I think we can conclude that printf is simply not going to work right with Math::BigFloat numbers.
The bottom line is that Math::BigFloat is _almost_ magic. I have not used it much, but I get the impression that as long as you're so-called "pure Perl" you're OK. That is, if you write a script using BigFloat, and don't invoke any functions that you didn't write in Perl, you're fine. If you invoke built-ins (for example, log (), sin (), and so forth) or libraries that do "C" call-outs, you don't get arbitrary precision. At least, that's my explanation for printf's behaviour.
Even if Math::BigFloat were fully magic and worked for the built-ins, transcendental functions like log () and sin () would still be unusable, because the calculation would never terminate.
If you read the Math::BigFloat docs, you will find methods to "take apart" BigFloat numbers, and I suppose you (or someone) could write arbitrary-precision functions to replace the built-ins. Precision of transcendental functions would have to be specified "up front" in some way, to prevent atan2 (1, 0) from trying to compute the last digit of pi.
Whether this has been done I don't know. I personally would hesitate to do it because I don't need it, and therefore it would be inadequately tested.
If I could change the subject briefly, I'd like to make a couple comments on Perl style:
* You don't need to "use Carp" and then "confess" unless you're interested in a full call stack trace. The "die" command also terminates your program with a message. If the message does not end in "\n", Perl appends the line number of the "die".
* For a string of $i zeros, you can say '0' x $i instead of using join (), and I think you'll find it is more efficient.
* Similarly, for large numbers of iterations, "for (i = 0; i < $num; $i++)" would be preferred to "foreach $i (0 .. $num)", because the "0 .. $num" actually builds a list of all the numbers, which might be a bad thing if $num were something like 1e9.
Tom Wyant .
- Follow-Ups:
- Re: Ask for recommended module for precise number
- From: Dr.Ruud
- Re: Ask for recommended module for precise number
- From: Tom
- Re: Ask for recommended module for precise number
- From: Paul Lalli
- Re: Ask for recommended module for precise number
- References:
- Ask for recommended module for precise number
- From: Tom
- Re: Ask for recommended module for precise number
- From: Sisyphus
- Re: Ask for recommended module for precise number
- From: Tom
- Re: Ask for recommended module for precise number
- From: harryfmudd [AT] comcast [DOT] net
- Re: Ask for recommended module for precise number
- From: Tom
- Re: Ask for recommended module for precise number
- From: Tom
- Ask for recommended module for precise number
- Prev by Date: Re: Ask for recommended module for precise number
- Next by Date: Re: Ask for recommended module for precise number
- Previous by thread: Re: Ask for recommended module for precise number
- Next by thread: Re: Ask for recommended module for precise number
- Index(es):
Relevant Pages
|
|