2016-12-29 10 views
8

Pracuję na szerokościach i długościach geograficznych w celu określenia lokalizacji biznesowych i popadłem w dziwne zachowania.Dlaczego uzyskuję inny wynik, gdy wykonuję obliczenia matematyczne na cytowanej lub niecedowanej zmiennej?

W poniższym fragmencie kodu Perl przypisywanie danych do $v1 następuje do 1. Po wywołaniu acos($v1) pojawia się błąd sqrt. Kiedy dzwonię pod numer acos("$v1") (z cudzysłowami), nie robię tego. Wywołanie acos(1) również nie powoduje wystąpienia błędu. Dlaczego cytaty mają znaczenie?

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 
+0

pokrewne: [Bug # 127182 dla perl5: Jedna cyfra krótki, aby prawidłowo stringify podwójne] (https://rt.perl.org/Public/Bug/Display.html?id=127182) – ThisSuitIsBlackNot

+0

Zobacz także [Dlaczego Perl jest niezgodny z zaokrąglaniem sprintf?] (http://stackoverflow.com/q/ 41312890/2173773) –

Odpowiedz

15

$v1 nie jest dokładnie 1:

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

Jednak kiedy go stringify, 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 
+0

dobre dane. dzięki. – x2m

+0

Przyjemny zasób, dziękuję. Szukałem i nie mogłem zlokalizować tego w dokumentach. – zdim

+0

Dziękuję za twoje komentarze [tutaj] (http://stackoverflow.com/questions/41400902/why-does-foo-bar-autovivify-but-foo-doesnt). To jest twoja nagroda, jak obiecuję ;-) –

Powiązane problemy