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

为什么Powershell认为log2(1/2)等于log2(1/2)*3?,powershell,syntax,Powershell,Syntax,给定一个函数: 函数log2{param[double]$x[Math]::Log$x/[Math]::log2} 预期:log245/120*2被解释为log245/120*2,收益率-2.83007499856 实际值:log245/120*2等于log245/120,收益率为-141503749927884 为什么呢 对我来说,log21/2*3-eq log21/2为真没有意义 如果使用PowerShell命令语法而不是函数语法,则这是有意义的。即log2x与log2x相同。要将表达式

给定一个函数: 函数log2{param[double]$x[Math]::Log$x/[Math]::log2}

预期:log245/120*2被解释为log245/120*2,收益率-2.83007499856

实际值:log245/120*2等于log245/120,收益率为-141503749927884 为什么呢

对我来说,log21/2*3-eq log21/2为真没有意义


如果使用PowerShell命令语法而不是函数语法,则这是有意义的。即log2x与log2x相同。要将表达式指定为参数,必须在其周围加括号

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

与你打电话的原因相同:

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

所以有三个不同的参数,它根本没有将*识别为运算符。

它说45/120是什么?这不是一个bug,您只是误解了powershell的命令语法。对log2的原始调用必须嵌套在一个子表达式中:log2 45/120*3。请参阅获取有关投票结束的人员的帮助:这是如何脱离主题的?我想不出更多关于PowerShell语法的主题问题了。有人能解释一下这行是如何解析的吗这就是这个问题-怎么会偏离主题?