Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Module for file size arithmetic

by Marshall (Canon)
on Mar 12, 2009 at 11:54 UTC ( [id://750134]=note: print w/replies, xml ) Need Help??


in reply to Module for file size arithmetic

I would say first of all that your idea of 1 Gb is probably wrong? I presume that you meant 1 GB. The little b means bit, but capital B means byte.

Oooh, this is really complex when dealing with hard disk or memory sizes. One Kilo Byte to an engineer is 1024 bytes. To a marketing guy one KB is 1,000. They do this so that the numbers look bigger!

In "C", I would just use 64 bit int's (or unsigned 64 bit ints) for the vars which use the actual number of bytes for math operations.

So one question that I don't know: can a perl var be assigned to 64 bit precision? If so, then this becomes easier as scaling factors aren't needed. If not then we can do this with 32 bit math.

Replies are listed 'Best First'.
Re^2: Module for file size arithmetic
by mirod (Canon) on Mar 12, 2009 at 12:31 UTC

    You're right about the B/b, the original data is in KB/MB/GB (it's awstats data).

    Beyond that, I don't really care about precision. Actually I _really_ don't care about precision, I just want to aggregate results from several sites, and get a ballpark figure, in a readable form, so with 1 or 2 digit precision. So the 1024/1000 thingie is really not a problem in that case (awstats uses 1024, like a good citizen BTW).

    It's not that complicated to do it myself, I guess I just expected CPAN to provide it.

      WOW! We've got some "industrial strength" stuff in other posts! I just hacked out something fairly "stupid" that does "MB math". So this is the "dumb" version!
      #!usr/bin/perl -w use strict; my %scale= (MB => 1, GB => 1000, KB => 0.001); sub scale2MB { my $string = shift; $string =~ tr/a-z/A-Z/; if ($string =~ /^[\d.]+$/){return $string}; my ($num,$suffix) = ($string =~ /^([\d.]+)\s*(\w+)/); return ($num * $scale{$suffix}); } foreach ("10", "10.5", "10 GB", "1kb", "10.1 GB") { print "$_=",scale2MB($_),"\n"; } my $val = scale2MB("753mb") + scale2MB("50 kb"); print "753MB+50KB is: $val\n"; __END__ prints 10=10 10.5=10.5 10 GB=10000 1kb=0.001 10.1 GB=10100 753MB+50KB is: 753.05

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://750134]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2024-04-25 09:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found