On Thu, Nov 15, 2018 at 1:49 AM Tetsuo Handa <
penguin-ker...@i-love.sakura.ne.jp> wrote:

> 32bits userspace on 64bits kernel:
> # truncate -s 9223372036854775807 test
> # perl -e 'use File::stat; my $sb = lstat("test"); printf("%s\n",
$sb->size);'
> 9.22337203685478e+18
> # perl -e 'use File::stat; my $sb = lstat("test"); printf("%u\n",
$sb->size);'
> 4294967295

Note that "%s" is providing an inaccurate (rounded) result.
Doing :

"%s\n", $sb->size

will provide correct results if the file size is less than or equal
to 1e+15 bytes but, for larger sizes, the value that is output is subject
to rounding.

Doing :

 "%.15e\n", $sb->size

provides an improvement on "%s" in that, for files up to
9.007199254740992e+015 bytes, it will provide a correct figure:

If you're encountering files larger than 9.007199254740992e+015 bytes, the
best solution is to simply build perl with -Duse64bitint, though building
with -Duselongdouble would probably also address this issue by providing a
64-bit precision NV.
I do, of course, understand that such solutions might be inapplicable
regarding your situation.

Are you actually encountering files larger than 1e15 bytes ?
If not, then either:

printf("%s\n", $sb->size);
  or
printf("%.15e\n", $sb->size;
  or
print $sb->size;

should be fine.


Cheers,
Rob

Reply via email to