8

I am working with latitudes and longitudes to determine business locations and ran into some odd behavior.

In the Perl snippet below, the equation assigning data to $v1 evaluates to 1. When I call acos($v1), I receive a sqrt error. When I call acos("$v1") (with quotes), I do not. Calling acos(1) does not produce the error, either. Why do the quotes matter?

use strict;
use warnings 'all';

sub acos {
    my $rad = shift;
    return (atan2(sqrt(1 - $rad**2), $rad));
}

my $v1 = (0.520371764072297 * 0.520371764072297) +
         (0.853939826425894 * 0.853939826425894 * 1);

print acos($v1);   # Can't take sqrt of -8.88178e-16 at foo line 8.
print acos("$v1"); # 0
ThisSuitIsBlackNot
  • 23,492
  • 9
  • 63
  • 110
x2m
  • 91
  • 2

1 Answers1

15

$v1 is not exactly 1:

$ perl -e'
    $v1 = (0.520371764072297 * 0.520371764072297) +
          (0.853939826425894 * 0.853939826425894 * 1);
    printf "%.16f\n", $v1
'
1.0000000000000004

However, when you stringify it, Perl only keeps 15 digits of precision:

$ perl -MDevel::Peek -e'
    $v1 = (0.520371764072297 * 0.520371764072297) +
          (0.853939826425894 * 0.853939826425894 * 1);
    Dump "$v1"
'
SV = PV(0x2345090) at 0x235a738
  REFCNT = 1
  FLAGS = (PADTMP,POK,pPOK)
  PV = 0x2353980 "1"\0      # string value is exactly 1
  CUR = 1
  LEN = 16
Community
  • 1
  • 1
ThisSuitIsBlackNot
  • 23,492
  • 9
  • 63
  • 110
  • Nice resource, thank you. I searched and couldn't locate it in docs. – zdim Dec 29 '16 at 20:02
  • Thank you for your comments [here](http://stackoverflow.com/questions/41400902/why-does-foo-bar-autovivify-but-foo-doesnt). This is your bounty as I promise ;-) – Eugen Konkov Jan 09 '17 at 14:53