为什么Powershell认为log2(1/2)等于log2(1/2)* 3?

时间:2017-12-19 23:43:50

标签: powershell syntax

给定一个功能: function log2 {param ([double]$x) [Math]::Log($x) / [Math]::Log(2) }

预期:log2(45/120) * 2被解释为(log2(45/120)) * 2并产生-2.83007499856

实际:log2(45/120) * 2等于log2(45/120)并产生-1,41503749927884 那是为什么?

对我而言,(log2(1/2) * 3) -eq (log2(1/2))屈服于True没有任何意义。

Uservoice

2 个答案:

答案 0 :(得分:1)

出于同样的原因,你打电话:

Get-ChildItem -Path C:\Windows -File

而不是:

Get-ChildItem(-Path, C:\Windows, -File)

请记住,相同的命令行解析器必须处理所有内容。

仅仅因为你有一个命名参数并不意味着标准解析停止工作。

让我们检查你的命令。

log2(45/120) * 2

这会调用函数log2。第一个参数是(45/120)。第二个参数是'*',第三个参数是2。第一个参数将分配给命名参数$x。第二个参数是未命名的,因此它被分配给$args[0]。第三个参数也是未命名的,因此它被分配给$args[1]

试试这个:

function log2 {param ([double]$x) [Math]::Log($x) / [Math]::Log(2); $args }

log2(45/120) * 2

您的输出将是:

-1.41503749927884
*
2

让我们试试这个功能:

function Get-ArgumentType { $args | Select-Object @{n='Argument';e={$_}},@{n='Type';e={$_.GetType().FullName}} }

Get-ArgumentType (45/120) * 2

输出结果为:

Argument Type
-------- ----
   0.375 System.Double
       * System.String
       2 System.Int32

所以有三个不同的论点,它根本不认可*作为运算符。

答案 1 :(得分:0)

如果您使用PowerShell命令语法而不是函数语法,这是有意义的。即log2(x)log2 x相同。要将表达式指定为参数,必须在其周围放置括号。

(log2 45)
(log2 (45/120))
(log2 (45/120)) * 2