【问题标题】:Perl6 log method returns a Num not a RatPerl6 日志方法返回 Num 而不是 Rat
【发布时间】:2017-11-30 02:02:19
【问题描述】:

只是想知道是否有人知道为什么 Perl6 的 log 函数返回 Num 类型而不是 Rat 类型。

say (e*e).log.WHAT;
> (Num)
say (2/3).WHAT;
> (Rat)

【问题讨论】:

  • P6 在上面没有做符号数学。 e 是一个无理数Nums 是双浮点数。 Rats 是理性的。我不确定这是有用的信息,但它很短。 :)

标签: raku


【解决方案1】:

在数学中,Log 是一个连续函数,因此它具有数学上的实数值。 Num 类型描述 Perl 6 中的数学实数。Rat 类型描述数学有理数。

【讨论】:

  • Num 是一个浮点数。 Real 角色更好地代表了数学上的真实值。 IntRatNum 都扮演 Real 角色。 Numeric 角色封装了 Real 所做的所有类型,并添加了 Complex 数字类型。
【解决方案2】:

这是因为还没有人完成让它做其他事情的工作。这是语言可以处理的情况(不是 Perl 6 特有的),但也是您可能不希望它处理的情况。

没有代表自然基础e 的对象并保持它,直到它不能再存在(就像Rats 不会变成Nums,除非他们必须这样做)。这是可能的,也可以让我们决定如何对待它。也许我们想要一个Rat,或FatRat,甚至是Num 中的某个小数位。但它并没有这样做。

e 并不是特别的。它也不适用于 10 的幂:

> 100.log10
2
> 100.log10.^name
Num

.log10 后面的代码可以检查操作数是否为 10 的幂,并在这种情况下决定返回 Int。但是它必须检查每个数字,并且大多数数字不是 10 的幂。检查所有这些会减慢这个过程。让它有点“不正确”更容易。

但是你可以使用.narrow 来获得一个更受约束的类型:

> 100.log10.narrow.^name
Int

这与要求特定类型并可能获得不同的数字不同:

> (10/3).Int
3
> (10/3).narrow.^name
Rat

为了好玩:

 > i*i
-1+0i
 > (i*i).^name
 Complex
 > (i*i).narrow.^name
 Int

【讨论】:

    【解决方案3】:

    Perl6 不是计算机代数系统,所以它对待 e*e 就像对待任何其他 Num 一样 - 一旦你得到一个浮点数,只有像舍入这样的显式操作才能将类型更改为类似 @987654323 @或Rat:计算机无法知道(e*e).log的返回值2e0究竟是代表2,还是一些2+ε

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多