【问题标题】:Why do I get a different result when I do math on a quoted vs. non-quoted variable?当我对引用变量和未引用变量进行数学运算时,为什么会得到不同的结果?
【发布时间】:2016-12-29 18:43:51
【问题描述】:

我正在使用纬度和经度来确定营业地点,但遇到了一些奇怪的行为。

在下面的 Perl sn-p 中,将数据分配给 $v1 的等式计算结果为 1。当我调用 acos($v1) 时,我收到 sqrt 错误。当我打电话给acos("$v1")(带引号)时,我没有。调用acos(1) 也不会产生错误。为什么引号很重要?

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

【问题讨论】:

标签: perl


【解决方案1】:

$v1 不完全是 1:

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

但是,当您将其字符串化时,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

【讨论】:

  • 很好的资源,谢谢。我搜索并在文档中找不到它。
  • 感谢您的 cmets here。正如我保证的那样,这是你的赏金 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多